计算 Java 中两个矩形之间单条线的点
Calculate the points of a single line between two rectangles in Java
假设我们已经计算出两个不重叠的矩形的中心线段。
...如果我们只考虑矩形之间的两个交点,Java 中重新计算该线段的点的最简单方法是什么?
例如:
这本质上是一道数学题。可能有一些方法可以提供帮助,但这只需要仔细阅读 Math
class 和 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));
}
}
假设我们已经计算出两个不重叠的矩形的中心线段。
...如果我们只考虑矩形之间的两个交点,Java 中重新计算该线段的点的最简单方法是什么?
例如:
这本质上是一道数学题。可能有一些方法可以提供帮助,但这只需要仔细阅读 Math
class 和 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));
}
}