面向对象开发范例之多态化图形操作



/*
作者:meteor135
Email:meteor@mail.biti.edu.cn
      smith_135@163.com
时间:2003.5.22
*/
#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#include <bios.h>
#include <dos.h>
#define  path "C://TC//BGI"     //改为你自己的BGI路径
#include <stdlib.h>
#include <string.h>
#include <iostream.h>
#include <math.h>
#define Pi      3.1415926
#define RIGHT   77
#define LEFT    75
#define UP      72
#define DOWN    80
#define HIDE    'h'
#define SHOW    's'
#define ENLARGE '='
#define REDUCE  'b'
#define Alt_X   '-'
enum bool { false, true };
int  GetKey();
int  prompt();
void window(int, int, int, int, int, int, int);
//
class Location
{
protected:
    int x0, y0;
public:
    Location(int x, int y){x0=x;y0=y;}
    int GetX0(){return x0;}
    int GetY0(){return y0;}
};

class Point:public Location
{
protected:
    bool isVisible;
    void Draw();
public:
    void Show(){putpixel(x0,y0,getcolor());}
    Point(int x, int y):Location(x,y){};
    bool GetVisible(){return isVisible;}
};
//
class Figure : public Point
{
protected:
    int changeStep;
    virtual void  Draw   ()=0;
public:
    Figure(int x, int y):Point(x, y){changeStep=10;}
public:
    virtual void  Show   ();
    virtual void  Left   ();
    virtual void  Up     ();
    virtual void  Down   ();
    virtual void  Hide   ();
    virtual void  Right  ();
public:
    virtual void  Enlarge()=0;
    virtual void  Reduce ()=0;
};
void Figure::Hide()
{
    unsigned color = getcolor();
    isVisible = false;
    setcolor(getbkcolor());
    Draw();
    setcolor(color);
}
void Figure::Show()
{
    setcolor(getcolor());
    Draw();
    isVisible=true;
}
void Figure::Up()
{
    Hide();
    (y0 -= changeStep) ? 0 : (y0 += 480);
    Draw();
}
void Figure::Down()
{
    Hide();
    y0 = (y0 + changeStep) % 480;
    Draw();
}
void Figure::Right()
{
    Hide();
    x0 = (x0 + changeStep) % 640;
    Draw();
}
void Figure::Left()
{
    Hide();
    (x0 -= changeStep) ? 0 : (x0 += 640);
    Draw();
}
//
class Rectangle : public Figure
{
private:
    int width,height;
    void Draw()
    {
        int left,top,right,bottom;
        left   = x0-width /2;
        top    = y0-height/2;
        right  = x0+width /2;
        bottom = y0+height/2;
        rectangle(left,top,right,bottom);
    }
public:
    Rectangle(int x, int y, int w, int h):Figure(x,y)
    {
        width  = w;
        height = h;
    }
public:
    int   GetWidth (){return width ;}
    int   GetHeight(){return height;}
    void  Enlarge();
    void  Reduce ();
};
void Rectangle::Enlarge()
{
    Hide();
    width  += changeStep;
    height += changeStep;
    Draw();
}
void Rectangle::Reduce()
{
    Hide();
    width  -= width >0&&height>0 ? changeStep : 0;
    height -= height>0&&height>0 ? changeStep : 0;
    Draw();
}
//
class Circle: public Figure
{
private:
    int radius;
    void Draw(){circle(x0, y0, radius);}
public:
    Circle(int x, int y, int radius);
    int GetRadius(){return radius;}
    void  Enlarge();
    void  Reduce ();
};

