/**************************************************************************** ** COPYRIGHT (C): 1997 Cay S. Horstmann. All Rights Reserved. ** PROJECT: Practical OO Development with C++ and Java ** FILE: shapes.java ** PURPOSE: test Java graphics shapes ** VERSION 1.0 ** PROGRAMMERS: Cay Horstmann (CSH) ** RELEASE DATE: 3-15-97 (CSH) ** UPDATE HISTORY: ****************************************************************************/ import java.applet.*; import java.awt.Graphics; import java.awt.Color; import java.awt.Font; public class Shapes extends Applet { public void paint(Graphics g) { Shape[] fig = new Shape[6]; fig[0] = new Point(150, 150); fig[1] = new Rectangle(new Point(40, 30), new Point(60, 70)); fig[2] = new FilledRect(new Point(80, 40), new Point(130, 165), Color.red); Polygon p = new Polygon(3); p.set_corner(0, new Point(350, 100)); p.set_corner(1, new Point(400, 140)); p.set_corner(2, new Point(350, 180)); fig[3] = p; fig[4] = new ScalableText(new Point(500, 100), "Hi", 36); fig[5] = new Text(new Point(160, 150), "Hello"); for (int i = 1; i < 20; i++) { for (int j = 0; j < fig.length; j++) { fig[j].plot(g); fig[j].scale(new Point(8, 8), 0.9); } } } } abstract class Shape { abstract void scale(Point center, double scalefactor); abstract void plot(Graphics g); } class Point extends Shape { public Point(int x, int y) { _x = x; _y = y; } public void move(int dx, int dy) { _x += dx; _y += dy; } public void scale(Point center, double scalefactor) { _x = (int)(_x * scalefactor + center._x * (1 - scalefactor)); _y = (int)(_y * scalefactor + center._y * (1 - scalefactor)); } public int x() { return _x; } public int y() { return _y; } public void plot(Graphics g) { g.fillOval(_x - 2, _y - 2, 5, 5); } private int _x; private int _y; } class Rectangle extends Shape { public Rectangle(Point p, Point q) { _topleft = new Point(Math.min(p.x(), q.x()), Math.min(p.y(), q.y())); _bottomright = new Point(Math.max(p.x(), q.x()), Math.max(p.y(), q.y())); } public void move(int dx, int dy) { _topleft.move(dx, dy); _bottomright.move(dx, dy); } public void scale(Point center, double s) { _topleft.scale(center, s); _bottomright.scale(center, s); } public void plot(Graphics g) { g.drawRect(_topleft.x(), _topleft.y(), _topleft.x() - _bottomright.x(), _topleft.y() - _bottomright.y()); } public Point topleft() { return _topleft; } public Point bottomright() { return _bottomright; } private Point _topleft; private Point _bottomright; } class FilledRect extends Rectangle { public FilledRect(Point p, Point q, Color c) { super(p, q); _color = c; } public void plot(Graphics g) { Color c = g.getColor(); g.setColor(_color); g.fillRect(topleft().x(), topleft().y(), bottomright().x() - topleft().x(), bottomright().y() - topleft().y()); g.setColor(c); } private Color _color; } class Polygon extends Shape { public Polygon(int n) { _corners = new Point[n]; } public void set_corner(int i, Point p) { if(0 <= i && i < _corners.length); _corners[i] = p; } public void move(int dx, int dy) { for(int i = 0; i < _corners.length; i++) _corners[i].move(dx, dy); } public void scale(Point center, double s) { for(int i = 0; i < _corners.length; i++) _corners[i].scale(center, s); } public void plot(Graphics g) { for(int i = 0; i < _corners.length; i++) { int j = (i + 1) % _corners.length; g.drawLine(_corners[i].x(), _corners[i].y(), _corners[j].x(), _corners[j].y()); } } public Point corner(int i) { return _corners[i]; } private Point[] _corners; } class Text extends Shape { public Text(Point p, String s) { _start = p; _text = s; } public void scale(Point center, double s) { _start.scale(center, s); } public void plot(Graphics g) { g.drawString(_text, _start.x(), _start.y()); } private Point _start; private String _text; } class ScalableText extends Text { public ScalableText(Point p, String s, double size) { super(p, s); _size = size; } public void scale(Point center, double s) { super.scale(center, s); _size = _size * s; } public void plot(Graphics g) { Font f = g.getFont(); Font fnew = new Font(f.getName(), f.getStyle(), (int)Math.round(_size)); g.setFont(fnew); super.plot(g); g.setFont(f); } private double _size; }