sol*_*lub 5 python algorithm geometry offset computational-geometry
我有一个用 Python 实现的 Straight Skeleton 算法,并想用它来偏移多边形的边缘。
不幸的是,我看到几篇论文提出了这种抵消方法,但没有一篇提供有关如何实现它的具体信息。他们之中:
由于直骨架的定义基于边缘的连续波前或草火传播,因此它特别适用于多边形偏移。特别是,它可以用来获得所谓的“斜接”偏移,如果角在偏移多边形中保持原样
如果 P 的骨架已知,那么对于任何给定半径 r 的单个偏移曲线的计算是简单、高效(线性时间)和数值稳定的。所要做的就是以某种方式遍历骨架 并逐个插入偏移曲线的元素。
我尝试将每个边的偏移量限制到它们周围的“骨骼”,但发现输出并不令人满意:一些偏移量不匹配,我看到线条应该相互接触的间隙。
(这里质量更高)
问题:使用直骨架计算多边形斜接偏移的正确方法是什么?
小智 5
我不太确定您在第二张图像中显示的偏移量是怎么回事,但是一旦有了骨架,计算偏移量应该非常简单。
骨架的每条弧线都可以看作3个空间中的一条线段(或射线),第3个坐标是时间。也就是说,它在某个波前事件中的某个时间 t_s(当它在事件中创建或作为入射到输入点的初始波前顶点时)开始,并在某个波前事件中的某个时间 t_v(如果它是有界边)结束。
现在,要找到距离 t 的偏移曲线,请迭代所有弧,并且对于在时间 t 存在的每个尚未访问过的弧(即 t_s < t < t_e),在两个入射面之一中开始偏移段。设此弧为a。
当然,问题是这一段的终点在哪里。要找到其端点,请沿着直骨架面行走,最初沿着波前传播的方向移动。也就是说,您看到的下一条弧与 a 的 a at t_e 相关。沿着面行走,直到找到另一个在 t 期间处于活动状态的弧线 a'。这是您的路段停止的地方。如果你以前没有见过a',那么在a'的另一边还有另一个偏移段,你可以用同样的方法找到。
一旦您查看了直骨架的所有弧,您将拥有一组代表时间 t 的偏移曲线的线段。
这可能是您想要做的,但从您的动画中并不完全清楚。
另外,您显示的骨架似乎是正确的(很难看到,因为动画),但您的偏移段似乎与直骨架弧交叉。每个偏移段应始终仅限于一个直骨架面(并且它将平行于入射到该面并从该面发出的输入边)。
另请参见。P. 和 Held:计算基于直骨架的斜接偏移曲线(CADA,12(4),2015)。