Descripcion
Utilizacion de las funciones virtuales puras para crear un circulo, rectangulo y triangulo, y estas figuras se moveran en pantalla por medio de las flechas del teclado, dicho movimiento no tendra que salirse de los limites de pantalla y ademas se crearan los objetos de forma dinamica.
Procedimiento
QUE SON LAS FUNCIONES VIRTULES PURAS?
Son todas aquellas funciones virtuales cuyo codigo es nulo, y ademas este tipo de funciones virtuales se utilizan con clases abstractas.
PASOS
Lo primero que haremos sera crear la clase principal, que apartir de la cual se crearan las figuras:
/*se incluye las librerias*/
#include<iostream.h>
#include<ctype.h>
#include <conio.h>
#include <stdio.h>
#include <graphics.h>
#define ESC '\x1b'
void inicializa() /* se inicializa el modo grafico*/
{
int gd, gm;
gd=DETECT, gm;
initgraph(&gd,&gm,"c:\\tc\\bgi");
}
class figuras /* esta es la clase, apartir de esta se crearan las figuras*/
{
protected:
int color;
public:
virtual void dibujar()=0; /* esta es la funcion virtual pura que se encargara de dibujar las figuras, como vemos esta con codigo nulo*/
virtual void mover(int xx, int yy)=0; /*esta es la funcion virtual pura que movera a las figuras */
};
Ahora comenzaremos la creacion de la primera figura, que es el circulo:
Primero craremos la clase del
circulo, la cual heredara a la clase principal
figuras, para poder utilizar las funciones virtuales que contiene la clase figuras:
Insertar CODE, HTML o PHP:
class circulo:public figuras
{
public:
int x,y,radio;
void inicializa(int, int, int);
void dibujar(); /*aqui ya se inicializa esta funcion, que es heredada de la clase figuras*/
void mover(int xx, int yy); /*aqui tambien ya se inicializa esta funcion*/
};
Cabe hacer notar que en las clase figuras las funciones virtuales se igualaban a 0, para que su contenido sea nulo, asi por ejemplo no es lo mismo
void dibjar()=0; y
void dibujar();
Hacemos lo mismo para las clases de las figuras del rectangulo y triangulo:
Insertar CODE, HTML o PHP:
class rectangulo:public figuras
{
public:
int x, y, b, h;
void inicializa(int, int, int, int);
void dibujar();
void mover(int xx, int yy);
};
class triangulo:public figuras
{
public:
int x, y, b, h;
void inicializa(int, int, int, int);
void dibujar();
void mover(int xx, int yy);
};
Nuestro siguiente paso es el de inicializar los valores de las coordenadas, radio,color, etc.. , en todas nuestras figuras:
Insertar CODE, HTML o PHP:
void circulo::inicializa(int xx, int yy, int r)
{
x=xx; /*posicion inicial en x*/
y=yy; /*posicion inicial en y*/
radio=r; /*radio del circulo*/
color=9; /*color del circulo*/
}
void rectangulo::inicializa(int xx, int yy, int bb, int hh)
{
x=xx; /*posicion inicial en x*/
y=yy; /*posicion inicial en y*/
b=bb; /*base del rectangulo*/
h=hh; /*altura del rectangulo*/
color=14; /*color del rectangulo*/
}
void triangulo::inicializa(int xx, int yy, int bb, int hh)
{
setcolor(14);
x=xx; /*posicion inicial en x*/
y=yy; /*posicion inicial en y*/
b=bb; /*base del triangulo*/
h=hh; /*altura del triangulo*/
color=14; /*color del triangulo*/
}
Ahora sigue dibujar las figuras, mediante la funcion heredada
dibujar :
Tanto para el circulo como para el rectangulo, estas funciones seran extremadamente sencillas, pues c++, nos proporciona las respectivas funciones para dibujarlas: f
illellipse(); y bar().
Pero para dibujar el triangulo se dificulta un poco, porque no tenemos una funcion que nos permita dibujar directamente un triangulo, para ello tendremos que usar las instrucciones de poligonos:
int poly[n];
Insertar CODE, HTML o PHP:
void circulo::dibujar()
{
setcolor(BLACK);
setbkcolor(BLACK);
setfillstyle(2,15);
fillellipse(x,y,radio,radio); /*dibujar el circulo*/
}
void rectangulo::dibujar()
{
setcolor(BLACK);
setbkcolor(BLACK);
setfillstyle(7, 14);
bar(x,y, x+b, y+h); /*dibujar el rectangulo*/
}
void trian(int x1,int y1,int x2,int y2,int x3,int y3,int relleno,int color)
{
setcolor(BLACK);
int poly[6];
poly[0]=x1; /*representa el primer punto del triangulo, y asi sucesivamente hasta poly[5]*/
poly[1]=y1;
poly[2]=x2;
poly[3]=y2;
poly[4]=x3;
poly[5]=y3;
setfillstyle(4,color);
fillpoly(3,poly);
}
void triangulo::dibujar()
{
setcolor(BLACK);
setbkcolor(BLACK);
trian(x,y,x+b/2,y+h,x-b/2,y+h,1,3); /*dibujamos el triangulo*/
}
Nuestro siguiente paso, sera codificar las instrucciones que nos permitan dar movimiento a nuestras figuras, aun no utilizaremos las flechas, solo son las instrucciones de movimiento:
Insertar CODE, HTML o PHP:
void circulo::mover(int xx, int yy)
{
setcolor(BLACK);
setfillstyle(1,BLACK);/*instruccion para borrar la figura de su posicion antigua*/
fillellipse(x, y, radio, radio);
x=xx;
y=yy;
dibujar(); /*dibujar la figura en su posicion actual*/
}
void rectangulo::mover(int xx, int yy)
{
setcolor(BLACK);
setfillstyle(1,BLACK);
bar(x, y, x+b, y+h);
x=xx;
y=yy;
dibujar();
}
void triangulo::mover(int xx, int yy)
{
setcolor(BLACK);
setfillstyle(1,BLACK);
trian(x,y,x+b/2,y+h,x-b/2,y+h,1,BLACK);
x=xx;
y=yy;
dibujar();
}
Creamos nuestro menu, para poder seleccionar entre las tres figuras:
Insertar CODE, HTML o PHP:
void menu()
{
inicializa();
clearviewport();
setbkcolor(BLACK);
setcolor(14);
outtextxy(220,100," PRACTICA DE FIGURAS ");
setcolor(3);
outtextxy(250,150," [1] C¡rculo");
setcolor(9);
outtextxy(250,200," [2] Rect ngulo");
setcolor(3);
outtextxy(250,250," [3] Tri ngulo");
setcolor(9);
outtextxy(250,300," [4] Salir");
for(int s=0;s<650;s++)
{
outtextxy(s,80,"+");
outtextxy(s,320,"+");
}
for(int w=0;w<460;w++)
{
outtextxy(100,w,"+");
outtextxy(500,w,"+");
}
}
Ahora nos queda un ultimo paso, crear el codigo que nos permita seleccionar entre las tres figuras, mover la figura, pedir al usuario los datos como por ejemplo el valor del radio del circulo, etc..
Veamos como queda ese código:
Insertar CODE, HTML o PHP:
void main(void)
{
int x, y, radio, b, h;
char tecla,opcion;
clrscr();
do{
menu(); /*imprimimos el menu*/
opcion=getch();
switch (opcion)
{
case'1':
clearviewport();
setcolor(11);
outtextxy(250,100,"C I R C U L O");
gotoxy(26,11);cout<<"Radio: ";cin>>radio; /*pedimos el radio del circulo*/
circulo*circ; /*creacion del objeto circ de forma dinamica lo mismo se hace en las otras figuras*/
circ=new circulo;
inicializa();
circ->inicializa(radio, radio, radio);
circ->dibujar();
do{
tecla=getch();
switch(tecla)
{
case 0:
tecla =getch();
switch(tecla)
{
/*aqui inician las comparaciones para saber que flecha se presiono, y para ver que le circulo no abandone los limites de la pantalla esto se hace en cada figura/*
case '\x4D':
if(circ->x<640-(radio*2))circ->mover(circ->x+10,circ->y);
break;
case '\x4B':
if(circ->x>radio)circ->mover(circ->x-10,circ->y);
break;
case '\x48':
if(circ->y>radio)circ->mover(circ->x,circ->y-10);
break;
case '\x50':
if(circ->y<480-(radio*2)) circ->mover(circ->x,circ->y+10);
break;
} break;
}
}while(tecla!='\xd');
break;
case '2':
clearviewport();
setcolor(14);
outtextxy(250,100,"R E C T A N G U L O");
gotoxy(26,11);cout<<"Base : ";cin>>b;
gotoxy(26,13);cout<<"Altura: "; cin>>h;
rectangulo*rect;
rect=new rectangulo;
inicializa();
rect->inicializa(0, 0, b, h);
rect->dibujar();
do{
tecla=getch();
switch(tecla)
{ case 0:
tecla =getch();
switch(tecla)
{
case '\x4D':
if(rect->x<640-b)rect->mover(rect->x+10,rect->y);
break;
case '\x4B':
if(rect->x>0)rect->mover(rect->x-10,rect->y);
break;
case '\x48':
if(rect->y>0)rect->mover(rect->x,rect->y-10);
break;
case '\x50':
if(rect->y<480-h)rect->mover(rect->x,rect->y+10);
break;
} break;
}
}while(tecla!='\xd');
break;
case '3':
clearviewport();
setcolor(14);
outtextxy(250,100,"T R I A N G U L O");
gotoxy(26,11); cout<<"Base: ";cin>>b;
gotoxy(26,13); cout<<"Altura: "; cin>>h;
triangulo*tri;
tri=new triangulo;
inicializa();
tri->inicializa(b/2, 0, b, h);
tri->dibujar();
do{
tecla=getch();
switch(tecla)
{
case 0:
tecla =getch();
switch(tecla)
{
case '\x4D':
if(tri->x<640-b)tri->mover(tri->x+10,tri->y);
break;
case '\x4B':
if(tri->x>b/2)tri->mover(tri->x-10,tri->y);
break;
case '\x48':
if(tri->y>0)tri->mover(tri->x,tri->y-10);
break;
case '\x50':
if(tri->y<480-h)tri->mover(tri->x,tri->y+10);
break;
}break;
}
}while(tecla!='\xd');
closegraph();
break;
case '4':
opcion=ESC;
break;
}
}while (opcion!=ESC);
}
Bueno aqui termina este articulo.