【问题标题】:Concave and Convex Polygon - Turn arbitrary polygon into a convex polygonConcave and Convex Polygon - 将任意多边形变成凸多边形
【发布时间】:2010-12-01 11:01:35
【问题描述】:

如何识别并删除图像中绘制的这四个 RED 点

这四个点使该多边形成为凹多边形,这就是我要删除它的原因。

我的目标是通过识别和移除这些点来移除这种点,从而将凹多边形转换为凸多边形。

有什么方法可以识别和去除这些点吗?

【问题讨论】:

    标签: math


    【解决方案1】:

    使用凸包算法(例如the Graham scan),并删除所有结果凸包部分的点。

    在您的示例中,凸包将由 P1、P2、P3、P5、P7、P8、P9、P11、P12、P13、P14、P15、P16、P18 组成,它们恰好是除红色点之外的所有点.


    请注意,简单地删除那些内角大于 180 的点不一定会产生凸多边形。以这个多边形为例:

    【讨论】:

    • 这是我从未考虑过的事情:如果你一直删除反射点,只要有反射点,你肯定会得到一个凸多边形吗?因此,在上图中,您将删除两个反射,这将使它们之间的一个反射,因此您也将杀死它。我想一个正式的证明将取决于证明这样的事情会合理地终止。
    • 当然可以,但是您最终会得到一个 n 方算法,并且与格雷厄姆扫描相反,它需要您知道点的顺序。
    【解决方案2】:

    aioobe 说得对 - 您听起来好像要计算多边形的凸包,在这种情况下,您需要 convex hull algorithms 之一,例如 Graham 扫描或 Chan 算法。

    但是,如果您只想知道一个角度是凸角还是凹角,有一种快速计算方法可以避免使用三角函数。

    如果A、B、C是围绕多边形顺时针方向的连续顶点,那么如果B处的顶点是凸的

    (B - A) · (C - B)

    这里的 V 是一个 V 逆时针旋转 90° 的向量,可以这样计算:(x,y) = (−yx)。

    【讨论】:

    • 这里的dot(.)是点积还是乘法?
    • 点积。 (“乘法”作为向量运算几乎没有意义,因此可以安全地假设带点的向量积是点积。)
    • 请检查这是正确的计算。如果, A(7, 11) B(8, 9) C(11,8) 那么, (BA)·(CB) =((8-7,9-11)·(11-8,8-9) ) = (1, -2)·(3, -1) = 3 + 2 = 5 > 0,表示 B 点为凹点。对吗?
    • 如果A、B、C逆时针走怎么办? < 刚刚改成> 那么呢?
    【解决方案3】:

    您可以通过查看内角来检测凹点 - 如果大于半圆,则该点为凹点。事实上,它们通常被称为反射点,因为内角是反射的。

    一种快速检查方法是点积。比如看P14、P15、P16这三个点。 P16在P14到P15的线段的后面(即P15到P16的向量与该线法线的点积为负),所以P15是一个凸点。

    P18 在 P16 到 P16 的线段所在直线的前面(即 P17 到 P18 的向量与该直线法线的点积为正),所以 P17 是一个反射点。

    在 2d 中,线的法线就像翻转 x 和 y 坐标并取反一样简单。

    但是,我认为您可能想要的是凸包 - 考虑是否可能存在凸点仍然会创建凹包。最明显的例子是,如果我将 P17 留在原处,但将 P18 和 P16 移动到更远的形状中,在它后面。如果是这样,那么您想查看convex hull 算法。

    【讨论】:

    • 请注意,删除内角大于 180 的点不一定会产生凸多边形。看我的回答。
    • 哦,是的,我完全同意。这就是我最后一段的意思。如果我有歧义,请原谅我。
    • 感谢您的想法,我发现了一些有趣的东西。我比较了多边形的有符号面积和三角形的有符号面积[prev, point, next],如果它们有相同的符号,那么这个点就是“凸”的(不是反射的)。
    【解决方案4】:

    我猜你有点的坐标(P1、P2 等)。您可以获取每三个点之间产生的角度,如果小于180,则将其删除。要计算角度,请查看How to calculate an angle from three points?

    【讨论】:

    • 请注意,删除内角大于 180 的点不一定会产生凸多边形。看我的回答。
    • 嗨 pinaki,三点之间的角度输出总是
    猜你喜欢
    • 2020-11-02
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多