如何偏移多边形边缘?

8

我有一个由点构成的封闭多边形列表。现在,我想通过给定内部或外部的选项和偏移值来创建另一组2D点。我该怎么做?enter image description here


4
可能是 对多边形进行膨胀/缩小(偏移、缓冲)的算法 的重复问题。 - Maurice Perry
你想获取“parallel”内侧或外侧的边,是吗? - Muhammad Magdi
请注意,这里讨论的大部分内容都是关于如何计算偏移顶点,但实际上这只是容易的部分。向内偏移的短边可能会导致多边形边界交叉。需要进行更多处理才能得到简单的多边形。锐角凹面和外部偏移也是如此。 - Gene
2个回答

12

enter image description here

对于每个多边形顶点,计算外部角平分线向量,即两个相邻边的归一化法向量nanb之和,然后将其归一化。

 bis = na + nb 
 bis = bis / Length(bis)

然后找到所需的角平分线长度,以提供偏移距离,如下所示:

 l = d / Sqrt((1 + dotproduct(na,nb))/2)

(源自l=d/cos(fi/2)和半角余弦公式)

获取偏移多边形顶点(对于内部偏移使用负数!):

P' = P + l * bis

增加了:这里添加Python实现代码


请问我这样做是否正确?我将na和nb设置为指向前一个和后一个顶点的归一化向量,而不是选择它们作为相邻边的法线。然后,l = d / Sqrt(1 - dotproduct(na,nb)),而不是+dotproduct。从实验结果来看,似乎是正确的,但我只是猜测。 - user6369958
1
@Claudio 如果存在三个相邻共线的顶点,可能会导致错误。如果在您的情况下不可能出现这种情况-您可以使用侧向(两个相邻侧面的前进和后退)。请注意,法向量非常简单-对于方向向量dx,dy(左),法向量为-dy,dx - MBo
我正在使用共面顶点偏移多边形,但在三维空间中,所以法线不像“-dy,dx”那样简单,但显然是可以实现的。谢谢你的提示。 - user6369958
1
是的,有了平面法线N,我们可以找到边缘法线,如in_edge_dir x NN x out_edge_dir,但肯定需要更多的计算。 - MBo
@kylefinn 谢谢你的留言,稍后会进行探索。 - MBo
显示剩余6条评论

3
你需要与方向一起工作,以便能够定义外部/内部区域。更好的方法是使用箭头(向量)左/右侧进行操作。
在我的示例中,偏移量位于向量的右侧,现在你需要计算所有红线的交点,以定义直线的新起始-结束点。
例如:P0 = (5,2) & P1 = (2, 1.7)
V1 = -3,-0.3。顺时针旋转90度给我们向量-0.3,3(a,b)->(b,-a)
将向量除以3(大约是绘图中的距离)给出了(-0.1, 1),将点P0偏移向量给出P0' (5,2) - v(-0.1,1) = (4.9, 3)
图片链接:enter image description here

我知道如果向量v2与v1的叉积v2 × v1为正,则v2在v1的右侧,但如果它们平行,则结果为0。如何将一个向量向右偏移? - N.T.C
很聪明。我也意识到向量P1P1'将角度P0P1P2分成两个相等的角度。因此,可以确定向量P1P1'。同时,可以确定距离P1P1'。因此,在不需要确定新线之间的交点的情况下,可以找到P1'。 - N.T.C
希望我能为您提供帮助,如果您满意,请标记为已解答。 - Aldert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接