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