|
|
QuadCurve2D クラスの使い方 |
H.Kamifuji . |
QuadCurve2Dクラスは二次元ベジエ曲線を表すクラスです。 ここでは、QuadCurve2D クラスについて、事例にて説明します。 現在(2021/08)では、JDK-16.0.2 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2021/11)では、JDK-17.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2023/04)では、JDK-20.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2024/10)では、JDK-23 にアップされています。一部、上位互換について、見直しを行っていきます。 |
|
QuadCurve2Dクラスは2次元ベジエ曲線を表すクラスです。始点と終点そして1つの制御点から曲線を作成します。 クラス図は次のようになっています。 java.lang.Object ⇒ java.awt.geom.QuadCurve2D public abstract class QuadCurve2D extends Object implements Shape, CloneableQuadCurve2Dクラスはabstractクラスとなっていますので実際に使用する場合はサブクラスであるQuadCurve2D.DoubleクラスとQuadCurve2D.Floatクラスを利用します。 QuadCurve2D.DoubleクラスQuadCurve2D.Doubleクラスは2次元ベジエ曲線を特定するための各値としてdouble型の値を使用するクラスです。クラス図は次のようになっています。 java.lang.Object ⇒ java.awt.geom.QuadCurve2D ⇒ java.awt.geom.QuadCurve2D.Double public static class QuadCurve2D.Double extends QuadCurve2D implements Serializableコンストラクタは次の2つが用意されています。
いくつかコンストラクタがありますが基本となる2番目のコンストラクタを確認してみます。 QuadCurve2D.Double public QuadCurve2D.Double(double x1, double y1, double ctrlx, double ctrly, double x2, double y2)指定された double 座標から QuadCurve2D を構築および初期化します。 パラメータ: x1 - 始点の X 座標 y1 - 始点の Y 座標 ctrlx - 制御点の X 座標 ctrly - 制御点の Y 座標 x2 - 終点の X 座標 y2 - 終点の Y 座標 まず始点座標について1番目の引数でx座標を2番目の引数でy座標をそれぞれdouble型の値で指定します。次に制御点の座標について3番目の引数でx座標を4番目の引数でy座標をそれぞれdouble型の値で指定します。最後に終点座標について5番目の引数でx座標を6番目の引数でy座標をそれぞれdouble型の値で指定します。 具体的には次のように記述します。 QuadCurve2D.Double curve = new QuadCurve2D.Double(20.0d, 20.0d, 20.0d, 160.0d, 150.0d, 100.0d); QuadCurve2D.FloatクラスQuadCurve2D.Floatクラスは2次元ベジエ曲線を特定するための各値としてfloat型の値を使用するクラスです。クラス図は次のようになっています。 java.lang.Object ⇒ java.awt.geom.QuadCurve2D ⇒ java.awt.geom.QuadCurve2D.Float public static class QuadCurve2D.Float extends QuadCurve2D implements Serializableコンストラクタは次の2つが用意されています。
いくつかコンストラクタがありますが基本となる2番目のコンストラクタを確認してみます。 QuadCurve2D.Float public QuadCurve2D.Float(float x1, float y1, float ctrlx, float ctrly, float x2, float y2)指定された float 座標から QuadCurve2D を構築および初期化します。 パラメータ: x1 - 始点の X 座標 y1 - 始点の Y 座標 ctrlx - 制御点の X 座標 ctrly - 制御点の Y 座標 x2 - 終点の X 座標 y2 - 終点の Y 座標 まず始点座標について1番目の引数でx座標を2番目の引数でy座標をそれぞれfloat型の値で指定します。次に制御点の座標について3番目の引数でx座標を4番目の引数でy座標をそれぞれfloat型の値で指定します。最後に終点座標について5番目の引数でx座標を6番目の引数でy座標をそれぞれfloat型の値で指定します。 具体的には次のように記述します。 QuadCurve2D.Float curve = new QuadCurve2D.Float(20.0f, 20.0f, 20.0f, 160.0f, 150.0f, 100.0f);QuadCurve2D.DoubleクラスとQuadCurve2D.Floatクラスは内部に保持する値がdouble型かfloat型かの違いがあるだけですので次のページ以降では基本的にQuadCurve2D.Doubleクラスについて内容を確認していきます。 |
QuadCurve2D.Doubleクラスで各設定値をコンストラクタで指定する以外にオブジェクトを作成した後でメソッドを使って設定することが出来ます。QuadCurve2D.Doubleクラスで用意されている「setCurve」メソッドを使います。setCurve public void setCurve(double x1, double y1, double ctrlx, double ctrly, double x2, double y2)この曲線の終点と制御点の位置を、指定された double 座標に設定します。 パラメータ: x1 - 始点の X 座標 y1 - 始点の Y 座標 ctrlx - 制御点の X 座標 ctrly - 制御点の Y 座標 x2 - 終点の X 座標 y2 - 終点の Y 座標 1番目と2番目の引数で始点座標を指定します。3番目と4番目の引数で制御点の座標を指定します。5番目と6番目の引数で終点座標を指定します。 具体的には次のように記述します。 QuadCurve2D.Double curve = new QuadCurve2D.Double(); curve.setCurve(20.0d, 20.0d, 20.0d, 160.0d, 150.0d, 100.0d); サンプルプログラム下記のサンプルを実行してみよう。/** * メソッドで設定する */ import javax.swing.*; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.geom.*; public class QuadCurve2DTest1 extends JPanel{ public static void main(String[] args){ JFrame frame = new JFrame(); QuadCurve2DTest1 app = new QuadCurve2DTest1(); 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; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); QuadCurve2D.Double curve = new QuadCurve2D.Double(); curve.setCurve(60.0d, 20.0d, 40.0d, 140.0d, 220.0d, 120.0d); g2.draw(curve); double x1 = curve.x1; double y1 = curve.y1; double x2 = curve.x2; double y2 = curve.y2; double ctrlx = curve.ctrlx; double ctrly = curve.ctrly; g2.draw(new Ellipse2D.Double(x1 - 5.0d, y1 - 5.d, 10.d, 10.0d)); g2.draw(new Ellipse2D.Double(x2 - 5.0d, y2 - 5.d, 10.d, 10.0d)); g2.draw(new Ellipse2D.Double(ctrlx - 5.0d, ctrly - 5.d, 10.d, 10.0d)); } }上記をコンパイルした後で実行すると次のように表示されます。 ![]() |
QuadCurve2D.Doubleクラスで始点や終点、そして制御点の値を取得するにはメソッドを使って取得する方法とフィールドの値を参照する方法があります。まずはメソッドで取得する方法を確認します。 まず始点座標を取得してみます。QuadCurve2D.Doubleクラスで用意されている「getX1」メソッドと「getY1」メソッドを使います。 getX1メソッド: getX1 public double getX1()始点の X 座標を double 精度で返します。 戻り値: 始点の X 座標 getY1メソッド: getY1 public double getY1()始点の Y 座標を double 精度で返します。 戻り値: 始点の Y 座標 「getX1」メソッドは戻り値としてオブジェクトに保存されている始点座標のX座標を表すdouble型の値を取得できます。「getY1」メソッドは戻り値としてオブジェクトに保存されている始点座標のY座標を表すdouble型の値を取得できます。 次に終点座標を取得してみます。QuadCurve2D.Doubleクラスで用意されている「getX2」メソッドと「getY2」メソッドを使います。 getX2メソッド: getX2 public double getX2()終点の X 座標を double 精度で返します。 戻り値: 終点の x 座標 getY2メソッド: getY2 public double getY2()終点の Y 座標を double 精度で返します。 戻り値: 終点の Y 座標 「getX2」メソッドは戻り値としてオブジェクトに保存されている終点座標のX座標を表すdouble型の値を取得できます。「getY2」メソッドは戻り値としてオブジェクトに保存されている終点座標のY座標を表すdouble型の値を取得できます。 最後に制御点の座標を取得してみます。QuadCurve2D.Doubleクラスで用意されている「getCtrlX」メソッドと「getCtrlY」メソッドを使います。 getCtrlXメソッド: getCtrlX public double getCtrlX()制御点の X 座標を double 精度で返します。 戻り値: 制御点の X 座標 getCtrlYメソッド: getCtrlY public double getCtrlY()制御点の Y 座標を double 精度で返します。 戻り値: 制御点の Y 座標 「getCtrlX」メソッドは戻り値としてオブジェクトに保存されている制限点のX座標を表すdouble型の値を取得できます。「getCtrlY」メソッドは戻り値としてオブジェクトに保存されている制御点の座標のY座標を表すdouble型の値を取得できます。 具体的には次のように記述します。 QuadCurve2D.Double curve = new QuadCurve2D.Double(20.0d, 20.0d, 20.0d, 160.0d, 150.0d, 100.0d); double x1 = curve.getX1(); double y1 = curve.getY1(); double x2 = curve.getX2(); double y2 = curve.getY2(); double ctrlx = curve.getCtrlX(); double ctrly = curve.getCtrlY(); フィールドを参照するQuadCurve2D.Doubleではフィールドとして「x1」「y1」「ctrlx」「ctrly」「x2」「y2」と言う6つのdouble型の値を保持するフィールドを持っておりオブジェクトから直接参照することが出来ます。具体的には次のように記述します。 QuadCurve2D.Double curve = new QuadCurve2D.Double(20.0d, 20.0d, 20.0d, 160.0d, 150.0d, 100.0d); double x1 = curve.x1; double y1 = curve.y1; double x2 = curve.x2; double y2 = curve.y2; double ctrlx = curve.ctrlx; double ctrly = curve.ctrly; サンプルプログラム下記のサンプルを実行してみよう。/** * 設定値を取得する */ import javax.swing.*; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.geom.*; public class QuadCurve2DTest2 extends JPanel{ public static void main(String[] args){ JFrame frame = new JFrame(); QuadCurve2DTest2 app = new QuadCurve2DTest2(); 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; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); QuadCurve2D.Double curve = new QuadCurve2D.Double(); curve.setCurve(60.0d, 40.0d, 220.0d, 30.0d, 120.0d, 140.0d); g2.draw(curve); double x1 = curve.getX1(); double y1 = curve.getY1(); double x2 = curve.getX2(); double y2 = curve.getY2(); double ctrlx = curve.getCtrlX(); double ctrly = curve.getCtrlY(); g2.draw(new Ellipse2D.Double(x1 - 5.0d, y1 - 5.d, 10.d, 10.0d)); g2.draw(new Ellipse2D.Double(x2 - 5.0d, y2 - 5.d, 10.d, 10.0d)); g2.draw(new Ellipse2D.Double(ctrlx - 5.0d, ctrly - 5.d, 10.d, 10.0d)); } }上記をコンパイルした後で実行すると次のように表示されます。 ![]() |
|