如何计算多边形的符号距离函数,由任意一组点描述。多边形可以是凹的或凸的。假设这些点存储在具有逆时针绕组的std::vector
中。
更新
让我更具体一点。这不是网格上的采样函数。我需要能够检测沿多边形绘制的任意线段的符号变化(不一定与多边形相交),而不检查每个线段的单个交叉点。问题是,我可能有数千个线段。
有人能想出一种有效的方法吗?
如果我可以参数化地表达SDF,我可以计算一个导数来实现这一点。
答案 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
是找到的交叉点数。