Пример #1
0
        /// <summary>
        /// 指示指定复合折线是否部分或完全位于指定矩形盒内
        /// </summary>
        /// <param name="multipolyline"></param>
        /// <param name="box"></param>
        /// <returns></returns>
        public static bool IsMultiPolylinePartiallyWithinBox(moMultiPolyline multipolyline, moRectangle box)
        {
            //思路:先判断矩形盒是否相交,如是,按如下顺序,满足任何一个条件,则返回True
            //(1)复合折线任何一个点位于矩形盒内;
            //(2)矩形盒与复合折线有交点
            moRectangle sBox = multipolyline.GetEnvelope();

            if (AreBoxesCross(sBox, box) == false)
            {
                return(false);
            }
            //(1)复合折线任何一个点位于矩形盒内;
            Int32 sPartCount = multipolyline.Parts.Count;

            for (Int32 i = 0; i <= sPartCount - 1; i++)
            {
                Int32 sPointCount = multipolyline.Parts.GetItem(i).Count;
                for (Int32 j = 0; j <= sPointCount - 1; j++)
                {
                    moPoint sCurPoint = multipolyline.Parts.GetItem(i).GetItem(j);
                    if (IsPointWithinBox(sCurPoint, box) == true)
                    {
                        return(true);
                    }
                }
            }
            //(2)矩形盒与复合折线有交点
            for (Int32 i = 0; i <= sPartCount - 1; i++)
            {
                moPoints sPoints     = multipolyline.Parts.GetItem(i);
                Int32    sPointCount = sPoints.Count;
                for (Int32 j = 0; j <= sPointCount - 2; j++)
                {
                    if (IsSegmentCrossBox(sPoints.GetItem(j), sPoints.GetItem(j + 1), box) == true)
                    {
                        return(true);
                    }
                }
            }
            //(3)都不满足,返回false
            return(false);
        }
Пример #2
0
        /// <summary>
        /// 获取外包矩形
        /// </summary>
        /// <returns></returns>
        public moRectangle GetEnvelope()
        {
            moRectangle sRect = null;

            if (_ShapeType == moGeometryTypeConstant.Point)
            {
                moPoint sPoint = (moPoint)_Geometry;
                sRect = new moRectangle(sPoint.X, sPoint.X, sPoint.Y, sPoint.Y);
            }
            else if (_ShapeType == moGeometryTypeConstant.MultiPolyline)
            {
                moMultiPolyline sMultiPolyline = (moMultiPolyline)_Geometry;
                sRect = sMultiPolyline.GetEnvelope();
            }
            else
            {
                moMultiPolygon sMultiPolygon = (moMultiPolygon)_Geometry;
                sRect = sMultiPolygon.GetEnvelope();
            }
            return(sRect);
        }