• AreEngine 求最小面积的外接矩形,非IEnvelope,表达不清楚了


    来自:https://www.cnblogs.com/clgis/p/9831915.html

    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;
            }
    复制代码

    可复制粘贴直接使用。

  • 相关阅读:
    SXOI2016 部分解题报告
    两道FFT的应用题
    [CQOI2012]交换棋子【网络流】【费用流】
    JAVA-SDK-Excel4j使用遇见的问题
    解决Zookeeper出现Error: Could not find or load main class org.apache.zookeeper.server.quorum.QuorumPeerMain问题
    maven项目打包时jar中不包含依赖
    CentOS_7中的zookeeper安装
    SpringBoot集成Redis出现WRONGTYPE Operation against a key holding the wrong kind of value错误
    主机访问虚拟机中Redis
    使用SpringS声明式的开启事务
  • 原文地址:https://www.cnblogs.com/gisoracle/p/16598330.html
Copyright © 2020-2023  润新知