1,总是会得到一些奇奇怪怪的要求,求一个面对象的外接最小面积的矩形,和ArcToolBox中的Mininum Bounding Geometry功能下的RECTANGLE_BY_AREA想似。具体看下图:
区别如上图所示:IEnvelope 得到的是下图所示,需要的是第一种
(只是记录一下,可以解决问题,但不是最优方法,代码冗余量大,待解决)20200312已更新
基本思路(旧):获取所有边,以其中的某一条边入手,遍历所有点到这条边的距离,取最大距离的点(pointA),以此点为准画一条平行于第一条线的线,作为第二条边,再以此点(pointA)画一条垂直于第一条边的线作为辅助线,再次遍历所有点到此辅助线的距离,得到最大距离的点(pointB),以pointB画一条垂直第一条边的线作为第三条边,再次遍历所有点到第三条边的距离,取得最大距离的点pointC,以pointC画一条垂直第一条边的线,作为第四条边。然后相邻两条线求交点,得到四个点,用四个点构造矩形。计算面积,以此,将所有的矩形都得到然后,比较面积求最小的就好了,好鸡儿啰嗦我。
更改:旧方法遍历第一次边的时候,后续的操作即为计算该polygon以 各个边为基准的Envelope,后续操作可谓傻瓜至极。新操作看代码不多BB
private IGeometry MinAreaGeometry(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<IEnvelope> pGeos = new List<IEnvelope>(); List<double> listangle = new List<double>(); for (int i = 0; i < pSegments.SegmentCount; i++) { ISegment pSegment = pSegments.get_Segment(i); ILine pLine = new LineClass() { FromPoint = pSegment.FromPoint, ToPoint = pSegment.ToPoint }; pTran.Rotate(pPointCent, pLine.Angle * -1); pIndex.Add((pGeometry.Envelope as IArea).Area); pGeos.Add(pGeometry.Envelope); listangle.Add(pLine.Angle); pTran.Rotate(pPointCent, pLine.Angle); } IEnvelope pEnvRe = pGeos[pIndex.IndexOf(pIndex.Min())]; IPointCollection pPoints = new MultipointClass(); pPoints.AddPoint(pEnvRe.UpperLeft); pPoints.AddPoint(pEnvRe.UpperRight); pPoints.AddPoint(pEnvRe.LowerRight); pPoints.AddPoint(pEnvRe.LowerLeft); IGeometry pGeoEnvMin = ConstructPolygon(pPoints); ITransform2D pTranEnv = pGeoEnvMin as ITransform2D; pTranEnv.Rotate(pPointCent, listangle[pIndex.IndexOf(pIndex.Min())]); return pGeoEnvMin; }
可复制粘贴直接使用。
分类:
ArcEngine开发
分类: ArcEngine开发
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下