【发布时间】:2021-09-11 16:00:18
【问题描述】:
我需要一种方法来计算点与多边形边界之间的距离。
- 如果点在多边形之外,距离为正
- 如果点在多边形内,距离将为负数
这被称为Signed Distance Field/Function的SDF
多边形本身由多条路径组成,可以是凹的,有孔,但不能自相交,并且有很多顺时针排列的点(10000+)。
我找到了一些existing solutions,但他们需要针对每个多边形边缘测试该点,这不够有效。
这是产生的视觉结果(绿色为正,红色为负):
所以我尝试了以下方法:
将多边形边放在四叉树中
要计算距离,请找到离该点最近的边,并根据该点在边的哪一侧更改符号。
遗憾的是,当点与多个边缘(例如角)的距离相同时,它不起作用。
我已经尝试添加条件,如果一个点位于所有边的外侧,则它位于多边形之外,但它不能解决内部问题,反之亦然。
想不通...
如果有人好奇,这个想法是稍后使用一些着色器来生成这样的图像:
编辑
为了澄清,这里是拐角处出现的问题的特写:
- 对于区域A中的所有点,最近的段是S1,所以没问题
- 对于区域E中的所有点,最近的段是S2,所以也没有问题
- 区域 B、C 和 D 中的所有点与 S1 和 S2 的距离相同
- 区域 B 中的点位于 S1 的外侧和 S2 的内侧
- 区域 D 中的点位于 S1 的内侧和 S2 的外侧
- 区域 C 中的点位于两个段的外侧
人们可能会认为一个点必须位于两个段的内侧才能被视为“在”。它解决了角度 180°
最糟糕的是,两个或多个角可以共享相同的位置(例如第一张图像下部的四个角)...
【问题讨论】:
-
看看Adaptively Sampled Distance Fields。我似乎记得他们的一篇论文包括他们的八叉树实现的示例源代码。
-
孔是逆时针排列的吗?
-
是的,你已经说过了。但我希望你回答我的问题。
-
好的。我认为你的四叉树是要走的路。你说你在角落里发现了问题。不应该这样(查看您的代码)。也许如果你打破一条线,使每一块都适合树中唯一的四边形,那么你可能会避免错误的最近边。
-
在opencv中,有这个pointPolygonTest函数。
标签: algorithm geometry distance