计算Java中两个矩形之间的单条线的点

问题描述

假设我们已经计算了两个不重叠的矩形中心之间的线段。

...如果我们只考虑矩形之间的两个交点,那么在 Java 中重新计算该线段的点的最简单方法是什么?

例如:

Diagram of line intersection

解决方法

这本质上是一道数学题。可能有一些方法可以提供帮助,但这仅需要仔细阅读 Math 类和 java.awt.geom 包。

  • 首先,使用原点以及宽度和高度找到每个矩形的中心坐标。
  • 然后找到这些坐标 y = mx + b 之间的直线方程。 m 是斜率,by 截距。此处,x*y* 值是矩形的中心。 m = (y1-y2)/(x1-x2)b = y1 - m*x1 或者您也可以使用 y2x2
  • 然后找到该线与每条边的交点。同样,您将需要使用原点以及宽度和高度来帮助解决这个问题。您可能需要应用刚刚推导出的方程来确定该线是否与边、顶部或底部相交。
  • 然后使用这些交点,使用距离公式找到直线(想想毕达哥拉斯)。或Math.hypot()

注意:请记住,如前所述,该线可能并不总是在两侧相交。根据矩形的相对位置,它可以是顶部和底部或顶部和侧面或底部和侧面的组合。我建议你在纸上做这件事,并在尝试编码之前涵盖所有可能性。

,

WJS,你发布的答案给了我这个想法......对于每个矩形,我只需要遍历代表矩形每条边的 4 条线并找到与中心线相交的第一条线。

计算每个矩形的 4 行中的每一行很容易。然后我将每一行都添加到以下代码中:

public class Intersection {
    
    private static class Point {
        double x,y;
 
        Point(double x,double y) {
            this.x = x;
            this.y = y;
        }
 
        @Override public String toString() {
            return String.format("{%f,%f}",x,y);
        }
    }
 
    private static class Line {
        Point s,e;
 
        Line(Point s,Point e) {
            this.s = s;
            this.e = e;
        }
    }
 
    private static final Point findIntersection(Line l1,Line l2) {
        double a1 = l1.e.y - l1.s.y;
        double b1 = l1.s.x - l1.e.x;
        double c1 = a1 * l1.s.x + b1 * l1.s.y;
 
        double a2 = l2.e.y - l2.s.y;
        double b2 = l2.s.x - l2.e.x;
        double c2 = a2 * l2.s.x + b2 * l2.s.y;
 
        double delta = a1 * b2 - a2 * b1;
        return new Point((b2 * c1 - b1 * c2) / delta,(a1 * c2 - a2 * c1) / delta);
    }
 
    public static void main(String[] args) {
        Line l1 = new Line(new Point(4,0),new Point(6,10));
        Line l2 = new Line(new Point(0,3),new Point(10,7));
        System.out.println(findIntersection(l1,l2));
 
        l1 = new Line(new Point(0,3));
        l2 = new Line(new Point(4,new Point(4,10));
        System.out.println(findIntersection(l1,l2));
    }
}