我在这里找到了 math.stackexchange 的解决方案,这个解决方案仅适用于线条,但它适用于经过一些特定修改的曲线和折线。首先,我们需要确定通过两个初始点的线的公式:
第1步
我们的观点:P1(x1, y1) 和 P2(x2, y2)
点与相邻点之间的距离:d
一般形式:Ax + By + C = 0
其中:A = y2 - y1;B = x1 - x2;C = x2y1 - x1y2。
之后,有必要以简写形式定义这个公式:
第2步
简写形式:y = mx +n
其中:m = - A / B;n = - C / B.(当 B != 0 时)
如果 A == 0 那么我们有公式:y = C(当我们有一条水平线时)
如果 B == 0 那么我们有公式:x = C(当我们有一条垂直线时)
当我们有直线的斜率时,我们需要它上面的垂直线的斜率:
第 3 步
垂线斜率:m2 = - 1 / m
如果 A == 0 或 B == 0 转到步骤 4
现在我们需要获取两个初始点的相邻点:
第4步
我会将相邻点记为 P1N1,第一个点为 P1N2,第二个点为 P2N1 和 P2N2
对于特殊情况(水平和垂直线,当 A == 0 或 B == 0 时),我们将有:
对于 A == 0(水平线):
P1N1(x1, y1 - d / 2); P1N2(x1, y1 + d / 2); P2N1(x2, y2 + d / 2); P2N2(x2, y2 - d / 2)。
对于 B == 0(垂直线):
P1N1(x1 - d / 2, y1); P1N2(x1 + d / 2, y1); P2N1(x2 + d / 2, y2); P2N2(x2 - d / 2, y2)。
对于其他情况(A != 0 和 B != 0):
P1N1:
x = (d / 2) / Math.sqrt(1 + Math.pow(m2, 2)) + x1;
y = (m2 * (d / 2)) / Math.sqrt(1 + Math.pow(m2, 2)) + y1;
P1N2:
x = - (d / 2) / Math.sqrt(1 + Math.pow(m2, 2)) + x1;
y = - (m2 * (d / 2)) / Math.sqrt(1 + Math.pow(m2, 2)) + y1;
P2N1:
x = (d / 2) / Math.sqrt(1 + Math.pow(m2, 2)) + x2;
y = (m2 * (d / 2)) / Math.sqrt(1 + Math.pow(m2, 2)) + y2;
P2N2:
x = - (d / 2) / Math.sqrt(1 + Math.pow(m2, 2)) + x2;
y = - (m2 * (d / 2)) / Math.sqrt(1 + Math.pow(m2, 2)) + y2;
如果您想在应用程序中实现这些公式,您应该缓存一些结果以提高性能。