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

Python 如何使用多边形的直骨架计算多边形的斜接偏移,python,algorithm,geometry,offset,computational-geometry,Python,Algorithm,Geometry,Offset,Computational Geometry,我有一个用Python实现的直骨架算法,我想用它来偏移多边形的边 我看过几篇文章建议采用这种抵消方法,不幸的是,没有一篇文章提供了如何实现这一目标的具体信息。 其中: 因为直线骨架的定义是基于 连续波前或草火传播的边缘,它是 特别适合多边形偏移。特别是,它可以被使用 为了获得所谓的“斜接”偏移,角保持为 在偏移多边形中这样做 如果p的骨架已知,则计算单个 任意给定半径r的偏移曲线简单、有效(线性时间) 而且数值稳定。我们所要做的就是穿过骨架 以某种方式插入偏移曲线的元素 我尝试将每

我有一个用Python实现的直骨架算法,我想用它来偏移多边形的边

我看过几篇文章建议采用这种抵消方法,不幸的是,没有一篇文章提供了如何实现这一目标的具体信息。 其中:

因为直线骨架的定义是基于 连续波前或草火传播的边缘,它是 特别适合多边形偏移。特别是,它可以被使用 为了获得所谓的“斜接”偏移,角保持为 在偏移多边形中这样做

如果p的骨架已知,则计算单个 任意给定半径r的偏移曲线简单、有效(线性时间) 而且数值稳定。我们所要做的就是穿过骨架 以某种方式插入偏移曲线的元素

我尝试将每条边的偏移约束到它们周围的“骨骼”上,但发现输出并不令人满意:有些偏移不匹配,我看到了线应该相互接触的间隙

(更高质量)


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

我不太确定第二张图像中显示的偏移是怎么回事,但是一旦有了骨架,计算偏移应该是非常直接的

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

现在,要查找距离为t的偏移曲线,请在所有圆弧上迭代,对于在时间t(即t_s 当然,问题是这一部分在哪里结束。要找到其端点,请沿笔直的骨架面行走,最初沿波前传播的方向移动。也就是说,你看的下一个弧线是a的tèe。沿着脸走,直到你找到另一个弧,a',它在t期间是活跃的。这是您的片段停止的地方。如果您以前没有见过“a”,则在“a”的另一侧有另一个偏移段,您可以通过相同的方式找到

查看直线骨架的所有圆弧后,将有一组线段表示时间t处的偏移曲线

这可能是你想要做的,但从你的动画中并不清楚

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


另外,cf..

输入(飞机轮廓)是否在任何地方都可用(在免费许可证下),以及您使用(想要使用)的偏移距离是多少?正如@weasel所提到的,在已知骨架后获得偏移应该是微不足道的。在开始(左侧)的下方图像中,突出显示了偏移的问题部分:似乎偏移“穿透”了另一侧,笔直的骨架应有助于避免此类问题。您可以将您的输出与--一个允许偏移量的直接框架代码进行比较。感谢你们两位的回复。按照@gue的建议,使用不同的库测试输出,我发现我的实现并不完全正确。骨架上角度的细微差异导致偏移之间的小不匹配。我现在明白了偏移方法是正确的,但是它被应用到了一个不正确的框架上。正如我在上面的其他评论中提到的,我错误地假设我的实现是正确的,而它并不是一开始就正确的。骨架中的轻微扭曲导致偏移不匹配。话虽如此,您的答案正确地回答了原始问题,并且解释得很好(+1)。谢谢你抽出时间。