|
|
Rectangle2D クラスの使い方 |
H.Kamifuji . |
Rectangle2Dクラスは長方形の物体を表すクラスです。 ここでは、Rectangle2D クラスについて、事例にて説明します。 現在(2021/08)では、JDK-16.0.2 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2021/11)では、JDK-17.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2023/04)では、JDK-20.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2024/10)では、JDK-23 にアップされています。一部、上位互換について、見直しを行っていきます。 |
|
Rectangle2Dクラスは長方形を表すクラスです。 クラス図は次のようになっています。 java.lang.Object ⇒ java.awt.geom.RectangularShape ⇒ java.awt.geom.Rectangle2D public abstract class Rectangle2D extends RectangularShapeRectangle2Dクラスはabstractクラスとなっていますので実際に使用する場合はサブクラスであるRectangle2D.DoubleクラスとRectangle2D.Floatクラスを利用します。 Rectangle2D.DoubleクラスRectangle2D.Doubleクラスは座標や幅と高さの値としてdouble型の値を使用するクラスです。クラス図は次のようになっています。 java.lang.Object ⇒ java.awt.geom.RectangularShape ⇒ java.awt.geom.Rectangle2D ⇒ java.awt.geom.Rectangle2D.Double public static class Rectangle2D.Double extends Rectangle2D implements Serializableコンストラクタは次の2つが用意されています。
1番目のコンストラクタは座標の初期値として座標を(0, 0)、幅と高さもそれぞれ0を指定した場合と同じです。それでは2番目のコンストラクタを確認してみます。 Rectangle2D.Double public Rectangle2D.Double(double x, double y, double w, double h)指定された double 型の座標から Rectangle2D を構築および初期化します。 パラメータ: x - 新しく構築される Rectangle2D の 左上隅の X 座標 y - 新しく構築される Rectangle2D の 左上隅の Y 座標 w - 新しく構築される Rectangle2D の 幅 h - 新しく構築される Rectangle2D の 高さ 1番目の引数でx座標を2番目の引数でy座標をそれぞれdouble型の値で指定します。この2つが長方形の領域の左上の座標となります。そして3番目の引数で幅を4番目の引数で高さをそれぞれdouble型の値で指定します。 具体的には次のように記述します。 Rectangle2D.Double rec = new Rectangle2D.Double(10.0d, 10.0d, 20.0d, 12.0d); Rectangle2D.FloatクラスRectangle2D.Floatクラスは座標や幅と高さの値としてfloat型の値を使用するクラスです。クラス図は次のようになっています。 java.lang.Object ⇒ java.awt.geom.RectangularShape ⇒ java.awt.geom.Rectangle2D ⇒ java.awt.geom.Rectangle2D.Float public static class Rectangle2D.Float extends Rectangle2D implements Serializableコンストラクタは次の2つが用意されています。
1番目のコンストラクタは座標の初期値として座標を(0, 0)、幅と高さもそれぞれ0を指定した場合と同じです。それでは2番目のコンストラクタを確認してみます。 Rectangle2D.Float public Rectangle2D.Float(float x, float y, float w, float h)指定された float 型の座標から Rectangle2D を構築および初期化します。 パラメータ: x - 新しく構築される Rectangle2D の 左上隅の X 座標 y - 新しく構築される Rectangle2D の 左上隅の Y 座標 w - 新しく構築される Rectangle2D の 幅 h - 新しく構築される Rectangle2D の 高さ 1番目の引数でx座標を2番目の引数でy座標をそれぞれfloat型の値で指定します。この2つが長方形の領域の左上の座標となります。そして3番目の引数で幅を4番目の引数で高さをそれぞれfloat型の値で指定します。 具体的には次のように記述します。 Rectangle2D.Float rec = new Rectangle2D.Float(10.0f, 10.0f, 20.0f, 12.0f);Rectangle2D.DoubleクラスとRectangle2D.Floatクラスは内部に保持する値がdouble型かfloat型かの違いがあるだけですので次のページ以降では基本的にRectangle2D.Doubleクラスについて内容を確認していきます。 |
Rectangle2D.Doubleクラスで座標と幅と高さの値を設定するにはコンストラクタで指定する以外にオブジェクトを作成した後でメソッドを使って設定することが出来ます。Rectangle2D.Doubleクラスで用意されている「setRect」メソッドを使います。setRect public void setRect(double x, double y, double w, double h)この Rectangle2D の位置およびサイズを、指定された double 型の値に設定します。 パラメータ: x - この Rectangle2D の 左上隅の X 座標 y - この Rectangle2D の 左上隅の Y 座標 w - この Rectangle2D の幅 h - この Rectangle2D の高さ 1番目の引数でx座標を2番目の引数でy座標をそれぞれdouble型の値で指定します。3番目の引数で幅を4番目の引数で高さをそれぞれdouble型の値で指定します。 具体的には次のように記述します。 Rectangle2D.Double rec = new Rectangle2D.Double(); rec.setRect(10.0d, 10.0d, 12.0d, 8.0d); サンプルプログラム下記のサンプルを実行してみよう。/** * 座標及び幅と高さを設定する */ import java.awt.geom.Rectangle2D; class Rectangle2DTest1{ public static void main(String args[]){ Rectangle2D.Double rec = new Rectangle2D.Double(); rec.setRect(10.0d, 10.0d, 12.0d, 8.0d); System.out.println("(x, y)=(" + rec.x + "," + rec.y + ")"); System.out.println("(w, h)=(" + rec.width + "," + rec.height + ")"); } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxx@dddddddddd Rectangle2DTest]$ java Rectangle2DTest1 (x, y)=(10.0,10.0) (w, h)=(12.0,8.0) |
Rectangle2D.Doubleクラスで座標や幅と高さの値を取得するにはメソッドを使って取得する方法とフィールドの値を参照する方法があります。まずはメソッドで取得する方法を確認します。 まず座標を取得してみます。Rectangle2D.Doubleクラスで用意されている「getX」メソッドと「getY」メソッドを使います。 getXメソッド: getX public double getX()表示枠矩形の左上隅の X 座標を double 精度で返します。 戻り値: 表示枠矩形の 左上隅の X 座標 getYメソッド: getY public double getY()表示枠矩形の左上隅の Y 座標を double 精度で返します。 戻り値: 表示枠矩形の 左上隅の Y 座標 「getX」メソッドは戻り値としてオブジェクトに保存されているX座標を表すdouble型の値を取得できます。「getY」メソッドは戻り値としてオブジェクトに保存されているY座標を表すdouble型の値を取得できます。 次に幅と高さを取得してみます。Rectangle2D.Doubleクラスで用意されている「getWidth」メソッドと「getHeight」メソッドを使います。 getWidthメソッド: getWidth public double getWidth()表示枠矩形の幅を double 精度で返します。 戻り値: 表示枠矩形の幅 getHeightメソッド: getHeight public double getHeight()表示枠矩形の高さを double 精度で返します。 戻り値: 表示枠矩形の高さ 「getWidth」メソッドは戻り値としてオブジェクトに保存されている幅を表すdouble型の値を取得できます。「getHeight」メソッドは戻り値としてオブジェクトに保存されている高を表すdouble型の値を取得できます。 具体的には次のように記述します。 Rectangle2D.Double rec = new Rectangle2D.Double(10.0d, 10.0d, 12.0d, 8.0d); double x = rec.getX(); double y = rec.getY(); double w = rec.getWidth(); double h = rec.getHeight(); フィールドを参照するRectangle2D.Doubleではフィールドとして「x」「y」「width」「height」と言う4つのdouble型の値を保持するフィールドを持っておりオブジェクトから直接参照することが出来ます。具体的には次のように記述します。 Rectangle2D.Double rec = new Rectangle2D.Double(10.0d, 10.0d, 12.0d, 8.0d); double x = rec.x; double y = rec.y; double w = rec.width; double h = rec.height; サンプルプログラム下記のサンプルを実行してみよう。/** * 座標及び幅と高さを取得する */ import java.awt.geom.Rectangle2D; class Rectangle2DTest2{ public static void main(String args[]){ Rectangle2D.Double rec = new Rectangle2D.Double(10.0d, 10.0d, 20.0d, 12.0d); double x = rec.getX(); double y = rec.getY(); double w = rec.getWidth(); double h = rec.getHeight(); System.out.println("(x, y)=(" + x + "," + y + ")"); System.out.println("(w, h)=(" + w + "," + h + ")"); } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxx@dddddddddd Rectangle2DTest]$ java Rectangle2DTest1 (x, y)=(10.0,10.0) (w, h)=(20.0,12.0) |
Rectangle2D.Doubleクラスのオブジェクトが2つあった場合に、両方のオブジェクトが含まれるような最小のRectangle2D.Doubleクラスのオブジェクトを取得する方法を確認します。 Rectangle2D.Doubleクラスで用意されている「createUnion」メソッドを使います。 createUnion public Rectangle2D createUnion(Rectangle2D r)この Rectangle2D と指定された Rectangle2D の和集合を表す新しい Rectangle2D オブジェクトを返します。 パラメータ: r - この Rectangle と結合される Rectangle2D 戻り値: 指定された Rectangle2D と この Rectangle2D の両方を含む 最小のRectangle2D 1番目の引数に指定したRectangle2Dクラスのオブジェクトと、このメソッドを実行するRectangle2Dクラスのオブジェクトの両方が含まれるような新しいRectangle2Dクラスのオブジェクトを戻り値として取得します。 具体的には次のように記述します。 Rectangle2D.Double rec1 = new Rectangle2D.Double(10.0d, 10.0d, 12.0d, 8.0d); Rectangle2D.Double rec2 = new Rectangle2D.Double(15.0d, 12.0d, 20.0d, 7.0d); Rectangle2D.Double recNew = (Rectangle2D.Double)rec2.createUnion(rec1); サンプルプログラム下記のサンプルを実行してみよう。/** * 2つのオブジェクトを含むRectangle2Dオブジェクトを作成する */ import javax.swing.*; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.geom.*; import java.awt.Color; public class Rectangle2DTest3 extends JPanel{ public static void main(String[] args){ JFrame frame = new JFrame(); Rectangle2DTest3 app = new Rectangle2DTest3(); frame.getContentPane().add(app); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 300, 200); frame.setTitle("タイトル"); frame.setVisible(true); } public void paintComponent(Graphics g){ Graphics2D g2 = (Graphics2D)g; Rectangle2D.Double rec1 = new Rectangle2D.Double(10.0d, 10.0d, 120.0d, 80.0d); Rectangle2D.Double rec2 = new Rectangle2D.Double(50.0d, 40.0d, 180.0d, 70.0d); Rectangle2D.Double recNew = (Rectangle2D.Double)rec2.createUnion(rec1); g2.setPaint(Color.PINK); g2.fill(recNew); g2.draw(recNew); g2.setPaint(Color.BLUE); g2.draw(rec1); g2.draw(rec2); } }上記をコンパイルした後で実行すると次のように表示されます。 ![]() |
Rectangle2D.Doubleクラスのオブジェクトが2つあった場合に、両方のオブジェクトに共通して含まれる最大のRectangle2D.Doubleクラスのオブジェクトを取得する方法を確認します。 Rectangle2D.Doubleクラスで用意されている「createIntersection」メソッドを使います。 createIntersection public Rectangle2D createIntersection(Rectangle2D r)この Rectangle2D と指定された Rectangle2D の共通部分を表す新しい Rectangle2D オブジェクトを返します。 パラメータ: r - この Rectangle と重なり合う Rectangle2D 戻り値: 指定された Rectangle2D と この Rectangle2D の両方に含まれる 最大のRectangle2D 1番目の引数に指定したRectangle2Dクラスのオブジェクトと、このメソッドを実行するRectangle2Dクラスのオブジェクトの両方に共通して含まれる新しいRectangle2Dクラスのオブジェクトを戻り値として取得します。 具体的には次のように記述します。 Rectangle2D.Double rec1 = new Rectangle2D.Double(10.0d, 10.0d, 12.0d, 8.0d); Rectangle2D.Double rec2 = new Rectangle2D.Double(15.0d, 12.0d, 20.0d, 7.0d); Rectangle2D.Double recNew = (Rectangle2D.Double)rec2.createIntersection(rec1); サンプルプログラム下記のサンプルを実行してみよう。/** * 2つのオブジェクトに共通するRectangle2Dオブジェクトを作成する */ import javax.swing.*; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.geom.*; import java.awt.Color; public class Rectangle2DTest4 extends JPanel{ public static void main(String[] args){ JFrame frame = new JFrame(); Rectangle2DTest4 app = new Rectangle2DTest4(); frame.getContentPane().add(app); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 300, 200); frame.setTitle("タイトル"); frame.setVisible(true); } public void paintComponent(Graphics g){ Graphics2D g2 = (Graphics2D)g; Rectangle2D.Double rec1 = new Rectangle2D.Double(10.0d, 10.0d, 120.0d, 80.0d); Rectangle2D.Double rec2 = new Rectangle2D.Double(50.0d, 40.0d, 180.0d, 70.0d); Rectangle2D.Double recNew = (Rectangle2D.Double)rec2.createIntersection(rec1); g2.setPaint(Color.PINK); g2.fill(recNew); g2.setPaint(Color.BLUE); g2.draw(rec1); g2.draw(rec2); } }上記をコンパイルした後で実行すると次のように表示されます。 ![]() |
|