二维坐标系下,关于求两条之前的交点问题,在国内网站上查来查去都没找到比较清晰易懂的。多数都是解决线段求交点的问题。最后在外国网站找到一篇,感觉讲解比较清晰。现在把他翻译过来。
2D空间中表示一条直线,可以用两点坐标或者一个点和一个方向向量(参数方程)表示。
这里考虑采用参数方程来表示。P = A + tB;A是起点坐标,B是方向向量。t是在方向向量上的长度。
所以,两条直线交于P,A,B点位于直线上。
所以两条直线的方向矢量为v1,v2,有A指向B的向量为v。
可以得到V1’,表示A到P的向量。
这时,考虑B到P的向量,参数方程为 v2 = B + t*v2
从B到P,v2的方向上,经过的多少倍距离t呢?
又根据向量加法的几何意义,可以得到,V1‘ = V + tV2
所以只要知道t是多少,交点P的位置就可以 知道啦。
因为P = B + tV2
但是,现在能够求出t值的条件还不够。
又因为V1和V1’是平行的关系,
所以,他们的外积=0。
V1xV1‘ = 0
所以,总结起来,有如下两个条件:
式A V1’=V+tV2
式B V1xV1‘=0
式A代入式B,得
根据这个等式,求t就可以了。
推导过程:
所以最终结果为:
C#语言代码实现:
float cross(Vector2 A, Vector2 B)
{
return A.x * B.y - B.x * A.y;
}
Vector2 GetRayLineCross_T(Vector2 A, Vector2 v1, Vector2 B, Vector2 v2)
{
Vector2 v = B - A;
v1 = v1.normalized;
v2 = v2.normalized;
float m = cross(v, v1);
float n = cross(v1, v2);
float t = m / n;
return B+v2*t;
}