【问题标题】:Identification of the intersection point of two lines识别两条线的交点
【发布时间】:2014-11-06 12:21:11
【问题描述】:

这里是计算

L1 = 连接点 A(x1,y1) 和 B(x2,y2) 的线 L2 = 线连接点 c(x3,y3) 和 D(x4,y4)

L1线

直线方程:y = m1*x + c1

斜率 m1 : (y2-y1)/(x2-x1)

Y 截距:c1 = (y1 - m1*x1)

L2线

直线方程:y = m2*x + c2

斜率 m2 : (y4-y3)/(x4-x3)

Y 截距:c2 = (y3 - m2*x3)

对于交点

求解上述方程我们得到

x = (c2 -c1)/(m1-m2)

y = (c1*m2 - c2*m1)/(m2-m1)

以上这些计算是用来计算我的java程序中的交点的。

问题

当两条线分别平行于x轴和y轴时会出现问题。例如如果连接点如下

L1 = A(34,112) B(34,180) ...(x坐标值保持不变)

L2 = C(72,100) D(88,100) ...(y坐标值保持不变)

现在 m1 将变为 Infinity 并且 m2 将变为 0 因此 c1 将变为 Infinity 并且 c2=y3 因此使用以下给定公式计算交点给出奇怪的 (NaN) 结果,尽管线 L1 和 L2 必须在 (34,100) 处相交。

x = (c2 -c1)/(m1-m2)

y = (c1*m2 - c2*m1)/(m2-m1)

为什么会出现这样的问题?这个问题是如何使用数学来处理的,以便可以在程序中实现。

【问题讨论】:

    标签: java graphics coordinate-systems


    【解决方案1】:

    平行于 y 轴的线不能表示为y = ax + b。您需要使用直线ax + by + c = 0 的一般方程。确定两条线的方程的系数并求解它们相交的线性系统。确保系统的行列式不为0,否则无解,或无穷大(可以认为是无解的另一种情况)。

    您可以很容易地获得ab 系数,考虑到您的线段的法向量(如果vect(AB) = (x,y) 然后normal(AB) = (-y,x) = (a,b)。然后通过在方程中引入A 的坐标来确定c:@ 987654328@.

    你现在有一个线性系统要解决:

    (S) : { a1*x + b1*y + c1 = 0    
          { a2*x + b2*y + c2 = 0
    

    如果det = a1*b2 - a2*b1 = 0(注意精度损失,请进行ε比较),则系统没有统一解决方案。否则,您可以找到系统矩阵的逆:

    M = (a1  b1), M^(-1) = 1/det * ( b2  -b1) 
        (a2  b2)                   (-a2   a1) 
    

    现在你只需要计算

    M^(-1) * (-c1) = 1/det * (-b2*c1 + b1*c2)
             (-c2)           ( a2*c1 - a1*c2)
    

    就是这样,你有你的解决方案!

    【讨论】:

    • 您的意思是 y=mx+c 不足以定义所有直线。我不是数学专业的,我是一名软件专业人士,但我从未了解过直线方程有斜率的缺点。
    • 描述所有非垂直线就足够了。它实际上是ax + by + c = 0 的另一种形式。如果b 不为0,您可以除以b,您有:y = -a/b*x - c/b。如果b 为 0,则在数学上是不可能的。
    • 我给出了解决方案的每一步,如果您需要我突出显示哪些是实际代码以及哪些仅用于显示数学推理,请告诉我
    • 我认为直线的一般方程是有道理的。你的决定性解决方案是优雅的。谢谢
    • @Dici :很高兴看到一些信息学家回忆起他们的大学数学课 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多