有没有一种方法可以从两个给定的矩形中计算出一个较小的矩形?

时间:2014-10-11 04:30:57

标签: java math

我的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);
    }
}

4 个答案:

答案 0 :(得分:1)

我最近使用Big Java Early Object的教科书来学习java。我在第2章中找到了同样的问题。最后我通过查看Java SE8 API列表找到了答案。

  1. 首先使用方法.add()组合2个矩形。 注意:实际上,这个组合已经是你需要的。但是你可以在第2步获得一个新的矩形(相同的大小和位置)。

  2. 他们使用.getBounds()来获取包含组合的矩形的最小矩形。

  3. 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。它结合了两个矩形,形成一个较大的矩形,同时包含最少的额外空间。