長方形の交差判定
昨日に続いて、どう書く?#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); } }