解决程序中的两个线性方程
我有两条线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的伪代码。
-
将每一行更改为参数化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
-
对于某些
t1
,t2
(即它们不平行),假设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
-
求解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]
-
此时,如果
t1
和t2
都在0.0 <= t <= 1.0
的范围内,则段相交! 通过Puv(t1) = UV_b + UV_m * t1
找到交点是很简单的。
此方法可以很好地处理垂直线。