凹面和凸面多边形

时间:2010-12-01 11:01:35

标签: math

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

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

我的目标是通过识别并删除这些点来将凹面多边形转换为凸面。

有没有办法识别和删除这些点?

由于

4 个答案:

答案 0 :(得分:10)

使用凸包算法(例如the Graham scan),并移除所有生成的凸包的一部分。

在你的例子中,凸包将由P1,P2,P3,P5,P7,P8,P9,P11,P12,P13,P14,P15,P16,P18组成,这些正是除红色之外的所有点


请注意,仅删除内角大于180的点不一定会产生凸多边形。以此多边形为例:

enter image description here

答案 1 :(得分:3)

aioobe说得对 - 你的声音就好像你想要计算多边形的凸包一样,在这种情况下你想要一个convex hull algorithms像Graham扫描或Chan的算法。

但是,如果您只是想知道角度是凸面还是凹面,可以通过快速计算方法来避免三角函数。

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

  

(B-A)·(C-B)< 0

这里V 是V向逆时针旋转90°的向量,可以这样计算:( x y =( - 。ý X

答案 2 :(得分:2)

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

快速检查方法是点积。例如,查看三个点P14,P15,P16。 P16位于P14到P15之间的线段之后(即,从P15到P16的向量的点积,该线的法线为负),因此P15是一个凸点。

P18位于从P16到P16的线段所在的线的前面(即,从P17到P18的矢量的点积,该线的法线为正),因此P17是反射点。 / p>

在2d中,线的法线就像翻转x和y坐标一样简单,而忽略了一个。

然而,我认为你可能想要的是凸包 - 考虑是否可能存在凸点,但仍然会产生凹壳。最明显的例子是,如果我将P17放在原处,但将P18和P16进一步移动到后面的形状中。如果是,那么您想要查看convex hull算法。

答案 3 :(得分:0)

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