如何计算无限直线与线段的交点?
How to calculate the intersection point between an infinite line and a line segment?
基本上,满足此签名的函数:
function getLineIntersection(vec2 p0, vec2 direction, vec2 p2, vec2 p3) {
// return a vec2
}
我查看了现有的解决方案,它们似乎都涉及如何找到两条线段之间或两条无限直线之间的交点。这个直线有初始位置,角度,需要判断是否与线段相交的问题有没有解决办法?基本上是这样的:
应该有一条线段从一个位置开始并有一个单位方向,另一条线段只是一条由两点连接的线。这是否可能,如果可能,是否有计算交点的好方法(如果存在)?
如果你有一条由点 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
如果要检测交点是否在留置权上,需要比较交点的距离和直线的长度。
如果t
在[0.0, 1.0] for X = p2 + (p3 - p2) * t
,交点(X
)在线段上
vec2 getLineIntersection(vec2 p0, vec2 direction, vec2 p2, vec2 p3)
{
vec2 P = p2;
vec2 R = p3 - p2;
vec2 Q = p0;
vec2 S = direction;
vec2 N = vec2(S.y, -S.x);
float t = dot(Q-P, N) / dot(R, N);
if (t >= 0.0 && t <= 1.0)
return P + R * t;
return vec2(-1.0);
}
从两条无限直线的交点开始,以参数形式表示(例如,A + tp,其中A是“起点”,p是方向向量,t是标量参数)。求解两个方程组,得到交点的两个参数。
现在如果你的一条线真的是线段 AB,并且 B = A + p(即方向向量从 A 到 B),那么如果参数 t 在 0 和 1 之间,交点位于在细分市场上。
基本上,满足此签名的函数:
function getLineIntersection(vec2 p0, vec2 direction, vec2 p2, vec2 p3) {
// return a vec2
}
我查看了现有的解决方案,它们似乎都涉及如何找到两条线段之间或两条无限直线之间的交点。这个直线有初始位置,角度,需要判断是否与线段相交的问题有没有解决办法?基本上是这样的:
应该有一条线段从一个位置开始并有一个单位方向,另一条线段只是一条由两点连接的线。这是否可能,如果可能,是否有计算交点的好方法(如果存在)?
如果你有一条由点 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
如果要检测交点是否在留置权上,需要比较交点的距离和直线的长度。
如果t
在[0.0, 1.0] for X = p2 + (p3 - p2) * t
X
)在线段上
vec2 getLineIntersection(vec2 p0, vec2 direction, vec2 p2, vec2 p3)
{
vec2 P = p2;
vec2 R = p3 - p2;
vec2 Q = p0;
vec2 S = direction;
vec2 N = vec2(S.y, -S.x);
float t = dot(Q-P, N) / dot(R, N);
if (t >= 0.0 && t <= 1.0)
return P + R * t;
return vec2(-1.0);
}
从两条无限直线的交点开始,以参数形式表示(例如,A + tp,其中A是“起点”,p是方向向量,t是标量参数)。求解两个方程组,得到交点的两个参数。
现在如果你的一条线真的是线段 AB,并且 B = A + p(即方向向量从 A 到 B),那么如果参数 t 在 0 和 1 之间,交点位于在细分市场上。