一种求任意多边形内部水平方向似最大矩形的算法

文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

1.背景

       在前一篇中,我们探讨了如何求凸多边形中的似最大圆,但是针对实际情况需求,我们并没有完全解决问题。实际情况中,凹凸多边形同时存在,并且在行政区划应用上,凹多边形更多。所以这里我们依然得探讨如何在任意多边形中得出其内部的似最大矩形或者似最大圆。

       这里,我们将方向优先选择为求似最大矩形,原因有二:矩形的判断不涉及运算,效率更高;更重要的原因是,之后我们构建R树索引,基于矩形会更加便捷。

2.算法详解

       在我之前的文章《网格索引判断点面关系的方法》(http://www.cnblogs.com/naaoveGIS/p/5148185.html),提到了GIS中常用的网格方法。同样,这里我将把该网格法的思路引入至算法中。

                       

       具体描述为:

       a.获取任意多边形的四角坐标,通过四角坐标构造矩形,将该矩形划分成N*M个规则格网。

       b.遍历所有格网,判断每个格网和多边形的包含关系。格网在多边形中,则标记为1,否则为0。

       c.计算由0和1组成的矩形中,由1组成的最大矩形。

       d.求得所得最大矩形代表的四角坐标,构造成真实地理矩形。

3.算法探讨

       a.该算法最大的难点在于计算由0和1组成的矩形中,由1组成的最大矩形:

                           

       b.该算法获取的矩形是否为最大取决于网格的划分粒度,实际项目中,要进行综合考虑。实际上,只要能够逼近,是否最大不重要。

4.算法实现

 

 

5.问题扩展

       昨天一个朋友问了一个相似的问题,项目背景为土地利用分析,需要提取任意规划土地内一平方公里的样本。

       利用网格的思想,该问题同样能很好的解决。

      

                         -----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

                                                                               如果您觉得本文确实帮助了您,可以微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^

                                      

时间: 2024-08-03 15:06:46

一种求任意多边形内部水平方向似最大矩形的算法的相关文章

一种求凸多边形内部似最大圆的算法

文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.    背景          任意多边形内部一定有一个最大圆,但是如果我们将条件设定为"任意多边形"."最大圆",该算法将十分复杂.比如获取多边形内任意点进行膨胀.通过碰撞检测来进行判定,算法复杂且效率低下.        回到实际项目本身,需求为判断点是否落在规划的电子围栏内.观察电子围栏,多数是凸多边形.而我们之所以要求内部圆,是

判断点是否任意多边形内的2种方法

导入 判断触摸点是否在一个多边形的内部 方法 1.数学方法 这个方法的好处是任意平台都可以使用,不仅现于Android 算法: 求解通过该点的水平线与多边形各边的交点,单边交点为奇数,则成立 ok我们其实就是需要看这个点的单边射线与多边形的交点,代码实现如下: public boolean isInPolygon(Point point, Point[] points, int n) { int nCross = 0; for (int i = 0; i < n; i++) { Point p1

判定点是否在不规则多边形内部的问题

问题如下: ? 1 2 3 4 话说在平面内有一个任意的不规则的封闭多边形,另外在这个平面内还有一个点,问题:如何高效的判定这个点是在这个多边形内部还是外部?   补充: 什么是任意的呢?也就是说想让他是啥样就啥样,只要是封闭的多边形就好.为了简化题目,明确这个点不在多边形的线上. 当然,熟悉谷歌和度娘的同学已经搜到了各种正确的不正确的.国内的国外的解法.当然有些参加过ACM比赛的同学在学习.训练或者比赛中,可能也碰到了这个问题. 偶对自己不加思考就直接搜索的表示遗憾,因为你失去了一次自我提升的

如何让浮动的子DIV在父DIV上居中(水平方向和垂直方向)

问题描述 如何让浮动的子DIV在父DIV上居中(水平方向和垂直方向) 如题:如何让浮动的子DIV在父DIV上居中(水平方向和垂直方向) 解决方案 父容器relative定位,浮动div absolute定位,left和width 50%,定高和定宽,通过margin-left和margin-top为你的-宽度和-高度的一半来实现水平和垂直进行居中 解决方案二: http://blog.163.com/www.wxs_123/blog/static/82784664201321831746921/

PDF文件怎么绘制任意多边形标注?

  PDF文件怎么绘制任意多边形标注?           1.我们可以在百度搜索相关的PDF编辑器软件来实现对相应的PDF文件的编辑.如图所示的打开PDF文件的效果. 2.在PDF文件编辑器中找到工具栏,在工具栏中找到注释工具,点击注释工具,在下拉工具菜单中选择添加多边形形工具. 3.添加椭圆形工具后,可以在PDF文件页面右侧出现多边形工具属性的页面内容,我们可以在次对多边形的样式等进行设定. 4.如果找不到右侧的多边形工具属性,我们还可以通过对工具栏中的多边形工具点击鼠标右键,进入到注释样式

判断点是否在多边形内部

如何判断一个点是否在多边形内部? (1)面积和判别法:判断目标点与多边形的每条边组成的三角形面积和是否等于该多边形,相等则在多边形内部. (2)夹角和判别法:判断目标点与所有边的夹角和是否为360度,为360度则在多边形内部. (3)引射线法:从目标点出发引一条射线,看这条射线和多边形所有边的交点数目.如果有奇数个交点,则说明在内部,如果有偶数个交点,则说明在外部. 具体做法:将测试点的Y坐标与多边形的每一个点进行比较,会得到一个测试点所在的行与多边形边的交点的列表.在下图的这个例子中有8条边与

求任意两个节点之间有几条通路

问题描述 求任意两个节点之间有几条通路 输入一些二元组,二元组代表两个节点之间拥有一条通路,比如(a,b)表示a可以到达b,b也可以到达a.然后输入起始节点和目标节点,输出任何可能的路径.路径中不得包含回路. 输入示范 3 a,b a,c b,c a c 输出示范 abc ac 输入说明 第一行代表二元组的数量 然后是所有的二元组 第5行起始节点 第6行终止节点 用Java或者C#完成 解决方案 http://leaver.me/archives/2561.html 解决方案二: http://

c语言-C语言不使用系统库函数,使用循环实现求任意正数的开平方

问题描述 C语言不使用系统库函数,使用循环实现求任意正数的开平方 C语言不使用系统库函数,使用循环实现求任意正数的开平方,怎么写??? 解决方案 float foo(float n) { float f1=0.0, f2=n, fm=(f1+f2)/2.0,differ=1.0; while (differ > 0.0001) { if (fm*fm>n) { f2=fm; differ=fm*fm-n; } else { f1=fm; differ=n-fm*fm; } fm=(f1+f2)

加密-求问有什么安全性比较高的加解密算法? des, 3des这种用的很多了吧应该

问题描述 求问有什么安全性比较高的加解密算法? des, 3des这种用的很多了吧应该 求问有什么安全性比较高的加解密算法? des, 3des这种用的很多了吧应该 解决方案 加密算法的强度不是取决于算法是否公开,而是取决于算法本身在数学上是否有解,以及密钥的强度. 所以aes这种工业级的加密算法,在相当的时间和应用范围内肯定是没有问题的. 解决方案二: 对称加密算法 对称加密算法用来对敏感数据等信息进行加密,常用的算法包括: DES(Data Encryption Standard):数据加密