import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
public class DragKing
extends ApplicationFrame
implements MouseListener, MouseMotionListener {
public static void main(String[] args) {
new DragKing();
}
protected Point2D[] mPoints;
protected Point2D mSelectedPoint;
public DragKing() {
super("DragKing v1.0");
setSize(300, 300);
center();
mPoints = new Point2D[9];
// Cubic curve.
mPoints[0] = new Point2D.Double(50, 75);
mPoints[1] = new Point2D.Double(100, 100);
mPoints[2] = new Point2D.Double(200, 50);
mPoints[3] = new Point2D.Double(250, 75);
// Quad curve.
mPoints[4] = new Point2D.Double(50, 175);
mPoints[5] = new Point2D.Double(150, 150);
mPoints[6] = new Point2D.Double(250, 175);
// Line.
mPoints[7] = new Point2D.Double(50, 275);
mPoints[8] = new Point2D.Double(250, 275);
mSelectedPoint = null;
// Listen for mouse events.
addMouseListener(this);
addMouseMotionListener(this);
setVisible(true);
}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
// Draw the tangents.
Line2D tangent1 = new Line2D.Double(mPoints[0], mPoints[1]);
Line2D tangent2 = new Line2D.Double(mPoints[2], mPoints[3]);
g2.setPaint(Color.gray);
g2.draw(tangent1);
g2.draw(tangent2);
// Draw the cubic curve.
CubicCurve2D c = new CubicCurve2D.Float();
c.setCurve(mPoints, 0);
g2.setPaint(Color.black);
g2.draw(c);
// Draw the tangents.
tangent1 = new Line2D.Double(mPoints[4], mPoints[5]);
tangent2 = new Line2D.Double(mPoints[5], mPoints[6]);
g2.setPaint(Color.gray);
g2.draw(tangent1);
g2.draw(tangent2);
// Draw the quadratic curve.
QuadCurve2D q = new QuadCurve2D.Float();
q.setCurve(mPoints, 4);
g2.setPaint(Color.black);
g2.draw(q);
// Draw the line.
Line2D l = new Line2D.Float();
l.setLine(mPoints[7], mPoints[8]);
g2.setPaint(Color.black);
g2.draw(l);
for (int i = 0; i < mPoints.length; i++) {
// If the point is selected, use the selected color.
if (mPoints[i] == mSelectedPoint)
g2.setPaint(Color.red);
else
g2.setPaint(Color.blue);
// Draw the point.
g2.fill(getControlPoint(mPoints[i]));
}
}
protected Shape getControlPoint(Point2D p) {
// Create a small square around the given point.
int side = 4;
return new Rectangle2D.Double(
p.getX() - side / 2, p.getY() - side / 2,
side, side);
}
public void mouseClicked(MouseEvent me) {}
public void mousePressed(MouseEvent me) {
mSelectedPoint = null;
for (int i = 0; i < mPoints.length; i++) {
Shape s = getControlPoint(mPoints[i]);
if (s.contains(me.getPoint())) {
mSelectedPoint = mPoints[i];
break;
}
}
repaint();
}
public void mouseReleased(MouseEvent me) {}
public void mouseMoved(MouseEvent me) {}
public void mouseDragged(MouseEvent me) {
if (mSelectedPoint != null) {
mSelectedPoint.setLocation(me.getPoint());
repaint();
}
}
public void mouseEntered(MouseEvent me) {}
public void mouseExited(MouseEvent me) {}
} |