问题描述
假设我们已经计算了两个不重叠的矩形中心之间的线段。
...如果我们只考虑矩形之间的两个交点,那么在 Java 中重新计算该线段的点的最简单方法是什么?
例如:
解决方法
这本质上是一道数学题。可能有一些方法可以提供帮助,但这仅需要仔细阅读 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));
l2 = new Line(new Point(4,new Point(4,10));
System.out.println(findIntersection(l1,l2));
}
}