我的Java教科书中的一个练习说" 查阅API文档以查找以下方法: 计算包含两个给定矩形的最小矩形。 •返回随机浮点数。"
我已经查看过类Rectangle的Java API,但我找不到计算较小矩形的API。我发现的最接近的方法是结合和界限,但我不认为这是正确的。
我从Java Math类中找到 min 并编写了一个测试程序,看看它是否可行,但 min 不能有矩形参数。
这是我写的代码:
import java.awt.Rectangle;
public class RectangleSize {
public static void main(String[] args)
{
Rectangle a = new Rectangle(5, 5, 10, 10);
Rectangle b = new Rectangle(5, 5, 20, 20);
int min = Math.min(a, b); //In Eclipse, I get an error.
System.out.println(min);
}
}
答案 0 :(得分:1)
我最近使用Big Java Early Object的教科书来学习java。我在第2章中找到了同样的问题。最后我通过查看Java SE8 API列表找到了答案。
首先使用方法.add()组合2个矩形。 注意:实际上,这个组合已经是你需要的。但是你可以在第2步获得一个新的矩形(相同的大小和位置)。
他们使用.getBounds()来获取包含组合的矩形的最小矩形。
。
import java.awt.*;
public class RectangleTester01 {
public static void main(String[] args) {
Rectangle box1 = new Rectangle(10, 20, 40, 40);
Rectangle box2 = new Rectangle(20, 30, 60, 60);
box1.add(box2);
System.out.println(box1);
Rectangle box3 = box1.getBounds();
System.out.println(box3);
}
}
输出是:
java.awt.Rectangle中[X = 10,Y = 20,宽度= 70,高度= 70] java.awt.Rectangle中[X = 10,Y = 20,宽度= 70,高度= 70]
答案 1 :(得分:0)
您想使用Rectangle.contains。你会得到许多矩形。您需要遍历所有矩形,看它是否包含给定的两个矩形。如果是,您应该计算该矩形的大小。最后,您将获得最小尺寸的矩形。
public Rectangle getSmallest(Rectangle one, Rectangle two, Rectangle[] rectangles) {
Rectangle smallest = null;
double area = Double.MAX_VALUE;
for (Rectangle r: rectangles) {
if (r.contains(one) && r.contains(two)) {
calculatedArea = r.getWidth() * r.getHeight();
if (calculatedArea < area) {
area = calculatedArea;
smallest = r;
}
}
}
return r;
}
答案 2 :(得分:0)
这是另一个问题,找到一个包含矩形列表的矩形。find-smallest-area-that-contains-all-the-rectangles。
这是我的粗野回答,这不是准确性,也没有尝试Rectengle的联合功能以及createUnion(Rectengle2D r)。
Math.min可以帮助找到数字数组中的最小数字。你可以为Rectangle写一个类似的。在我看来,这是从1D到2D的东西。顺便说一下,如果你把它扩展到3D或nD对象计算会很有意思。
package com.stackoverflow.q26311076;
import java.awt.Rectangle;
public class Test {
public static void main(String[] args) {
Rectangle a = new Rectangle(5, 5, 10 , 10);
Rectangle b = new Rectangle(5, 5, 20 , 20);
Rectangle min = getMin(a, b) ;
// ...
}
public static Rectangle getMin(Rectangle a, Rectangle b) {
//find the min range in X.
{
double x1 = a.getX();
double x2 = a.getX() + a.getWidth();
double x3 = b.getX();
double x4 = b.getX() + b.getWidth();
double minX1 =Math.min( Math.min(x1, x2), Math.min(x3, x4)) ;
double maxX1 =Math.max( Math.max(x1, x2), Math.max(x3, x4)) ;
}
//find the min range in Y.
{
double y1 = a.getY();
double y2 = a.getY() + a.getHeight();
double y3 = b.getY();
double y4 = b.getY() + b.getHeight();
double minY1 =Math.min( Math.min(y1, y2), Math.min(y3, y4)) ;
double maxY1 =Math.max( Math.max(y1, y2), Math.max(y3, y4)) ;
}
//build new rectangle with X & Y
Rectangle r = new Rectangle();
r.setRect(minX1, minY1, maxX1 - minX1, maxY1 - minY1);
return r;
}
}
答案 3 :(得分:0)
我认为您正在寻找的方法是Rectangle2D.createUnion
。它结合了两个矩形,形成一个较大的矩形,同时包含最少的额外空间。