如何使用直骨架计算多边形的斜接偏移

How to compute the mitered offset of a polygon using its Straight Skeleton

我在 Python 中实现了 Straight Skeleton 算法,想用它来偏移多边形的边缘。

不幸的是,我已经看到几篇论文提出了这种抵消方法 none,其中提供了有关如何实现它的具体信息。 其中:

Since the very definition of a Straight Skeleton is based on the continuous wavefront or grassfire propagation of the edges, it is specially suited for polygon offsetting. In particular, it can be used to obtain the so-called “mitered” offsetting were corners remain as such in the offset polygon

If the skeleton of P is already known then the computation of a single offset curve for any given radius r is simple, efficient (linear time) and numerically stable. All one has to do is to traverse the skeleton in a certain way and insert element by element of the offset curve.

我尝试将每条边的偏移量限制在它们周围 "bones" 但发现输出不令人满意:一些偏移量不匹配,我看到线条应该相互接触的间隙。

(更高质量here

问题:使用直骨架计算多边形斜接偏移的正确方法是什么?

我不确定你在第二张图片中显示的偏移量是怎么回事,但是一旦你有了骨架就可以很直接地计算偏移量。

骨架的每条弧线都可以看作是3空间中的一条线段(或射线),第3坐标为时间。也就是说,它在某个时间 t_s 开始(当它在事件中创建或作为入射到输入点的初始波前顶点时)并在某个时间 t_v 结束(如果它是一个有界边缘)在一些波前事件中。

现在,要找到距离为 t 的偏移曲线,遍历所有弧,并且对于在时间 t 存在的每个您尚未访问过的弧(即 t_s < t < t_e ), 在两个入射面之一开始偏移段。设这条弧线为 a.

当然,接下来的问题是这个片段在哪里结束。要找到它的端点,请沿着直骨架面行走,最初沿着波前传播的方向移动。也就是说,您看到的下一个弧是在 a 的 t_e 处发生的。沿着面走,直到找到另一条弧 a',它在 t 期间处于活动状态。这是您的段停止的地方。如果你之前没有见过a',那么在a'的另一边还有一个偏移段,你可以用同样的方法找到。

一旦您查看了直骨架的所有弧线,您将有一组线段代表您在时间 t 的偏移曲线。

这可能是您想要做的,但从您的动画中看并不完全清楚。

此外,您显示的骨架似乎是正确的(很难看到,因为动画),但您的偏移段似乎穿过直线骨架弧。每个偏移段应始终仅限于一个直骨架面(并且它将平行于入射到该面并发出该面的输入边)。

另请参阅。 P. and Held: Computing Mitered Offset Curves Based on Straight Skeletons (CADA, 12(4), 2015).