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; }
可復制粘貼直接使用。