【问题标题】:Calculate the points of a single line between two rectangles in Java在Java中计算两个矩形之间的单条线的点
【发布时间】:2021-05-11 16:13:05
【问题描述】:

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

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

例如:

【问题讨论】:

    标签: java graphics 2d line rectangles


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      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), new Point(10, 3));
              l2 = new Line(new Point(4, 0), new Point(4, 10));
              System.out.println(findIntersection(l1, l2));
          }
      }  
      

      【讨论】:

      • 很高兴我能提供帮助。
      • 一个增加的功能取决于它在哪一边,我可以保持点的x或y与矩形边相同
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-16
      • 1970-01-01
      • 2015-01-25
      • 1970-01-01
      • 2016-10-19
      • 2019-07-09
      相关资源
      最近更新 更多