argius note

プログラミング関連

長方形の交差判定

昨日に続いて、どう書く?#23のお題。
ロジックとしては全く美しくないですが、下の画像のように、GUIでイメージを確認できるようにしてみました。
...で再確認したら、間違ってますね。2辺以上が接していると誤判定になります。
...訂正。今度はどうでしょう?

import java.awt.*;
import javax.swing.*;

final class Rectangle {
    int left;
    int right;
    int top;
    int bottom;
    Rectangle(int left, int top, int right, int bottom) {
        if (left < right && top < bottom) {
            this.left = left;
            this.right = right;
            this.top = top;
            this.bottom = bottom;
        } else {
            throw new IllegalArgumentException("constraint : left < right && top < bottom");
        }
    }
    int getX() {
        return left;
    }
    int getY() {
        return top;
    }
    int getWidth() {
        return right - left;
    }
    int getHeight() {
        return bottom - top;
    }
}

final class Canvas extends JPanel {
    private Rectangle r1;
    private Rectangle r2;
    Canvas(Rectangle r1, Rectangle r2) {
        setBackground(Color.WHITE);
        this.r1 = r1;
        this.r2 = r2;
    }
    public void paint(Graphics g) {
        super.paint(g);
        g.setColor(new Color(255, 0, 0, 127));
        g.fillRect(r1.getX(), r1.getY(), r1.getWidth(), r1.getHeight());
        g.setColor(new Color(0, 31, 255, 95));
        g.fillRect(r2.getX(), r2.getY(), r2.getWidth(), r2.getHeight());
    }
}

public final class Main {
//  static boolean isBounded(Rectangle r, int x, int y) {
//      return (r.left < x && x < r.right && r.top < y && y < r.bottom);
//  }
  static boolean isOverlapped(Rectangle r1, Rectangle r2) {
//      boolean boundedLT = isBounded(r1, r2.left, r2.top);
//      boolean boundedRT = isBounded(r1, r2.right, r2.top);
//      boolean boundedLB = isBounded(r1, r2.left, r2.bottom);
//      boolean boundedRB = isBounded(r1, r2.right, r2.bottom);
//      return boundedLT || boundedRT || boundedLB || boundedRB;
      int left = Math.max(r1.left, r2.left);
      int right = Math.min(r1.right, r2.right);
      int top = Math.max(r1.top, r2.top);
      int bottom = Math.min(r1.bottom, r2.bottom);
      return (left < right && top < bottom);
  }
  public static void main(String[] args) {
      Rectangle r1 = new Rectangle(100, 100, 150, 150);
      Rectangle r2 = new Rectangle(25, 75, 130, 130);
      String message = (isOverlapped(r1, r2) ? "重なっている" : "重なっていない");
      System.out.println(message);
      // GUI
      JFrame f = new JFrame();
      f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
      f.getContentPane().setLayout(new BorderLayout());
      f.getContentPane().add(new Canvas(r1, r2), BorderLayout.CENTER);
      f.setSize(300, 200);
      f.setVisible(true);
  }
}