001package horstmann.ch06_scene2;
002import java.awt.Graphics2D;
003import java.awt.geom.Ellipse2D;
004import java.awt.geom.Line2D;
005import java.awt.geom.Point2D;
006import java.awt.geom.Rectangle2D;
007
008/**
009   A car shape.
010 */
011public class CarShape extends SelectableShape
012{
013        /**
014      Constructs a car shape.
015      @param x the left of the bounding rectangle
016      @param y the top of the bounding rectangle
017      @param width the width of the bounding rectangle
018         */
019        public CarShape(int x, int y, int width)
020        {
021                this.x = x;
022                this.y = y;
023                this.width = width;
024        }
025
026        public void draw(Graphics2D g2)
027        {
028                Rectangle2D.Double body
029                = new Rectangle2D.Double(x, y + width / 6,
030                                width - 1, width / 6);
031                Ellipse2D.Double frontTire
032                = new Ellipse2D.Double(x + width / 6, y + width / 3,
033                                width / 6, width / 6);
034                Ellipse2D.Double rearTire
035                = new Ellipse2D.Double(x + width * 2 / 3,
036                                y + width / 3,
037                                width / 6, width / 6);
038
039                // The bottom of the front windshield
040                Point2D.Double r1
041                = new Point2D.Double(x + width / 6, y + width / 6);
042                // The front of the roof
043                Point2D.Double r2
044                = new Point2D.Double(x + width / 3, y);
045                // The rear of the roof
046                Point2D.Double r3
047                = new Point2D.Double(x + width * 2 / 3, y);
048                // The bottom of the rear windshield
049                Point2D.Double r4
050                = new Point2D.Double(x + width * 5 / 6, y + width / 6);
051                Line2D.Double frontWindshield
052                = new Line2D.Double(r1, r2);
053                Line2D.Double roofTop
054                = new Line2D.Double(r2, r3);
055                Line2D.Double rearWindshield
056                = new Line2D.Double(r3, r4);
057
058                g2.draw(body);
059                g2.draw(frontTire);
060                g2.draw(rearTire);
061                g2.draw(frontWindshield);
062                g2.draw(roofTop);
063                g2.draw(rearWindshield);
064        }
065
066        public boolean contains(Point2D p)
067        {
068                return x <= p.getX() && p.getX() <= x + width
069                                && y <= p.getY() && p.getY() <= y + width / 2;
070        }
071
072        public void translate(int dx, int dy)
073        {
074                x += dx;
075                y += dy;
076        }
077
078        private int x;
079        private int y;
080        private int width;
081}