点转换ortghogonally到线

时间:2014-09-05 19:07:33

标签: c++ opengl math linear-algebra

我目前正在制作一个绘制粗多段线的项目,我在OpenGL中使用插值。我设法计算了所有必要的点,但我需要再画两点。我需要将一个点正交转换为连接两个点的线。下面的scatch显示了什么是积分。点L将被转换为L和nJ之间的距离与线AB正交(B是中心点)。类似的事情是翻译到nK。

enter image description here

我写了代码:

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的计算中修复+唱歌,但我不知道如何。有人有意见吗?

1 个答案:

答案 0 :(得分:1)

首先你需要左手边的功能:

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

这会将矢量逆时针旋转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))

在计算几何代码中,三角函数通常是代码气味 - 它并不总是错误的,但它通常是错误的。尽量坚持使用线性代数。