计算任意多边形的符号距离变换

时间:2017-01-23 19:40:11

标签: c++ c++11 computational-geometry

如何计算多边形的符号距离函数,由任意一组点描述。多边形可以是凹的或凸的。假设这些点存储在具有逆时针绕组的std::vector中。

Diagram of polygon

更新

让我更具体一点。这不是网格上的采样函数。我需要能够检测沿多边形绘制的任意线段的符号变化(不一定与多边形相交),而不检查每个线段的单个交叉点。问题是,我可能有数千个线段。

有人能想出一种有效的方法吗?

如果我可以参数化地表达SDF,我可以计算一个导数来实现这一点。

2 个答案:

答案 0 :(得分:0)

首先旋转所有点,使线与x轴平行。然后平移,使线条为x轴。然后作为测试整合。直线x0y0 x1y1下的区域计算起来非常简单。您可以将所有表达式求和以获得不定积分或有符号区域,该区域应独立于轴(因为曲线下的点减去)。现在回答具体问题,在x中排序,使您能够找到给定x的点值。因此,创建两个"事件",部分开始,和部分"结束"用指针或引用返回start事件。然后,为了在任何点获得距离变换,我们计算所有与感兴趣的x交叉的事件。如果您希望每个事件间隔都使用分段函数,那么实际上这一点可以稍微简单一些,因为您可以从头到尾传递队列。

答案 1 :(得分:0)

坏消息:在最坏的情况下,线段可以与N点中的多边形相交,这可能会出现在所有M线段上。因此,在最坏的情况下,细分与边的详尽比较是不可避免的。这有利于蛮力方法。

幸运的是,使用扫描线方法,输出敏感解决方案以N线段的交叉问题而闻名。复杂性可以降低到O((N+K) log N)O(N log N + K),其中K是找到的交叉点数。