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

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

1.    背景

         任意多边形内部一定有一个最大圆,但是如果我们将条件设定为“任意多边形”、“最大圆”,该算法将十分复杂。比如获取多边形内任意点进行膨胀、通过碰撞检测来进行判定,算法复杂且效率低下。

       回到实际项目本身,需求为判断点是否落在规划的电子围栏内。观察电子围栏,多数是凸多边形。而我们之所以要求内部圆,是因为单纯通过外包矩形可以过滤掉的点十分有限,并且即使点落在外包矩形内后,依然不能肯定点是否落在多边形内,还是要做一次点和多边形关系的判断。考虑到实际情况中点落在多边形内是大概率事件,这将导致点面关系的判断十分频繁。而如果我们内部构造出一个圆,这个圆足够大,则可以先进行点是否在圆内的简单判断。如果这个圆可以占多边形50%的空间,则可以避免百分之五十的点和多边形的判断。那么这个圆需要是最大么,考虑到算法代价,似最大便足够。

       总结这个需求,我将其简化为,求凸多边形内部的似最大圆。

2.算法设计

       求出多边形的重心为圆心,获取重心到各边垂直距离中的最短距离为半径。

2.1获取重心

       重心的获取有两个方法:

       a.各顶点的平均值。

       b.考虑面积加权,将多边形切分为各三角形,通过平面薄板重心公式把积分变成累加和:

      

2.2获取半径

       以重心为原点,与各个边相连,将多边形划分为多个三角形,求出该顶点到三角形对边的垂直距离。

      

       a.利用海伦公式算出三角形的面积。

       b.利用三角形面积和边的长度,算出原点到对边的垂直距离。

       c.遍历此运算,得出“高”中的最短高(距离)。

3.补充多边形凹凸关系判断

       由于该算法主要针对凸多边形,所以需要对多边形进行凹凸判断。判断思路为角度合算法。

        

4.实现

    

 

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

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

                                         

时间: 2024-09-18 09:01:48

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

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

文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景        在前一篇中,我们探讨了如何求凸多边形中的似最大圆,但是针对实际情况需求,我们并没有完全解决问题.实际情况中,凹凸多边形同时存在,并且在行政区划应用上,凹多边形更多.所以这里我们依然得探讨如何在任意多边形中得出其内部的似最大矩形或者似最大圆.        这里,我们将方向优先选择为求似最大矩形,原因有二:矩形的判断不涉及运算,效率更高:更重要的原

游戏编程-求有详细注释的matlab 智能算法相关的代码

问题描述 求有详细注释的matlab 智能算法相关的代码 网盘,邮箱454170989@qq.com 无聊者勿扰![ 解决方案 ? <神经网络入门> .? (连载之一) 用平常语言介绍神经网络(Neural Networks in Plain English) 因为我们没有很好了解大脑,我们经常试图用最新的技术作为一种模型来解释它.在我童年的时候,我们都坚信大脑是一部电话交换......<br/><strong>答案就在这里:</strong><a t

要求时间复杂度为O(n)的求两个位置之间最大值的算法

问题描述 要求时间复杂度为O(n)的求两个位置之间最大值的算法 把一串数(32位int型)放到Num中,求begin和end位置使得begin与end之间的是数字和最大,要求时间复杂度是O(n). 注:不可以先排序,这串数字的位置不能改变. 最好有源码,思路也可以. 解决方案 #include #include int getmax(int first, int second) { return first > second ? first : second; } int main() { in

c++-求7的整数倍和(大数算法)

问题描述 求7的整数倍和(大数算法) 3C 求(1-10^18)内的整数,满足各位数字之和为7的整数倍的所有数的和,例如:25,86,106,1115各位相加都是7的整数倍.要求:1-2秒内完成 解决方案 你想高效的解决办法,就先贴出你写的认为不高效的代码,然后让大家帮你优化下 解决方案二: 我问了下大师,亚洲算法大赛银奖获得者,他说不可能办得到,你不用想了 楼主! 解决方案三: 你把每一位数取余相加就可以了. 解决方案四: 这个问题用string去接收,然后遍历,相加除7(相加一定要是BigI

java求一个如何切分多个时间段算法

问题描述 java求一个如何切分多个时间段算法 例如现在有时间 5.13-10.1 5.3-6.1 6.1-6.2 怎么能变成 5.3-5.13 5.13-6.1 6.1-6.2 解决方案 先按照 杠 把所有日期拆分出来,然后按照你的规则排序,然后从第二个开始,到倒数第二个,每个和它前面及后面的组成一组

求Single-pass聚类算法和K-means聚类算法源码!

问题描述 求Single-pass聚类算法和K-means聚类算法源码! 本人最近在学习舆情热点分析,能力有限,刚起步,求Single-pass聚类算法和K-means聚类算法源码!最好是Java写的,万分感谢! 解决方案 我也是在找single-pass的源码,楼主找到了吗?K-means算法在Weka-3-7weka-srcsrcmainjavawekaclusterersSimpleKMeans中有实现,可以看看 解决方案二: 没有找到single-pass,同求!

求一个类似Excel单元格计算算法

问题描述 求一个类似Excel单元格计算算法,请大家帮帮忙.给加分 解决方案 解决方案二:求一个类似Excel单元格计算算法,请大家帮帮忙.给加分解决方案三: 解决方案四:二维数组实现解决方案五:用一个二维数组,或者一个泛型列表,泛型列表中每一个元素为一行,元素中的每一个属性为一个单元格这样就简化了,变成数组的算法及列表的算法解决方案六:课程表模式...解决方案七:建议你使用ComponentOneStudio.NET控件

c++-C++求个优化过的A星算法 代码

问题描述 C++求个优化过的A星算法 代码 如果角色可以360度走,要怎么使路径平滑呢???? ??????????????????????????????????? 解决方案 http://blog.itpub.net/8225414/viewspace-951996/ 解决方案二: http://cn.cocos2d-x.org/tutorial/show?id=773

求C# SHA-256的HMAC散列算法

问题描述 求C#SHA-256的HMAC散列算法,贴代码!!!! 解决方案 解决方案二:byte[]key=...;byte[]content=...;using(HMAChmac=newHMACSHA256(key)){byte[]hash=hmac.ComputeHash(content);}