我目前正在研究绘制粗折线的项目,并且正在OpenGL中使用插值。我设法计算了所有必要的点,但我需要再画两个点。我需要将一个点正交于连接两个点的直线。下面的片段说明了要点。将点L平移到与线AB正交的L和nJ之间的距离(B是中心点)。与nK的翻译类似。

我已经写了代码:

float alpha = atan2(B.y - A.y,B.x - A.x) - deg90;
float alpha2 = atan2(C.y - B.y, C.x - B.x) - deg90;


nJ.x = L.x + w*cos(alpha); // w is distance between A1 and A2
nJ.y = L.y + w*sin(alpha);
nK.x = L.x + w*cos(alpha2);
nK.y = L.y + w*sin(alpha2);

该代码仅适用于某些点,而不是全部。我需要在nJ和nK的上述计算中修复+唱歌,但我不知道如何。有人有建议吗?

最佳答案

首先,您需要左侧功能:

lhs(v) = [-v.y, v.x]

这会将 vector 逆时针旋转90度。

现在您需要转弯功能:
turn(u, v, w) = sign(lhs(v - u), w - v)

如果您有一条从uvw的折线,turn(u,v,w)会告诉您它是左转(逆时针转)(正),右转(顺时针转)(负)还是共线(0)。

图片中有四条无限线与abbc平行,每对之间有w的距离。

下部的线是:
f(s) = (a + 0.5 * w * normalize(lhs(b - a))) + (b - a) * s
g(t) = (b + 0.5 * w * normalize(lhs(c - b))) + (c - b) * t

您想找到两条线的交点;也就是说,您要在s中求解tf(s) = g(t)。这只是一个带有两个未知数的两个线性方程组。

解决方案是您在图片中指向L = f(s) = g(t)

要计算I,您可以使用完全相同的想法:
f(s) = (a - 0.5 * w * normalize(lhs(b - a))) + (b - a) * s
g(t) = (b - 0.5 * w * normalize(lhs(c - b))) + (c - b) * t

解决I = f(s) = g(t)

更新资料

有了L后,您可以按以下方式计算KnJn
Kn = L - w * normalize(lhs(b - a))
Jn = L - w * normalize(lhs(c - b))

在计算几何代码中,三角函数通常是一种代码异味-并非总是错误的,但通常是错误的。尝试坚持线性代数。

10-08 11:39