⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 canvas.h

📁 C++&datastructure书籍源码,以前外教提供现在与大家共享
💻 H
字号:
#ifndef _CANVAS_H
#define _CANVAS_H


#include <iostream>
#include <string>
using namespace std;

#include "tvector.h"
#include "iterator.h"
#include "canvascolor.h"
#include "key.h"
#include "point.h"

class image;  // forward decl
class Shape;  // forward decl

// the class Box is used for the bounding-box of every shape
// a Box is rectangular, specified by upper-left and lower-right
// coordinates.  A Box knows if a point is inside it, if it
// intersects with another box, and overloads += for the union of two
// boxes which is the smallest box containing both

class Box
{
  public:
    Box(int xul, int yul, int xlr, int ylr);
    Box(const Point& ul, const Point& lr);
    Box();
    
    const Box& operator += (const Box& rhs); // union of two boxes
    
    Point    getUL()        const;             // return upper-left point
    Point    getLR()        const;             // return lower-right point
    double   width()        const;             // return width
    double   height()       const;             // return height
    string   tostring()     const;             // stringized form
    bool     contains(const Point& p) const;   // true iff p in me
    bool     intersects(const Box& b) const;   // true iff b intersects me
    
  private:
    
    Point myLeft, myRight;
};

Box operator + (const Box& lhs, const Box& rhs);   // union
ostream& operator << (ostream& os, const Box& b);  // output

class window;      // the handle class that does all the work

// The CanvasAble is in place for future development, it's
// not used in the current implementatation althouth Keyable and
// Mouseable inherit from it

class CanvasAble
{
  public:
    virtual ~CanvasAble() = 0;
};

// unbuffered BaseCanvas class that does most of the work for drawing
// and for the AnimatedCanvas class
//
// construct with width (x-direction) and height (y-direction)
// and placement relative to the screen -- upper left corner is (0,0)
//
// functions are mostly self-explanatory, currently the coordinate system
// has origin in upper-left, x increasing to the right, y increasing down
// In the raw Canvas class, the color is set on the canvas, all subsequent
// drawing is done in that color. Similarly, figures are drawn filled
// or framed, as specified by calling SetFilled() or SetFramed()
// for the entire canvas, default is Filled.  
//
// Figures can be specified using int values for (x,y) or using Point objects
// Point objects are preferred, points use double values for (x,y) which are
// rounded off when actually drawing.  At some future point the methods
// that use ints may disappear, use Points

class BaseCanvas
{
  public:
    BaseCanvas(int w, int h, int x, int y);
    virtual ~BaseCanvas();
    
    int height() ;
    int width()  ;
    
    // drawing functions
    
    void Clear();                        // erase canvas
    
    void SetColor(const color& c);       // set color for all drawing
    void SetFrame();                     // figures framed, not filled
    void SetFilled();                    // figures filled, not framed
    void DrawPixel(int x, int y);        // draw pixel at x,y
    void DrawPixel(const Point& p);      // draw pixel at p
    
    void DrawLine      (int x1, int y1,  // draw line from (x1,y1) to (x2,y2)
                        int x2, int y2);
    void DrawLine      (const Point& p1,  // draw line from p1 to p2
                        const Point& p2);
    void DrawRectangle (int x1, int y1, 
                        int x2, int y2);
    void DrawRectangle (const Point& p1, 
                        const Point& p2);
    void DrawCircle    (int x, int y, 
                        int radius);
    void DrawCircle    (const Point& center, 
                        int radius);
    void DrawEllipse   (int x1, int y1, 
                        int x2, int y2);
    void DrawEllipse   (const Point& p1, 
                        const Point& p2);
    void DrawTriangle  (const Point& p1, 
                        const Point& p2, const Point& p3);
    void DrawPolygon   (const 
    void DrawString    (const string& s, tvector<Point>& a, 
                        int numPoints);
                        int x, int y, int fontsize=14);
    void DrawString    (const string& s, 
                        const Point& p,int fontsize=14);  
    void DrawPieWedge  (const Point& p, int radius, 
                        double startRad, double endRad);
                        
    void SetTitle(const string& s);
    void GetStringSize(int&w, int& h, const string& s);

    CanvasColor GetPixel(const Point& p) const;


    // use ImageShape to avoid the image class
    
    void DrawImage     (image& im, 
                        int x, int y, double scale=1.0);
    void DrawImage     (image& im, 
                        const Point& p, double scale=1.0);
    
    // end of drawing functions
    
    void Print();
    void Process();
 
    double ycoord(double d);          // hooks for changing coord system
    Point  ycoord(const Point& p);
    
  protected:
    
    enum Coord{top_origin, bottom_origin};
  
    window *         myWindow;
    int              myCount;
    int              myHeight;
    bool             myFilled;
    Coord            myCoords;
    CanvasColor      myColor;
    
    static int       ourCount;
    
    static const int BBARHEIGHT;      // hook for making buttons
    void MakeBBar();                  // not implemented
};

// the AnimatedCanvas class is-a BaseCanvas, but it supports
// double-buffered animation over a collection of Shapes
// (see the Shape class hierarchy)
// the basic mode of operation with an AnimatedCanvas is
//
//   o construct Canvas
//   o add Shapes
//   o animate using runXXX(..) method
//
// It's best to add pointers to shapes, rather than shapes. Adding a Shape
// directly will cause the shape to be cloned and then added, adding
// a pointer doesn't clone the shape
//
// Shapes can be removed, the Shape()->id() method is used for identity
// so a cloned shape can't be removed since it will have a different id
//
// the method run(n) or run(n,delay) runs the animation for n steps, where
// a step is one cycle of asking all shapes to draw themselves. Specifying
// a delay means animation pauses between cycles
//
// alternatively, runUntilEscape(delay) runs until the ESCAPE key is
// pressed when the canvas has the focus.  The delay is optional
//
// the getClick() method returns the point of the last mouse-click, if
// coordinates are negative there was no last click
//
// the makeIterator function returns an Iterator<Shape* > for accessing all
// shapes in an AnimatedCanvas

class Button;
class AnimatedCanvas : public BaseCanvas
{
  public:
    AnimatedCanvas(int w, int h, int x, int y, bool isBuffered=true);
    ~AnimatedCanvas();
    
    void repaint();

    void addShape(Shape * s);            // add shape, no cloning
    void addShape(Shape&  s);            // add shape after cloning
    
    void addShape(Button& b);            // hooks for buttons, beta
    void addShape(Button * b);
    
    void removeShape(Shape * s);         // remove shape using shape()->id()
    void removeShape(Shape&  s);         // cannot remove cloned shape
    
    void setBackground(image& im);       // set background image
    
    void run(int steps,int pause=0);     // run animation for steps with pause
    void runUntilEscape(int pause=0);    // run until ESC pressed
    Point getClick();
    
    IteratorRef<Shape> * makeIterator();
    
  protected:
  
    void poll();
  
    tvector<Shape* > myShapes;
    tvector<Shape* > myDeadShapes;
    tvector<Shape* > myLiveShapes;
    int              myShapeCount;
    int              myButtonCount;
    image *          myBackground;
    Point            myClickPoint;
    Key              myKey;
    bool             myIsBuffered;
    bool             myIsRunning;
};

class Canvas : public AnimatedCanvas
{
  public:
    Canvas(int w, int h, int x, int y)
      : AnimatedCanvas(w,h,x,y,false)
    { } 
};

#include "shapes.h"

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -