CubicCurve2DTest.java



import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;

/** CubicCurve2D の実験 */

public class CubicCurve2DTest extends Canvas {

   /** カーブを決定する点の座標 */ 

     public Point2D.Float start, control1, control2, end;
     public float radi = 3.0f;

   /** コンストラクタ */

     public CubicCurve2DTest() {

          super();
          start = new Point2D.Float( 10.0f, 10.0f );
          control1 = new Point2D.Float( 170.0f, 170.0f );
          control2 = new Point2D.Float( 330.0f, 330.0f );
          end = new Point2D.Float( 490.0f, 490.0f );
          setSize( 500, 500 );

          RedrawAdapter adapter = new RedrawAdapter();
          addMouseListener( adapter );
     }

   /** 描画メソッド */

     public void paint( Graphics g ) {

          CubicCurve2D.Float curve = new CubicCurve2D.Float(
            start.x, start.y, control1.x, control1.y,
            control2.x, control2.y, end.x, end.y );
          Arc2D.Float arc1 = new Arc2D.Float(
            control1.x-radi, control1.y-radi,
            radi*2, radi*2, 0.0f, 360.0f, Arc2D.CHORD );
          Arc2D.Float arc2 = new Arc2D.Float(
            control2.x-radi, control2.y-radi,
            radi*2, radi*2, 0.0f, 360.0f, Arc2D.CHORD );

          BasicStroke bs = new BasicStroke( 5.0f,
              BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER );
          ((Graphics2D)g).setStroke( bs );

          ((Graphics2D)g).draw( curve );

          g.setColor( Color.red );
          ((Graphics2D)g).fill( arc1 );
          g.setColor( Color.blue );
          ((Graphics2D)g).fill( arc2 );
     }

  /** 最初に呼び出されるメソッド */

     public static void main( String argv[] ) {

          Frame frame = new Frame( "CubicCurve Test" );  
          CubicCurve2DTest canvas = new CubicCurve2DTest();  
          frame.add( canvas, "Center" );
          frame.pack();
          frame.show();
     }

  /** マウスイベントを処理するクラス */

     protected class RedrawAdapter extends MouseAdapter {

          private int mode;

          public void mousePressed( MouseEvent evt ) {

               float dx1 = control1.x - evt.getX();
               if( dx1 < 0.0f ) dx1 = -dx1;
               float dy1 = control1.y - evt.getY();
               if( dy1 < 0.0f ) dy1 = -dy1;
               float dx2 = control2.x - evt.getX();
               if( dx2 < 0.0f ) dx2 = -dx2;
               float dy2 = control2.y - evt.getY();
               if( dy2 < 0.0f ) dy2 = -dy2;

               if( dx2 < 5 &&  dy2 < 5 )   mode = 2;
               else if( dx1 < 5 &&  dy1 < 5 )   mode = 1;
               else   mode = 0;
          }

          public void mouseReleased( MouseEvent evt ) {

               if( mode == 1 ) {
                     control1.x = evt.getX();
                     control1.y = evt.getY();
               }
               else if( mode == 2 ) {
                     control2.x = evt.getX();
                     control2.y = evt.getY();
               }
               else
                     return;

               repaint();
          }
     }
}