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. 代码and截图

    1.babassl ZUC算法代码: #include <stdio.h> #include <string.h> #include <openssl/crypto.h& ...

  2. JS篇(008)-require 与 import 的区别

    答案:两者的加载方式不同.规范不同 第一.两者的加载方式不同,require 是在运行时加载,而 import 是在编译时加载 require('./a')(); // a 模块是一个函数,立即执行 ...

  3. eggjs中egg-mysql不支持mysql集群,代码修改为支持集群

    说明:暂不支持egg-mysql动态数据源,用到动态数据源请自行修改.欢迎各位大佬指导... 集群配置: exports.mysql = { // 单数据库信息配置 client: { db1: { ...

  4. es6中箭头函数和this指向

    箭头函数相当于匿名函数,简化了函数定义. 箭头函数有两种写法,当函数体是单条语句的时候可以省略{}和return. 另一种是包含多条语句,不可以省略{}和return. 特点 箭头函数最大的特点就是没 ...

  5. powerbi 模板网站

    微软网站 https://community.powerbi.com/t5/Themes-Gallery/bd-p/ThemesGallery 中国区powerbi比赛网站 http://www.ch ...

  6. int 和vachar后面的数字代表的含义

    在创建数据表的时候,我们经常会给每一个字段设置一个长度,例如:int(5).varchar(10) 等等,但是他们代表的意思是什么呢?是该列允许存储值的最大宽度吗? 场景1:为什么我设置成 int(1 ...

  7. window 版本下面建立linux命令行终端的方法

    这个主要是解决dos系统命令行与linux命令行不匹配的问题. 因此microsoft shop 中开发了很多免费的app可供傻瓜式的安装使用.但是出现了不能下载的问题. 链接如下:https://w ...

  8. SQL初级知识点

    一,表 表中的列叫做字段,行叫记录也叫元组. 主键:唯一的标识表中的某一条记录 外键:一个表的主键作为另一个表的外键,表示两个表之间的关系.一般将外键写在记录的一方,比如部门号和员工号,应该将部门号作 ...

  9. Redis集群模式及工作原理

    Redis有三种集群模式:主从模式.哨兵模式和集群模式. 1. 主从模式 所有的写请求都被发送到主数据库上,再由主数据库将数据同步到从数据库上.主数据库主要用于执行写操作和数据同步,从数据库主要用于执 ...

  10. web之jquery

    jquery 插件 下载解压插件 加载jQuery  加载插件 插件样式 按照使用例子给元素添加类名,id,函数.