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;
}

可复制粘贴直接使用。

AreEngine 求最小面积的外接矩形,非IEnvelope,表达不清楚了的更多相关文章

  1. LeetCode939 最小面积矩形

    LeetCode939最小面积矩形 给定在 xy 平面上的一组点,确定由这些点组成的矩形的最小面积,其中矩形的边平行于 x 轴和 y 轴. 如果没有任何矩形,就返回 0. Input [[1,1],[ ...

  2. Leetcode963. Minimum Area Rectangle II最小面积矩形2

    给定在 xy 平面上的一组点,确定由这些点组成的任何矩形的最小面积,其中矩形的边不一定平行于 x 轴和 y 轴. 如果没有任何矩形,就返回 0. 示例 1: 输入:[[1,2],[2,1],[1,0] ...

  3. [Swift]LeetCode939. 最小面积矩形 | Minimum Area Rectangle

    Given a set of points in the xy-plane, determine the minimum area of a rectangle formed from these p ...

  4. [Swift]LeetCode963. 最小面积矩形 II | Minimum Area Rectangle II

    Given a set of points in the xy-plane, determine the minimum area of any rectangle formed from these ...

  5. hdu4709求三角形面积

    Herding Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  6. BZOJ 1185: [HNOI2007]最小矩形覆盖-旋转卡壳法求点集最小外接矩形(面积)并输出四个顶点坐标-备忘板子

    来源:旋转卡壳法求点集最小外接矩形(面积)并输出四个顶点坐标 BZOJ又崩了,直接贴一下人家的代码. 代码: #include"stdio.h" #include"str ...

  7. TZOJ 2392 Bounding box(正n边形三点求最小矩形覆盖面积)

    描述 The Archeologists of the Current Millenium (ACM) now and then discover ancient artifacts located ...

  8. [hdu5251]矩形面积 旋转卡壳求最小矩形覆盖

    旋转卡壳求最小矩形覆盖的模板题. 因为最小矩形必定与凸包的一条边平行,则枚举凸包的边,通过旋转卡壳的思想去找到其他3个点,构成矩形,求出最小面积即可. #include<cstdio> # ...

  9. UVA10173 Smallest Bounding Rectangle 最小面积矩形覆盖

    \(\color{#0066ff}{题目描述}\) 给定n(>0)二维点的笛卡尔坐标,编写一个程序,计算其最小边界矩形的面积(包含所有给定点的最小矩形). 输入文件可以包含多个测试样例.每个测试 ...

  10. Opencv绘制最小外接矩形、最小外接圆

    Opencv中求点集的最小外结矩使用方法minAreaRect,求点集的最小外接圆使用方法minEnclosingCircle. minAreaRect方法原型: RotatedRect minAre ...

随机推荐

  1. mybatis自增主键的获取

    实体类 package org.example.entity; public class User { private Integer id; private String name; private ...

  2. 多个el-table在使用v-if在同一页面切换渲染时相互影响的解决办法

    解决办法 给每个el-table设置一个唯一的key值,如: <el-table key='uniqueName' ></el-table> <el-table key= ...

  3. Mysql数据库基础第二章:(六)连接查询

    Mysql数据库基础系列 软件下载地址 提取码:7v7u 数据下载地址 提取码:e6p9 mysql数据库基础第一章:(一)数据库基本概念 mysql数据库基础第一章:(二)mysql环境搭建 mys ...

  4. vue _DAY1

    一.VUE概念? Vue.js  (打包工具Webpack) Vue.js 是最流行的前端框架(可以用于手机App开发,借助Weex) Vue.js 和 Angeular.React.js(React ...

  5. Python3之并发(五)---线程条件(Condition)和事件(Event)

    一.线程条件Condition(条件变量) 依赖锁对象(Lock,RLock),锁对象可以通过参数传入获得,或者使用自动创建的默认锁对象当多个条件变量需要共享同一个锁时,建议传入锁对象 除了带有获取到 ...

  6. react 学习笔记更新2.0

    1.性能优化 1.shouldComponentUpdate 在render调用之前会调用shouldComponentUpdate,不建议在 shouldComponentUpdate() 中进行深 ...

  7. spark项目技术点整理

    spark项目技术点整理 1.性能调优: 1>分配更多的资源:性能调优的王道就是分配和增加更多的资源.写完一个spark作业后第一个要是调节最优的资源配置,能够分配的资源达到你的能力范围的顶端后 ...

  8. HCIA-ICT实战基础10-广域网技术PPP

    HCIA-ICT实战基础-广域网技术PPP 目录 早期广域网技术概述 PPP协议原理与配置 1 早期广域网技术概述 1.1 什么是广域网 广域网是连接不同地区局域网的网络, 通常所覆盖的范围从几十公里 ...

  9. 【STM32】TIM定时器

    TIM定时器(TIM3为例) 初始化: A:结构体TIM_HandleTypeDef的成员: 1.*Instance:类型为TIM_TypeDef,即对TIM的寄存器的映射,通过这个成员可以操作寄存器 ...

  10. 如何用jupyter打开代码并租用服务器进行运行

    1.启用环境并打开项目 s1:打开anaconda,进入到anaconda prompt命令窗口: s2:(我的代码是pytorch,所以我的环境也是pytorch) a.激活环境:conda act ...