Circle::Circle(int x, int y, int radius):Figure(x, y)
{
    this->radius = radius;
}
void Circle::Enlarge()
{
    Hide();
    radius += changeStep;
    Draw();
}
void Circle::Reduce()
{
    Hide();
    radius -= radius>0 ? changeStep : 0;
    Draw();
}
/
void main()
{
    Figure *pFigure;
    int choice;
    while((choice=prompt())>0)
    {
        switch(choice)
        {
        case 1:
            pFigure = new Circle(320, 240, 100);
            break;
        case 2:
            pFigure = new Rectangle(200,200,300,200);
            break;
        default:
            pFigure = new Circle(320, 240, 100);
        }

        char s1[10], s2[10];
        //char s3[15];

        int key;
        int gdriver = DETECT, gmode;

        initgraph(&gdriver, &gmode, path);
        setbkcolor(LIGHTCYAN);
        cleardevice();

        window(0, 0, getmaxx(), getmaxy(), 20, BLUE, LIGHTCYAN);
        settextstyle(1, 0, 1);
        setcolor(RED);
        outtextxy(20, 15, "Now you will see a figure and you can do something with it");
        outtextxy(20, 33, "Press any key to continue!");
        outtextxy(20, 57, "h:hide  s:show  =:enlarge  b:reduce");
        outtextxy(20, 75, "   :right   :left  :up   :down  alt_x:quit");
        setlinestyle(SOLID_LINE, 1, 3);
        line(26, 88, 40, 88);
        line(40, 88, 36, 84);
        line(40, 88, 36, 92);
        line(100, 88, 114, 88);
        line(100, 88, 104, 84);
        line(100, 88, 104, 92);
        line(214, 82, 214, 95);
        line(214, 95, 210, 91);
        line(214, 95, 218, 91);
        line(166, 82, 166, 95);
        line(166, 82, 162, 86);
        line(166, 82, 170, 86);
        setcolor(RED);
        rectangle(390,62,441,81);
        rectangle(454,62,505,81);
        //rectangle(518,62,601,81);
        while((key = GetKey())!= Alt_X)
        {
            setfillstyle(SOLID_FILL,CYAN);
            bar(391,63,440,80);
            bar(455,63,504,80);
            //bar(519,63,600,80);
            setviewport(20, 100, 618, 458 , 1);
            switch(key)
            {
                case RIGHT   :    pFigure->Right  ();    break;
                case LEFT    :    pFigure->Left   ();    break;
                case UP      :    pFigure->Up     ();    break;
                case DOWN    :    pFigure->Down   ();    break;
                case ENLARGE :    pFigure->Enlarge();    break;
                case REDUCE  :    pFigure->Reduce ();    break;
                case HIDE    :    pFigure->Hide   ();    break;
                case SHOW    :    pFigure->Show   ();    break;
                default      :                           break;
            }
            setviewport(0, 0, 639, 479, 1);
            settextstyle(2,0,5);
            setcolor(RED);
            sprintf(s1,"X0=%d",pFigure->GetX0());
            outtextxy(392,62,s1);
            sprintf(s2,"Y0=%d",pFigure->GetY0());
            outtextxy(456,62,s2);
            //sprintf(s3,"RADIUS=%d",pFigure->GetRadius());
            //outtextxy(520,62,s3);
        }
        delete pFigure;
        closegraph();
    }
}

///
void window(int left, int top, int right, int bottom, int width, int color1, int color2)
{
    setfillstyle(SOLID_FILL, color1);
    bar(left, top, right, bottom);
    setcolor(color2);
    rectangle(left+width, top+width*5, right-width, bottom-width);
    setfillstyle(SOLID_FILL, color2);
    floodfill(left+width+1, top+width*5+1, color2);
    rectangle(left+2, top+2, right-2, bottom-2);
    rectangle(left+width-2, top+width-2, right-width+2, bottom-width+2);
    line(left+width-1, top+width*3-2, right-width+1, top+width*3-2);
    line(left+width-1, top+width*5-2, right-width+1, top+width*5-2);
    line(left+2, top+2, left+width-2, top+width-2);
    line(right-2, top+2, right-width+2, top+width-2);
    line(left+2, bottom-2, left+width-2, bottom-width+2);
    line(right-2, bottom-2, right-width+2, bottom-width+2);
}
///
int prompt()
{
    printf("This program shows a figure, it can move there and here,/n");
    printf("hide and then show./n");
    printf("/nPlease input your choice to show what figure you want to see:");
    printf("/n1:Circle/n2:Rectangle/n0:quit/n");
    int choice = 0;
    cin >> choice;
    return choice;
}
//
int GetKey()
{
    int key;
    while(bioskey(1) == 0);
    key = bioskey(0);
    key = key & 0xff ? key & 0xff : key >> 8;
    return(key);
}
/
//The program is over here.



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值