------------------------------------------------------------------------------
MC logo
Text Canvas Implementation
[^] Code Examples
------------------------------------------------------------------------------
<<Text Canvas Class canvas.cc Shape Classes>>
#include <stdlib.h>
#include <math.h>
#include "canvas.h"

// Construct a new canvas of the appropriate size.
Canvas::Canvas(int x, int y)
{
        width = x;
        height = y;
        space = new char[x*y];
}

// Set a single point.
void Canvas::set(int x, int y)
{
        if(0 <= x && x < width && 0 <= y && y < height)
                space[x + width*y] = 1;
}

// Print the canvas.
void Canvas::print(ostream &out)
{
        char *scan = space;             // Scan through space.
        int linecount;                  // Count down a line to find its end.
        int wholecount = width*height;  // Count down through whole area.

        // Draw the top border.
        out << "|";
        for(int m = 2*width+1; m--; ) out << "-";
        out << "|" << endl << "|";

        // Output the figure itself.
        linecount = width;
        for(;wholecount--; ++scan)
        {
                // Output a character for the current position.
                if(*scan)
                        out << " .";
                else
                        out << "  ";

                // Detect the end of the line.
                if(--linecount == 0)
                {
                        out << " |" << endl << "|";
                        linecount = width;
                }
        }

        // Bottom border.
        for(int m = 2*width+1; m--; ) out << "-";
        out << "|" << endl;
}

// Draw a line on the canvas.
void Drawable::line(int startx, int starty, int endx, int endy)
{
        // Check for single point.
        if(startx == endx && starty == endy) 
        {
                set(startx, starty);
                return;
        }

        // Find the amount of change in each dimension.
        int x_change = endx - startx;
        int y_change = endy - starty;

        double x_step, y_step;          // Change per each step.
        int count;                      // Number of iterations.
        if(abs(x_change) > abs(y_change))
        {
                // Changes more the x direction.  We'll step in that
                // direction.
                count = abs(x_change) + 1;
                x_step = endx > startx ? 1.0 : -1.0;
                y_step = (double)(endy - starty) / abs(x_change);
        }
        else
        {
                count = abs(y_change) + 1;
                y_step = endy > starty ? 1.0 : -1.0;
                x_step = (double)(endx - startx) / abs(y_change);
        }

        // Draw the line.
        double xpos = startx;
        double ypos = starty;
        while(count--)
        {
                set((int)rint(xpos), (int)rint(ypos));
                xpos += x_step;
                ypos += y_step;
        }
}
<<Text Canvas Class Shape Classes>>