二维坐标系下,关于求两条之前的交点问题,在国内网站上查来查去都没找到比较清晰易懂的。多数都是解决线段求交点的问题。最后在外国网站找到一篇,感觉讲解比较清晰。现在把他翻译过来。
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;
- }