我有两条线 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 的公式。但它没有成功。如何在程序中解决这个问题?
我有两条线 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 的公式。但它没有成功。如何在程序中解决这个问题?
使用此等式Intersection of 2 Lines。您可以使用长扩展形式,也可以抽象出一个计算 2x2 行列式的函数。小心使用整数,你可能会溢出。
int s,sa,sb;
好的,sa
是整数。
sa=1/((Vx-Ux)*(Qy-Py)-(Qx-Px)*(Vy-Uy));
由于这些都是整数,因此您将使用整数数学来取整数的倒数。如果整数为零,则结果为无穷大,如果为一,则为负一,如果为负一,则结果为无穷大,否则为零。所以sa
只有三个可能的值,否则你会崩溃。
也许您应该考虑不使用整数数学?也许float sa;
和sa = 1.0 / (...
。
求 UV 和 PQ 的梯度
UV的梯度为:m = (Vy-Uy)/(Vx-Ux)
。然后通过使用找到c,y = mx + c
因为我们知道y,m,x的值。为 PQ 再次执行该步骤。
在你有 2 个方程后,你可以通过代入找到交点。最后,将其应用于您的 c 代码。
OP 的评论说“找到两条线段的交点”。
由于 OP 提供了伪代码,我假设需要类似 C 的伪代码。
将每一行更改为参数化形式 P(t) = b + m*t (use double
)
UV_m.x = V.x - U.x
UV_m.y = V.y - U.y
UV_b.x = U.x
UV_b.y = U.y
// 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
假设某些Puv(t1)
== ,(即它们不是平行的)。Ppq(t2)
t1
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
。
此方法可以很好地处理垂直线。