01: import java.awt.*;
02: import java.awt.geom.*;
03: 
04: /**
05:    A car shape.
06: */
07: public class CarShape
08: {
09:    /**
10:       Constructs a car shape.
11:       @param x the left of the bounding rectangle
12:       @param y the top of the bounding rectangle
13:       @param width the width of the bounding rectangle
14:    */
15:    public CarShape(int x, int y, int width)
16:    {
17:       this.x = x;
18:       this.y = y;
19:       this.width = width;
20:    }
21: 
22:    public void draw(Graphics2D g2)
23:    {
24:       Rectangle2D.Double body
25:          = new Rectangle2D.Double(x, y + width / 6, 
26:             width - 1, width / 6);
27:       Ellipse2D.Double frontTire
28:          = new Ellipse2D.Double(x + width / 6, y + width / 3, 
29:             width / 6, width / 6);
30:       Ellipse2D.Double rearTire
31:          = new Ellipse2D.Double(x + width * 2 / 3, 
32:             y + width / 3,
33:             width / 6, width / 6);
34: 
35:       // the bottom of the front windshield
36:       Point2D.Double r1
37:          = new Point2D.Double(x + width / 6, y + width / 6);
38:       // the front of the roof
39:       Point2D.Double r2
40:          = new Point2D.Double(x + width / 3, y);
41:       // the rear of the roof
42:       Point2D.Double r3
43:          = new Point2D.Double(x + width * 2 / 3, y);
44:       // the bottom of the rear windshield
45:       Point2D.Double r4
46:          = new Point2D.Double(x + width * 5 / 6, y + width / 6);
47:       Line2D.Double frontWindshield
48:          = new Line2D.Double(r1, r2);
49:       Line2D.Double roofTop
50:          = new Line2D.Double(r2, r3);
51:       Line2D.Double rearWindshield
52:          = new Line2D.Double(r3, r4);
53: 
54:       g2.draw(body);
55:       g2.draw(frontTire);
56:       g2.draw(rearTire);
57:       g2.draw(frontWindshield);
58:       g2.draw(roofTop);
59:       g2.draw(rearWindshield);
60:    }
61:    
62:    public boolean contains(Point2D p)
63:    {
64:       return x <= p.getX() && p.getX() <= x + width 
65:          && y <= p.getY() && p.getY() <= y + width / 2;
66:    }
67: 
68:    public void translate(double dx, double dy)
69:    {
70:       x += dx;
71:       y += dy;
72:    }
73: 
74:    private int x;
75:    private int y;
76:    private int width;
77: }