如何在任何线条周围绘制轮廓

ias*_*ons 9 math geometry vector outline

在此输入图像描述

所以我有一个由n个点组成的任意线(见图1所示的例子)

我想围绕这条线绘制一个轮廓(见图2),所以我需要计算周围多边形的点.

我开始在线上进行扩张,但这不起作用 - 见图3

有关如何做到这一点的任何建议?

我怀疑计算每个线段的法线是否用于翻译下面的新线和在当前位置上方的新线,然后将每个新线延伸到无穷大并将点定义为交叉点?

xan*_*xan 5

首先复制每一行两次,每侧一次,距离每个原始行的宽度的一半.这为您提供了图像中的绿线.然后你需要按顺序(编号)访问它们并处理松散的目的.

线条概述

当线条不符合时(2-3,6-7和12-13),您可以添加线条连接(蓝色).线连接可以是斜角连接(2-3),只需连接点,或通过延长线直到它们相遇(6-7)或通过制作曲线进行圆形连接来进行斜接连接.

当线条相遇时,只需取交点(蓝点).

在生产线末端,您需要添加一个端盖(也是蓝色).端盖可以是通过连接点而形成的对接盖(8-9),通过在连接它们之前稍微延伸线的突出帽(1-16),或圆形帽(未示出).

最终结果是一个多边形(或路径,如果它包括圆形连接),然后您可以描边或填充.


Pet*_*eas 5

我找到了一种计算直线轮廓点的方法。对于原始线的每个点,您必须计算轮廓的 2 个点:

  1. 对于原始线的每个线段(2点之间),您必须计算其法线向量(红色)
  2. 对于每个点,添加上一个和下一个线段的法线。这会产生一个新向量(绿色)
  3. 将新向量除以值: k l+1 ,其中 k l 是法线向量的点积。你会得到蓝色向量。然后将此向量添加到当前点及其相反向量上,您将获得当前点的 2 个轮廓点

上面的颜色对应于图像在此输入图像描述

我用 C 语言编写了这个函数,但我使用了 Accelerate Framework,所以它不太容易阅读。您可以在此处找到源代码,并在此处找到运行演示的视频。


cor*_*iKa 0

在渲染之前创建所有线条。

当你这样做时,它们应该重叠,如下所示:在此输入图像描述

显然,我画的那些是经过修剪的,以显示轮廓。