【问题标题】:Is there a method that computes a smaller rectangle out of two given rectangles?有没有一种方法可以从两个给定的矩形中计算出一个较小的矩形?
【发布时间】:2014-12-06 07:28:15
【问题描述】:

我的 Java 教科书中的一个练习说“请查阅 API 文档以找到以下方法: 计算包含两个给定矩形的最小矩形。 • 返回一个随机浮点数。"

我查看了类 Rectangle 的 Java API,但我找不到一个计算较小矩形的 API。我发现的最接近的方法是 union 和 bounds,但我认为这不正确。

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

【问题讨论】:

  • "...找到较小的矩形。"阅读很重要。
  • “包含两个给定矩形的最小矩形”。要找到它,您必须有多个矩形。如果你只有很多,那么一些大矩形里面可以有两个小矩形。
  • Math.min(int,int);接受 int 参数。而你试图通过矩形!
  • “包含两个给定矩形的最小矩形”与“较小的矩形”(两个给定的)不同。听起来您实际上是被要求创建一个 new 矩形,其中包含原来的两个矩形,且额外空间最少。

标签: java math


【解决方案1】:

您想使用 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】:

这里还有一个问题是要找到一个包含矩形列表的矩形。find-smallest-area-that-contains-all-the-rectangles

这是我的粗鲁回答,它不准确,也没有尝试 Rectengle 的 union 函数以及 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;
    }

}

【讨论】:

  • OP 明确表示这是家庭作业问题。您为什么要发布答案?另外,你的代码是做什么的?简单地发布没有 cmets 或解释的代码并不是一个好的答案。
  • @theGreenCabbage err.. 只提供一种使用蛮力的方法。 IMO,在大多数情况下,蛮力并不是一个好主意。希望OP能想出一个更好的作业答案。用小得到大。 -->>> 在阅读时,我只是编写了一个 API 来“计算包含两个给定矩形的最小矩形”。
  • 希望添加的cmets和解释能帮助你理解我想说的话。
【解决方案3】:

我认为您正在寻找的方法是Rectangle2D.createUnion。它将两个矩形组合成一个更大的矩形,其中包含两个矩形,且额外空间最小。

【讨论】:

    【解决方案4】:

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

    1. 首先使用 .add() 方法来组合 2 个矩形。 注意:实际上,这个组合的已经是你需要的了。但是您可以在第 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,width=70,height=70] java.awt.Rectangle[x=10,y=20,width=70,height=70]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-27
      • 1970-01-01
      • 2011-06-22
      • 1970-01-01
      • 1970-01-01
      • 2011-06-02
      • 2011-06-30
      相关资源
      最近更新 更多