我目前正在研究绘制粗折线的项目,并且正在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)
如果您有一条从
u
到v
到w
的折线,turn(u,v,w)
会告诉您它是左转(逆时针转)(正),右转(顺时针转)(负)还是共线(0)。图片中有四条无限线与
ab
和bc
平行,每对之间有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
中求解t
和f(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
后,您可以按以下方式计算Kn
和Jn
。Kn = L - w * normalize(lhs(b - a))
Jn = L - w * normalize(lhs(c - b))
在计算几何代码中,三角函数通常是一种代码异味-并非总是错误的,但通常是错误的。尝试坚持线性代数。