我有两条线UV和PQ,U(15,10)V(50,25)和P(40,10)和Q(30,30)。
我发现这两点之间有一个交点。 我正在为此形成两个线性方程:
eq 1:
Ux + t(Vx-Ux) = Px +s(Qx-Px)
EQ2
我想用C程序求解这些方程,得到t或s的值。
我使用了第二个等式中的t
并将其替换为第一个等式,得到一个公式来找到s。但它没有成功。我怎样才能在程序中解决这个问题?
答案 0 :(得分:1)
使用此等式Intersection of 2 Lines。您可以使用长扩展形式,也可以抽象出计算2x2行列式的函数。小心使用整数,可能会溢出。
答案 1 :(得分:1)
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 / (...
。
答案 2 :(得分:0)
找到UV和PQ的渐变
紫外线的渐变是:m = (Vy-Uy)/(Vx-Ux)
。然后使用y = mx + c
找到c,因为我们知道y,m,x的值。再次为PQ做这一步。
有2个方程后,可以使用替换找到交点。最后,将其应用于您的c代码。
答案 3 :(得分:0)
OP的评论说“找到两个线段的交叉点”。
AS OP提供了伪代码,我假设需要类似C的伪代码。
将每一行更改为参数化形式P(t)= b + m * t(使用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
在<{1}}范围内 ,那么这些细分相交! 0.0 <= t <= 1.0
找到交叉点很简单。
此方法可以很好地处理垂直线。