如何计算无限直线与线段的交点?

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 之间,交点位于在细分市场上。