zoukankan      html  css  js  c++  java
  • 一种求凸多边形内部似最大圆的算法

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

    1.    背景

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

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

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

    2.算法设计

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

    2.1获取重心

           重心的获取有两个方法:

           a.各顶点的平均值。

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

          

    2.2获取半径

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

          

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

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

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

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

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

            

    4.实现

        

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

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

                                             

  • 相关阅读:
    【java开发系列】—— 集合使用方法
    【java开发系列】—— spring简单入门示例
    解决win7远程桌面连接时发生身份验证错误的方法
    eoLinker-AMS接口管理系统
    CentOS 配置mysql允许远程登录
    Linux上安装ZooKeeper并设置开机启动(CentOS7+ZooKeeper3.4.10)
    Cent OS home下中文目录改成英文目录
    解决redis-cli command not found问题
    Centos7使用yum安装Mysql5.7.19的详细步骤(可用)
    取消centOS7虚拟机锁屏
  • 原文地址:https://www.cnblogs.com/naaoveGIS/p/7217477.html
Copyright © 2011-2022 走看看