------------------------------------------------------------------------------
MC logo
Shape Classes
[^] Code Examples
------------------------------------------------------------------------------
<<Text Canvas Implementation shape.h Shape Implementations>>
#ifndef _SHAPE_H_
#define _SHAPE_H_ 1

/* Simple shape hierarchy. */

#include <iostream>
#include "canvas.h"

/* Base class for all shapes.  It has an origen, which is where it begins,
   and it can be moved by moving the origen.  But drawing it is abstract. */
class Shape {
    protected:
        int origx, origy;       // Origen.
    public:
        Shape(int x, int y) { origx = x; origy = y; }
        virtual void draw(Drawable &) = 0;
        void translate(int x, int y) { origx += x; origy += y; }
};

/* This is a line.  One end point is the origen of the base Shape object.
   The other end point is recorded relative to that so that the base
   clase translate method still works. */
class Line: public Shape {
    protected:
        int dx, dy;
    public:
        Line(int sx, int sy, int ex, int ey): Shape(sx, sy) {
                dx = ex - sx;
                dy = ey - sy;
        }

        virtual void draw(Drawable &d) {
                d.line(origx, origy, origx + dx, origy + dy);
        }
};

/* A rectangle.  It has one corner as the base class origen, and records its
   own width and height. */
class Rectangle: public Shape {
    protected:
        int width, height;
    public:
        Rectangle(int sx, int sy, int dx, int dy): Shape(sx, sy) {
                width = dx;
                height = dy;
        }

        virtual void draw(Drawable &d);
};

/* An ellipse. */
class Ellipse: public Shape {
    protected:
        // Ellipses are wide (wider than tall) or skinny.
        bool skinny;

        // We draw all ellipses as if they were wide, then transpose the
        // points if they are not.  We compute the y value from the x
        // value by the formula y = sqrt(b^2 - (b^2/a^2)x^2), where
        // a is half the width, and b is half the height.
        int a, b;
        double asqr, bsqr, bsqr_over_asqr, asqr_over_bsqr;

        // This plots each point generated by draw.  Draw generates points in
        // the first quadrant for a wide ellipse.  Plot transposes them in
        // the case of a thin ellipse, and plots the point in each quadrant.
        void plot(Drawable &d, int x, int y);
    public:
        Ellipse(int sx, int sy, int dx, int dy);
        virtual void draw(Drawable &d);
};

/* A square which is a special rectangle. */
class Square: public Rectangle 
{
    public:
        Square(int x, int y, int side): Rectangle(x, y, side, side) { }
};

/* A circle which is a special ellipse. */
class Circle: public Ellipse
{
    public:
        Circle(int x, int y, int diam): Ellipse(x, y, diam, diam) { }
};

#endif
<<Text Canvas Implementation Shape Implementations>>