Java方法只使用左下点,宽度和高度找到两个矩形交集的矩形?
我找到了解决方案,但希望确保我的逻辑是最有效的。 我觉得有更好的方法。 我有左下角的(x,y)坐标,2个矩形的高度和宽度,我需要返回第三个矩形,它们是它们的交点。 我不想发布代码,因为我觉得它是作弊。
- 我弄清楚哪个是最左边和最高的图表。
- 我检查一个是否与另一个完全重叠,然后反向查看另一个是否与X轴上的第一个完全重叠。
- 我检查X轴上的部分交叉点。
- 我基本上重复Y轴的步骤2和3。
- 我做了一些数学计算,并根据这些条件得到矩形的点。
我可能会过度思考并编写效率低下的代码。 我已经参加了一个工作计划,但我想找到最适合自己知识的方法。 如果有人可以同意或指出我正确的方向,那将是伟大的!
为什么不使用JDK API为您执行此操作?
Rectangle rect1 = new Rectangle(100, 100, 200, 240); Rectangle rect2 = new Rectangle(120, 80, 80, 120); Rectangle intersection = rect1.intersection(rect2);
要使用java.awt.Rectangle
类,构造函数的参数是:x,y,width,height,其中x,y是矩形的左上角。 您可以轻松地将左下角点转换为左上角。
我推荐以上内容,但如果您真的想自己动手,可以按照以下步骤操作:
说(x1, y1), (x2, y2)
分别是Rect1的左下角和右下角, (x3, y3), (x4, y4)
是Rect2的角。
- 找到较大的
x1
,x3
和较小的x2
,x4
,分别表示xL
,xR
- 如果
xL >= xR
,则不返回其他交集
- 如果
- 找到
y1
,y3
较大的一个和y2
,y4
较小的一个,分别表示yT
,yB
- 如果
yT >= yB
,则不返回其他交集 - return
(xL, yB, xR-xL, yB-yT)
。
- 如果
更像Java的伪代码:
// Two rectangles, assume the class name is `Rect` Rect r1 = new Rect(x1, y2, w1, h1); Rect r2 = new Rect(x3, y4, w2, h2); // get the coordinates of other points needed later: int x2 = x1 + w1; int x4 = x3 + w2; int y1 = y2 - h1; int y3 = y4 - h2; // find intersection: int xL = Math.max(x1, x3); int xR = Math.min(x2, x4); if (xR <= xL) return null; else { int yT = Math.max(y1, y3); int yB = Math.min(y2, y4); if (yB <= yT) return null; else return new Rect(xL, yB, xR-xL, yB-yT); }
如您所见,如果您的矩形最初由两个对角线定义,那么它将更容易,您只需要// find intersection
部分。
接受的答案是不正确的。 这是我的版本,这是正确的。
不要使用接受的答案。
//returns true when intersection is found, false otherwise. //when returning true, rectangle 'out' holds the intersection of r1 and r2. private static boolean intersection2(Rectangle r1, Rectangle r2, Rectangle out) { float xmin = Math.max(r1.x, r2.x); float xmax1 = r1.x + r1.width; float xmax2 = r2.x + r2.width; float xmax = Math.min(xmax1, xmax2); if (xmax > xmin) { float ymin = Math.max(r1.y, r2.y); float ymax1 = r1.y + r1.height; float ymax2 = r2.y + r2.height; float ymax = Math.min(ymax1, ymax2); if (ymax > ymin) { out.x = xmin; out.y = ymin; out.width = xmax - xmin; out.height = ymax - ymin; return true; } } return false; }
您还可以使用Rectangle源代码与您自己的算法进行比较:
/** * Computes the intersection of this
Rectangle
with the * specifiedRectangle
. Returns a newRectangle
* that represents the intersection of the two rectangles. * If the two rectangles do not intersect, the result will be * an empty rectangle. * * @param r the specifiedRectangle
* @return the largestRectangle
contained in both the * specifiedRectangle
and in * thisRectangle
; or if the rectangles * do not intersect, an empty rectangle. */ public Rectangle intersection(Rectangle r) { int tx1 = this.x; int ty1 = this.y; int rx1 = rx; int ry1 = ry; long tx2 = tx1; tx2 += this.width; long ty2 = ty1; ty2 += this.height; long rx2 = rx1; rx2 += r.width; long ry2 = ry1; ry2 += r.height; if (tx1 < rx1) tx1 = rx1; if (ty1 < ry1) ty1 = ry1; if (tx2 > rx2) tx2 = rx2; if (ty2 > ry2) ty2 = ry2; tx2 -= tx1; ty2 -= ty1; // tx2,ty2 will never overflow (they will never be // larger than the smallest of the two source w,h) // they might underflow, though... if (tx2 < Integer.MIN_VALUE) tx2 = Integer.MIN_VALUE; if (ty2 < Integer.MIN_VALUE) ty2 = Integer.MIN_VALUE; return new Rectangle(tx1, ty1, (int) tx2, (int) ty2); }
- 使用java commandAPDU读取SLE4442智能卡中的写入数据?
- 在Eclipse 4.2上安装WindowBuilder
- 将int转换为字节数组时的不同结果 – .NET vs Java
- 如何以编程方式登录j_security_check
- Spring Boot 1.2.5 Hibernate JPA嵌套了很多对很多关系
- 如何将jasper文件路径传递给子报表的子报表
- 将项目添加到购物车时,playframework中的function测试失败
- Weblogic错误:由以下原因引起:weblogic.transaction.internal.AppSetRollbackOnlyException:在事务上调用setRollbackOnly
- Java Swing应用程序消息对话框帮助