AreEngine 求最小面積的外接矩形,非IEnvelope,表達不清楚了


 

 

1,總是會得到一些奇奇怪怪的要求,求一個面對象的外接最小面積的矩形,和ArcToolBox中的Mininum Bounding Geometry功能下的RECTANGLE_BY_AREA想似。具體看下圖:

 

區別如上圖所示:IEnvelope 得到的是下圖所示,需要的是第一種

(只是記錄一下,可以解決問題,但不是最優方法,代碼冗余量大,待解決)20200312已更新

基本思路():獲取所有邊,以其中的某一條邊入手,遍歷所有點到這條邊的距離,取最大距離的點(pointA),以此點為准畫一條平行於第一條線的線,作為第二條邊,再以此點(pointA)畫一條垂直於第一條邊的線作為輔助線,再次遍歷所有點到此輔助線的距離,得到最大距離的點(pointB),以pointB畫一條垂直第一條邊的線作為第三條邊,再次遍歷所有點到第三條邊的距離,取得最大距離的點pointC,以pointC畫一條垂直第一條邊的線,作為第四條邊。然后相鄰兩條線求交點,得到四個點,用四個點構造矩形。計算面積,以此,將所有的矩形都得到然后,比較面積求最小的就好了,好雞兒啰嗦我。

更改:舊方法遍歷第一次邊的時候,后續的操作即為計算該polygon以 各個邊為基准的Envelope,后續操作可謂傻瓜至極。新操作看代碼不多BB

private IGeometry MinArea(IPolygon pPolygon)
        {
            ITopologicalOperator pTopo = pPolygon as ITopologicalOperator;
            IGeometry pGeometry = pTopo.ConvexHull();
            IPoint pPointCent = (pGeometry as IArea).Centroid;

            ITransform2D pTran = pGeometry as ITransform2D;
            ISegmentCollection pSegments = pGeometry as ISegmentCollection;
            List<double> pIndex = new List<double>();
            List<IGeometry> pGeos = new List<IGeometry>();
            for (int i = 0; i < pSegments.SegmentCount; i++)
            {
                ISegment pSegment = pSegments.get_Segment(i);
                ILine pLine = new LineClass() { FromPoint = pSegment.FromPoint, ToPoint = pSegment.ToPoint };
                axMapControl1.FlashShape(pLine.FromPoint);
                pTran.Rotate(pPointCent, pLine.Angle * -1);
                pIndex.Add((pGeometry.Envelope as IArea).Area);
                pGeos.Add(pGeometry.Envelope);
                pTran.Rotate(pPointCent, pLine.Angle);
            }
            IGeometry pGeoRe = pGeos[pIndex.IndexOf(pIndex.Min())];
            return pGeoRe;
        }

可復制粘貼直接使用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM