[英]How does this function compute the distance from line start to the intersection?
我在 GLSL 中有这段代码,如下所示:
float Intersect(vec2 lineOneStart, vec2 lineOneEnd, vec2 lineTwoStart, vec2 lineTwoEnd) {
vec2 line2Perp = vec2(lineTwoEnd.y - lineTwoStart.y, lineTwoStart.x - lineTwoEnd.x);
float line1Proj = dot(lineOneEnd - lineOneStart, line2Perp);
if (abs(line1Proj) < 0.0001) {
return 0.;
}
return dot(lineTwoStart - lineOneStart, line2Perp) / line1Proj;
}
我已经绘制了我认为这个编码正在做什么的可视化,如下图所示:
希望这张图片是正确的,如果不是,请告诉我。
基本上,我正在尝试编写一个 function ,给定两条线段,返回从lineOneStart
到lineTwo
交点的距离。 实际上,lineOne 在它的方向上永远延伸,但为了简单起见,我只是给它一个很长的长度,这样它就会一直到达lineTwo
。
我从其他地方获得了这段代码,但问题是我不明白它是如何工作的,或者即使它正在工作。 我从本文底部发布的演示中获得了代码
在文章中,作者将代码描述如下:
...计算当前角度的线段和光线之间的交点,但这只是几个点积和一个分界线,所以对于现代 GPU 来说没有什么太重的。
但它似乎并没有这样做? 在 function 的第一行似乎使行 go 到lineTwo
的开始,而不是沿着它的角度到最近的交点。
此外,点积对我来说一直很神秘,所以我很难看到这里的两个点积如何给我声称的结果。 这段代码是否正确,如果正确,它是如何工作的?
如果您有一条由点P
和归一化方向R
定义的无限线,以及由点Q
和方向S
定义的第二条无限线,那么无限线X
的交点是:
alpha ... angle between Q-P and R
beta ... angle between R and S
gamma = 180° - alpha - beta
h = | Q - P | * sin(alpha)
u = h / sin(beta)
t = | Q - P | * sin(gamma) / sin(beta)
t = dot(Q-P, (S.y, -S.x)) / dot(R, (S.y, -S.x)) = determinant(mat2(Q-P, S)) / determinant(mat2(R, S))
u = dot(Q-P, (R.y, -R.x)) / dot(R, (S.y, -S.x)) = determinant(mat2(Q-P, R)) / determinant(mat2(R, S))
X = P + R * t = Q + S * u
一般来说,两个向量的点积等于两个向量之间的夹角的余弦乘以两个向量的大小(长度)。
dot( A, B ) == | A | * | B | * cos( angle_A_B )
在你的情况下line2Perp
是(Sy, -Sx)
:
vec2 line2Perp = vec2(lineTwoEnd.y - lineTwoStart.y, lineTwoStart.x - lineTwoEnd.x);
line1Proj
是dot(R, (Sy, -Sx))
:
float line1Proj = dot(lineOneEnd - lineOneStart, line2Perp);
和lineTwoStart - lineOneStart
是QP
:
return dot(lineTwoStart - lineOneStart, line2Perp) / line1Proj;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.