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();
}
}
}