可能重复:
你如何发现其中两条线段相交?
给定两个点a
和b
加上两个向量v
和u
我想找到一个第三点c
,这是通过以下方式交叉点:
vector2 intersection(vector2 a, vector2 v, vector2 b, vector2 u)
{
float r, s;
a + r * v = b + s * u;
r * v - s * u = b - a
r * v.x - s * u.x = b.x - a.x
r * v.y - s * u.y = b.y - a.y
}
是否有任何其他的方式比用高斯消元法来解决这个系统? 或者,这是最好的(或至少可接受的)的方式来处理这个问题?
编辑 :定义vector2
typedef union vector2
{
float v[2];
struct { float x, y; };
} vector2;
a
和b
也是类型的vector2
,因为一个点和向量之间的唯一区别是在它是由仿射变换变换的方式。
这是简单的数学。
但是,首先,检查是否有交集。 如果两个向量是平行的,你将无法解决:
// Edit this line to protect from division by 0
if (Vy == 0 && Uy == 0) || ((Vy != 0 && Uy != 0 && (Vx/Vy == Ux/Uy)) // => Fail.
然后(我想表明的计算因为他们长,但):
R = (AxUy - AyUx + ByUx - BxUy) / (VyUx - VxUy)
S = (Ax - Bx + RVx) / Ux
希望帮你。
看起来像一个分配问题给我。 下面是这将有助于你写的代码逻辑。
让我们把第一缕曙光R0
。
上的点的轨迹R0
定义为P
:
P = P0 + alpha x V0
对于第二射线R1
:
P = P1 + beta x V1
因为他们应该相交:
P0 + alpha x V0 = P1 + beta x V1
alpha
和beta
是未知数,我们有两个方程x
任何y
。
求解未知数并取回交点。
即
P0.x + alpha * V0.x = P1.x + beta * V1.x
P0.y + alpha * V0.y = P1.y + beta * V1.y
解决alpha
和beta
。
如果有两个正实数解alpha
和beta
,射线相交。
如果有两个一真实的,但至少一个负溶液alpha
和beta
,扩展射线相交。