public class CircleNode implements Node
1: import java.awt.*;
2: import java.awt.geom.*;
4: /**
5: A circular node that is filled with a color.
6: */
7: public class CircleNode implements Node
8: {
9: /**
10: Construct a circle node with a given size and color.
11: @param aColor the fill color
12: */
13: public CircleNode(Color aColor)
14: {
15: size = DEFAULT_SIZE;
16: x = 0;
17: y = 0;
18: color = aColor;
19: }
21: public Object clone()
22: {
23: try
24: {
25: return super.clone();
26: }
27: catch (CloneNotSupportedException exception)
28: {
29: return null;
30: }
31: }
33: public void draw(Graphics2D g2)
34: {
35: Ellipse2D circle = new Ellipse2D.Double(
36: x, y, size, size);
37: Color oldColor = g2.getColor();
38: g2.setColor(color);
39: g2.fill(circle);
40: g2.setColor(oldColor);
41: g2.draw(circle);
42: }
44: public void translate(double dx, double dy)
45: {
46: x += dx;
47: y += dy;
48: }
50: public boolean contains(Point2D p)
51: {
52: Ellipse2D circle = new Ellipse2D.Double(
53: x, y, size, size);
54: return circle.contains(p);
55: }
57: public Rectangle2D getBounds()
58: {
59: return new Rectangle2D.Double(
60: x, y, size, size);
61: }
63: public Point2D getConnectionPoint(Point2D other)
64: {
65: double centerX = x + size / 2;
66: double centerY = y + size / 2;
67: double dx = other.getX() - centerX;
68: double dy = other.getY() - centerY;
69: double distance = Math.sqrt(dx * dx + dy * dy);
70: if (distance == 0) return other;
71: else return new Point2D.Double(
72: centerX + dx * (size / 2) / distance,
73: centerY + dy * (size / 2) / distance);
74: }
76: private double x;
77: private double y;
78: private double size;
79: private Color color;
80: private static final int DEFAULT_SIZE = 20;
81: }