java - 识别两条线的交点

标签 java graphics coordinate-systems

计算结果如下

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 将变为无穷大,m2 将变为 0,相应地,c1 将变为无穷大,并且 c2=y3,因此使用下面给定公式计算交点得出尽管 L1 和 L2 行必须在 (34,100) 处相交,但结果很奇怪 (NaN)。

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

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

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

最佳答案

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

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

您现在有一个线性系统需要求解:

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

如果det = a1*b2 - a2*b1 = 0(小心精度损失,按 epsilon 进行比较),则系统没有 unic 解。否则,您可以找到系统矩阵的逆矩阵:

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)

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

关于java - 识别两条线的交点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26779371/

相关文章:

java - Iterator和Listiterator的迭代器规则有什么不同吗?(Java)

java - FAIL - 上下文路径/salamander 中的应用程序无法启动

c++ - ( boolean/SFML)如何创建一个检查碰撞的 boolean 值?

java - JOOQ中的fieldIndex是什么

java - 如何解析此 JSON 以提取 orderinfo JsonArray

python - 是否可以用python在平行对齐的轴上绘制多维点

matlab - 应用函数在 Matlab 中获得多个状态

android - android屏幕坐标如何工作?

java - 使用图形的桨碰撞侧检测

c++ - OpenGL 渲染到纹理透明度问题