解决程序中的两个线性方程

我有两条线UV和PQ,U(15,10)V(50,25)和P(40,10)和Q(30,30)。

我发现这两点之间有一个交点。 我正在为此形成两个线性方程:

方程1:

Ux + t(Vx-Ux) = Px +s(Qx-Px) 

EQ2

我想用C程序求解这些方程,得到t或s的值。

我使用了第二个等式中的t并将其替换为第一个等式,得到一个公式来找到s。 但它没有成功。 我怎样才能在程序中解决这个问题?

使用此等式2线的交点 。 您可以使用长扩展forms,也可以抽象出计算2×2行列式的函数。 小心使用整数,你可能会溢出。

 int s,sa,sb; 

好的, sa是一个整数。

 sa=1/((Vx-Ux)*(Qy-Py)-(Qx-Px)*(Vy-Uy)); 

由于这些都是整数,因此您使用整数数学取整数的倒数。 如果整数为零,则结果为无穷大,如果为1,则为1,如果为负,则为负1,如果为负,则为0。 所以sa只有三个可能的值,或者你崩溃了。

也许你应该考虑不使用整数数学? 也许float sa;sa = 1.0 / (...

找到UV和PQ的梯度

UV梯度为: m = (Vy-Uy)/(Vx-Ux) 。 然后使用y = mx + c找到c,因为我们知道y,m,x的值。 为PQ再次迈出这一步。

有2个方程后,可以使用替换找到交点。 最后,将其应用于您的c代码。

OP的评论说“找到两个线段的交叉点”。

AS OP提供了伪代码,我假设需要类似C的伪代码。

  1. 将每一行更改为参数化formsP(t)= b + m * t(使用double
    UV_m.x = Vx - Ux
    UV_m.y = Vy - Uy
    UV_b.x = Ux
    UV_b.y = Uy
    // same for PQ
    // Now your have 2 2-dimensional equations.
    // Puv(t1) = UV_b + UV_m * t1 and
    // Ppq(t2) = PQ_b + PQ_m * t2

  2. 对于某些t1t2 (即它们不平行),假设Puv(t1) == Ppq(t2) )。
    UV_b.x + UV_m.y * t1 = PQ_b.x + PQ_m.x * t2
    UV_b.y + UV_m.y * t1 = PQ_b.y + PQ_m.y * t2

  3. 求解2D 矩阵方程(我假设OP可以求解2D矩阵,否则建议)如果确定为0.0,则线是平行的,作为特殊情况处理。 (它们可能是共同不雅的,可能/可能不会重叠。)

    [UV_m.x - PQ_m.x][t1] = [PQ_b.x - UV_b.x]
    [UV_m.y - PQ_m.y][t2] = [PQ_b.y - UV_b.y]

  4. 此时,如果t1t2 0.0 <= t <= 1.0的范围内,则段相交! 通过Puv(t1) = UV_b + UV_m * t1找到交点是很简单的。

此方法可以很好地处理垂直线。