1

だから私はJavaの割り当てに取り組んでいます.Rectangleクラスを作成しなければなりませんでした。このクラスは、重なり合う長方形を描画するプログラムで使用され、長方形が重なり合う場所では、新しい長方形が新しい色で描画されます. HW の説明へのリンクを含めました。私が説明しようとするよりも、あなたに見てもらう方が簡単だと思ったからです。 /hw6.html

私は現在、重複した新しい長方形を描画する getOverlap メソッドの作成に取り組んでいます。明らかに四角形を描画する描画メソッドを作成する必要があり、getOverlap メソッドが以前に定義された変数の新しいパラメーターを定義して描画メソッドに再ルーティングするかどうかについて混乱していますか? どんな助けでも大歓迎です。

4

3 に答える 3

5

を少し巧妙に使用するとAreaGraphics2DAPI にそれを実行させることができます。

基本的にArea、2 つの長方形に対する排他的論理和演算の結果である を作成します。Area次に、2 つの長方形を足し合わせた結果であるからこれを引きます。

ここに画像の説明を入力

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.geom.Area;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class OverlappingRectangles {

    public static void main(String[] args) {
        new OverlappingRectangles();
    }

    public OverlappingRectangles() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();

            Rectangle r1 = new Rectangle(0, 0, 150, 150);
            Rectangle r2 = new Rectangle(50, 50, 150, 150);

            g2d.setColor(Color.RED);
            g2d.fill(r1);
            g2d.setColor(Color.BLUE);
            g2d.fill(r2);

            Area a1 = new Area(r1);
            a1.exclusiveOr(new Area(r2));
            Area a2 = new Area(r2);
            a2.add(new Area(r1));
            a2.subtract(a1);

            g2d.setColor(Color.GREEN);
            g2d.fill(a2);

            g2d.dispose();
        }
    }

}
于 2013-03-20T03:36:50.107 に答える
3

MadProgrammer のコードをいじってみると、これを行う簡単な方法がいくつか見つかりました。

エリアの使用:

Area yellow = new Area(r1);
yellow.intersect( new Area(r2) );
g2d.setColor(Color.YELLOW);
g2d.fill(yellow);

または、別の Rectangle を使用します。

Rectangle green = r1.intersection(r2);
g2d.setColor(Color.GREEN);
g2d.fill(green);
于 2013-03-20T04:30:43.287 に答える
2

が許可されている場合java.awt.Rectangle、実装での使用方法の概要は次のとおりです。

private static class Rectangle {
    private int x1, y1, x2, y2, r, g, b;
    private java.awt.Rectangle r1 = new java.awt.Rectangle();
    private java.awt.Rectangle r2 = new java.awt.Rectangle();
    private java.awt.Rectangle r3;

    public Rectangle(int x1, int y1, int x2, int y2, int r, int g, int b) {
        ...
    }

    private void draw(Graphics page) {
        ...
    }

    private boolean overlapsWith(Rectangle r) {
        r1.setBounds(...);
        r2.setBounds(...);
        return r1.intersects(r2);
    }

    private Rectangle getOverlap(Rectangle r) {
        r1.setBounds(...);
        r2.setBounds(...);
        r3 = r1.intersection(r2);
        return new Rectangle(...);
    }
于 2013-03-20T04:52:39.310 に答える