【发布时间】:2010-12-01 11:01:35
【问题描述】:
如何识别并删除图像中绘制的这四个 RED 点
这四个点使该多边形成为凹多边形,这就是我要删除它的原因。
我的目标是通过识别和移除这些点来移除这种点,从而将凹多边形转换为凸多边形。
有什么方法可以识别和去除这些点吗?
【问题讨论】:
标签: math
如何识别并删除图像中绘制的这四个 RED 点
这四个点使该多边形成为凹多边形,这就是我要删除它的原因。
我的目标是通过识别和移除这些点来移除这种点,从而将凹多边形转换为凸多边形。
有什么方法可以识别和去除这些点吗?
【问题讨论】:
标签: math
使用凸包算法(例如the Graham scan),并删除所有不结果凸包部分的点。
在您的示例中,凸包将由 P1、P2、P3、P5、P7、P8、P9、P11、P12、P13、P14、P15、P16、P18 组成,它们恰好是除红色点之外的所有点.
请注意,简单地删除那些内角大于 180 的点不一定会产生凸多边形。以这个多边形为例:
【讨论】:
aioobe 说得对 - 您听起来好像要计算多边形的凸包,在这种情况下,您需要 convex hull algorithms 之一,例如 Graham 扫描或 Chan 算法。
但是,如果您只想知道一个角度是凸角还是凹角,有一种快速计算方法可以避免使用三角函数。
如果A、B、C是围绕多边形顺时针方向的连续顶点,那么如果B处的顶点是凸的
(B - A)⟂ · (C - B)
这里的 V⟂ 是一个 V 逆时针旋转 90° 的向量,可以这样计算:(x,y)⟂ = (−y, x)。
【讨论】:
< 刚刚改成> 那么呢?
您可以通过查看内角来检测凹点 - 如果大于半圆,则该点为凹点。事实上,它们通常被称为反射点,因为内角是反射的。
一种快速检查方法是点积。比如看P14、P15、P16这三个点。 P16在P14到P15的线段的后面(即P15到P16的向量与该线法线的点积为负),所以P15是一个凸点。
P18 在 P16 到 P16 的线段所在直线的前面(即 P17 到 P18 的向量与该直线法线的点积为正),所以 P17 是一个反射点。
在 2d 中,线的法线就像翻转 x 和 y 坐标并取反一样简单。
但是,我认为您可能想要的是凸包 - 考虑是否可能存在凸点仍然会创建凹包。最明显的例子是,如果我将 P17 留在原处,但将 P18 和 P16 移动到更远的形状中,在它后面。如果是这样,那么您想查看convex hull 算法。
【讨论】:
我猜你有点的坐标(P1、P2 等)。您可以获取每三个点之间产生的角度,如果小于180,则将其删除。要计算角度,请查看How to calculate an angle from three points?
【讨论】: