【发布时间】:2021-05-11 16:13:05
【问题描述】:
假设我们已经计算出两个不重叠的矩形中心之间的线段。
...如果我们只考虑矩形之间的两个交点,那么在 Java 中重新计算该线段的点最简单的方法是什么?
例如:
【问题讨论】:
标签: java graphics 2d line rectangles
假设我们已经计算出两个不重叠的矩形中心之间的线段。
...如果我们只考虑矩形之间的两个交点,那么在 Java 中重新计算该线段的点最简单的方法是什么?
例如:
【问题讨论】:
标签: java graphics 2d line rectangles
这本质上是一道数学题。可能有一些方法可以提供帮助,但只需要仔细阅读 Math 类和 java.awt.geom 包。
y = mx + b 之间的直线方程。 m 是斜率,b 是 y 截距。这里,x* 和 y* 值是矩形的中心。 m = (y1-y2)/(x1-x2)。 b = y1 - m*x1 或者你也可以使用y2 和x2。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), new Point(10, 3));
l2 = new Line(new Point(4, 0), new Point(4, 10));
System.out.println(findIntersection(l1, l2));
}
}
【讨论】: