"Иерархия классов графики на С++"


Страницы: 1
Пользователь: kate&lena
Сообщений: 6
Статус: Пользователь
Зарегистрирован:
6 февраля 2009, 23:15
Был:17 февраля 2009, 0:35
kate&lena
smsup
Дата: 16 февраля 2009, 23:44 Сообщение № 1
Необходимо написать класс для работы с графикой. Создать иерархию классов, описывающие точку, линию, прямоугольник, окружность, полином и функцию для перемещения фигур (с помощью клавиш "влево", "вправо" и т.д.). В итоге должна получиться перемещающаяся фигура - ЛАЙНЕР.
Пользователь: kate&lena
Сообщений: 6
Статус: Пользователь
Зарегистрирован:
6 февраля 2009, 23:15
Был:17 февраля 2009, 0:35
kate&lena
smsup
Дата: 16 февраля 2009, 23:46 Сообщение № 2
Код на С++

#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <iostream.h>

//------------------------POINT-------------------------------------------

class Point{
protected:
int x, y;
public:
Point();
virtual void show();
virtual void hide();
virtual void move(int x, int y);
};

Point::Point()
{
x = getmaxx()/2;
y = getmaxy()/2;
}

void Point::show()
{
putpixel( x, y, WHITE);
putpixel( x+1, y, WHITE);
putpixel( x, y+1, WHITE);
putpixel( x+1, y+1, WHITE);
}

void Point::hide()
{
putpixel( x, y, BLACK);
putpixel( x+1, y, BLACK);
putpixel( x, y+1, BLACK);
putpixel( x+1, y+1, BLACK);
}

void Point::move(int x, int y)
{
hide();
this-> x += x;
this-> y += y;
show();
}

//-------------------------LINIA------------------------------------------

class Linia:virtual public Point
{
protected:
int dx, dy;
public:
void show();
void hide();
};


void Linia::show()
{
setcolor(WHITE);
line( x, y, x+30, y+30);
}

void Linia::hide()
{
setcolor(BLACK);
line( x, y, x+30, y+30);
}

//------------------------ARC---------------------------------------------

class Korpus:virtual public Linia
{
public:
void show();
void hide();
};

void Korpus::show()
{
setcolor(WHITE);
moveto(x,y);
lineto(x,y-20);
lineto(x+100,y-20);
lineto(x+110,y-30);
lineto(x+170,y-30);
lineto(x+140,y);
lineto(x,y);

moveto(x+40,y-20);
lineto(x+40,y-30);
lineto(x+40,y-40);
lineto(x+130,y-40);
lineto(x+130,y-30);

setcolor(DARKGRAY);
line(x+100,y-50,x+100,y-100);

setcolor(DARKGRAY);
moveto(x+170,y-30);
lineto(x+100,y-100);
lineto(x,y-20);

}

void Korpus::hide()
{
setcolor(BLACK);

moveto(x,y);
lineto(x,y-20);
lineto(x+100,y-20);
lineto(x+110,y-30);
lineto(x+170,y-30);
lineto(x+140,y);
lineto(x,y);

moveto(x+40,y-20);
lineto(x+40,y-30);
lineto(x+40,y-40);
lineto(x+130,y-40);
lineto(x+130,y-30);

line(x+100,y-50,x+100,y-100);

moveto(x+170,y-30);
lineto(x+100,y-100);
lineto(x,y-20);
}


//-------------------------CIRCLE------------------------------------------

class Circle:virtual public Linia
{
public:
void show();
void hide();
};

void Circle::show()
{
setfillstyle(SOLID_FILL,YELLOW);
setcolor(YELLOW) ;
pieslice(x+120,y-20,0,360,5);
pieslice(x+140,y-20,0,360,5);
circle(x+120,y-20,5);
circle(x+140,y-20,5);

}
void Circle::hide()
{
setfillstyle(SOLID_FILL, BLACK);
setcolor(BLACK);
pieslice(x+120,y-20,0,360,5);
pieslice(x+140,y-20,0,360,5);
circle(x+120,y-20,5);
circle(x+140,y-20,5);
}


//------------------------RECTANGLE--------------------------------------

class Rectangle:virtual public Linia
{
public:
void show();
void hide();
};

void Rectangle::show()
{
setcolor(WHITE);
rectangle(x+80,y-40,x+110,y-50);
rectangle(x+70,y-40,x+80,y-70);

}

void Rectangle::hide()
{
setcolor(BLACK);
rectangle(x+80,y-40,x+110,y-50);
rectangle(x+70,y-40,x+80,y-70);

}

//--------------------------TITANIC-------------------------------------------

class Titanic:virtual public Korpus,Circle,Rectangle
{
public:
void show();
void hide();
};

void Titanic::show()
{
Korpus::show();
Circle::show();
Rectangle::show();
}

void Titanic::hide()
{
Korpus::hide();
Circle::hide();
Rectangle::hide();
}

void move_object(Point *p)
{
char c;
setbkcolor(BLACK);
clrscr();
cleardevice();
p->move(0,0);
cout <<"-ESC- to exit";

while(c!=27)
{
c = getch();

switch(c)
{
case 75:
p->move(-5,0);
break;

case 72:
p->move(0,-5);
break;

case 77:
p->move(5,0);
break;

case 80:
p->move(0,5);
break;

default:
break;
}
}
}

void menu()
{
int c;

while(c!=7)
{
printf("MENU:\n");
cout << " -1- TOCHKA" << endl;
cout << " -2- LINIA" << endl;
cout << " -3- TRUBI" << endl;
cout << " -4- ILLIUMINATORI" << endl;
cout << " -5- KORPUS" << endl;
cout << " -6- KORABLI" << endl;
cout << " -7- EXIT" << endl<<endl;
cout << "-->";
cin >> c;

switch(c)
{
case 1:
Point p;
move_object(&p);
break;

case 2:
Linia l;
move_object(&l);
break;

case 3:
Rectangle r;
move_object(&r);
break;

case 4:
Circle c;
move_object(&c);
break;

case 5:
Korpus k;
move_object(&k);
break;

case 6:
Titanic t;
move_object(&t);
break;

default:
break;
}

clrscr();
cleardevice();
}
}

void main()
{
int gdriver = DETECT, gmode, errorcode;
initgraph(&gdriver, &gmode, "C:\\BC\\BGI"); //здесь укажите свой путь к BGI
errorcode = graphresult();

if (errorcode != grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}

menu();

closegraph();
}
Пользователь: arhangel01
Сообщений: 1
Статус: Незримый
Зарегистрирован:
16 февраля 2009, 22:07
Был:25 февраля 2009, 6:30
arhangel01
smsup
Дата: 25 февраля 2009, 0:59 Сообщение № 3
Я че-то не понял, в Си есть просто графический режим?
Пользователь: flieng
Сообщений: 3
Статус: Незримый
Зарегистрирован:
3 марта 2009, 3:33
Был:4 октября 2010, 5:28
flieng
smsup
Дата: 3 марта 2009, 3:36 Сообщение № 4
)) да ... а меня эта реализация проперла)) .. спс за пример)
Пользователь: critic
Сообщений: 2
Статус: Незримый
Зарегистрирован:
12 марта 2009, 20:52
Был:12 марта 2009, 20:59
critic
smsup
Дата: 12 марта 2009, 20:55 Сообщение № 5
С Вистой только будут проблемы - DOSBox придется ставить

Страницы: 1