Anda di halaman 1dari 6

//Ing.

Carlos Fernando Jiménez Pugliese


//Julio del 2003
//charlytospage@yahoo.com.mx
//Extensión de la librería no estándar winbgim.h para darle capacidad 3D
// Incluir en la línea de comandos del LINKER "-lbgi -lgdi32 -luser32"
//El código no es portable

#include <winbgim.h>
#include <stdlib.h>
#include<math.h>
#include<iostream.h>

void box3d(int x,int y,int z,int lado,double fi);

//Mueve el cursor un un nuevo CP en un espacio 3d


void moveto3d(int cx,int cy,int cz,double fi);

//Grafica una suferficie en un espacio 3d


void superficie(int x,int y,int z,double *p,int size,double fi);

//Linea en un epacio de 3d desde el CP hasta uno nuevo


void lineto3d(int cx,int cy,int cz,double fi);

//Dubuja los ejes cartesianos


void ejes3d(double fi);

void pix3d(int cx,int cy,int cz,double fi);

//trans2dx y trans2dy traduce coordenadas de un espacio tridimensional


//para representarlas en un plano de dos dimensiones
int trans2dx(int x,int y,int z,double fi);
int trans2dy(int x,int y,int z,double fi);

int orgx=400,orgy=240; //origen de los ejes coordenadas


double xf=-1000.1,yf=100.1,zf=200.1; //punto de fuga

main()
{
int x=0,y=0,z=0,size=150;

initwindow(800,600); //open a 400x300 graphics window

//Dimensión de la matriz cuadrada donde estará la información


//para gráfica la función p
//índice de filas =coordenada x
//índice de columnas coordenada y
// p[fila][columna]=f(x,y)= coordenada z

//Asignación dinámica de memoria para la matriz p


double *p,fi=0;
p=new double [size*size];
if(!p)
{
cout << "error de asignación de memoria";
exit(1);
}

// Bucle para crear la matriz p con la información adecuada


for (y=0;y<size;y++)
for (x=0;x<size;x++)

//Algunas funciones 3D de muestra


//Para visualizar alguna borre los //
//*(p+size*x+y)=pow(((double)y-70)/5,2)+pow(((double)x-70)/5,2);
//*(p+size*x+y)=sqrt(-pow(((double)(x-50)),2) -pow(((double)(y-50)),2)+20000);
//*(p+size*x+y)= pow(((double)y-70)/5,2);
*(p+size*x+y)=100*sin( (double) (y-200)/15);
//*(p+size*x+y)=50*sin( (double) (y-20)/10)*y/200;
//*(p+size*x+y)=50*sin((double)x/20)*sin((double)y/20);
//*(p+size*x+y)=100.000*sin((double)x/20)*cos((double)y/20);
//*(p+size*x+y)=0;

// Bucle para simular una superficie que rota


//for (double i=-100;i<100;i=i+0.1)
//{

cleardevice(); // Borra la pantalla


//ejes3d(3.14/6); // Dibuja los ejes

// Crea una superficie de la matriz p


// de tma¤o size y ángulo i en radianes

for(fi=0;fi<600.28;fi+=.05)
{

cleardevice();
ejes3d(0); // Dibuja los ejes
superficie(-500,y,z,p,size,fi);
box3d(50,y,z,100,fi);

delay(0.1);

};

//};
system("pause");
closegraph(); //close graphics window

return 0;
}

// Traza una línea en un espacio 3d desde la coordenada


// actual hasta la nueva coordenada con un ángulo fi.
void lineto3d(int cx,int cy,int cz,double fi)
{
int corx,cory;
corx=trans2dx(cx,cy,cz,fi);
cory=trans2dy(cx,cy,cz,fi);

lineto(corx+orgx,cory+orgy);
}

// Dibuja un punto en un espacio 3d con un ángulo fi


void pix3d(int cx,int cy,int cz,double fi)
{
int corx,cory;

corx=trans2dx(cx,cy,cz,fi);
cory=trans2dy(cx,cy,cz,fi);
putpixel(corx+orgx,cory+orgy,10);
}

//Cambia la coordenada actual por una nueva en un espacio 3d


void moveto3d(int cx,int cy,int cz,double fi)
{
int corx,cory;

corx=trans2dx(cx,cy,cz,fi);
cory=trans2dy(cx,cy,cz,fi);
moveto(corx+orgx,cory+orgy);
}

// Crea una superficie de la matriz p


// de tma¤o size y angulo i en radianes
void superficie(int offx,int offy,int offz,double *p,int size,double fi)
{
setcolor(2);
int r=0,g=0,b=0,colorz,x=0,y=0;
double z;
int grid;
grid=5;
int scale=1; //escala del grafico
z=*(p+x*size+y);

//moveto3d((x+offx)*scale,(y+offy)*scale,(int)(z+offz)*scale,fi); //Punto inicial


moveto3d((x+offx)*scale,(y+offy)*scale,(int)(z+offz)*scale,fi); //Punto inicial

for (y=0;y<size;y=y+grid)
{

for (x=0;x<size;x=x+grid)
{

z=*(p+x*size+y);

//colorz=((300+(int)z)/800)*255;

//setcolor(COLOR(colorz,colorz,200));

lineto3d((x+offx)*scale,(y+offy)*scale,(int)(z+offz)*scale,fi);
}
z=*(p+y+grid);
moveto3d((offx)*scale,((y+grid+offy)*scale),((int)z+offz)*scale,fi); ///Proximo punto
//moveto3d(0,(y+grid)*size,z*scale,fi); ///Proximo punto

r=0,g=0,b=0,x=0,y=0;
z=*(p+x*size+y);
//moveto3d(offx*scale,offy*scale,(int)(z+offz)*scale,fi); //Punto inicial
moveto3d((x+offx)*scale,(y+offy)*scale,(int)(z+offz)*scale,fi); //Punto inicial

for (x=0;x<size;x=x+grid)
{

for (y=0;y<size;y=y+grid)
{
z=*(p+x*size+y);

//colorz=((300+(int)z)/800)*255;

//setcolor(COLOR(colorz,colorz,200));

lineto3d((x+offx)*scale,(y+offy)*scale,(int)(z+offz)*scale,fi);

z=*(p+(x+grid)*size);

moveto3d((x+grid+offx)*scale,(offy)*scale,(int)(z+offz)*scale,fi); //Punto inicial

//exit(1);

//punto inicial
}

// Dibuja los ejes x,y,z


void ejes3d(double fi)
{
setcolor(15);
moveto3d(0,0,0,fi);
lineto3d(-100,0,0,fi);

moveto3d(0,0,0,fi);
lineto3d(0,100,0,fi);

moveto3d(0,0,0,fi);
lineto3d(0,0,100,fi);
};
//Convierte la coordenada 'x' de 3d a 2d
int trans2dx(int x,int y,int z,double fi)
{ int x2d;

// Rotación en (x,y)
int cx,cy;
cx=x;cy=y;
y=cy*cos(fi)-cx*sin(fi);
x=cy*sin(fi)-cx*cos(fi);

//Proyección de sistema 3D con un punto de fuga


//a un sistema 2D coordenada x

double deltaz,deltay,beta,alfa;
beta=atan( (double)(z-zf)/(double)(x-xf));
deltaz=(double)x*sin(beta);
alfa=atan((double)(zf-z)/(double)(yf-y));
deltay=deltaz/tan(alfa);
//x2d=y-x*cos(fi);
x2d=(int)(y-deltay);
return x2d;
};

//Convierte la coordenada 'y' de 3d a 2d

int trans2dy(int x,int y,int z,double fi)


{ int y2d;

// Rotación en (x,y)
int cx,cy;
cx=x;cy=y;
y=cy*cos(fi)-cx*sin(fi);
x=cy*sin(fi)-cx*cos(fi);

//Proyección de sistema 3D con un punto de fuga


//a un sistema 2D coordenada y
double deltaz,beta;
beta=atan( (double)(z-zf)/(double)(x-xf));
deltaz=(double)x*sin(beta);
//y2d=100-z+x*sin(fi);
y2d=(int)(100-(double)z+deltaz);
return y2d;
};

void box3d(int x,int y,int z,int lado,double fi)


{

moveto3d(x,y,z,fi);
lineto3d(x+lado,y,z,fi);
lineto3d(x+lado,y+lado,z,fi);
lineto3d(x,y+lado,z,fi);
lineto3d(x,y,z,fi);

moveto3d(x+lado,y,z+lado,fi);
lineto3d(x+lado,y+lado,z+lado,fi);
lineto3d(x,y+lado,z+lado,fi);
lineto3d(x,y,z+lado,fi);
lineto3d(x+lado,y,z+lado,fi);

moveto3d(x+lado,y,z+lado,fi);
lineto3d(x+lado,y,z,fi);
moveto3d(x+lado,y+lado,z+lado,fi);
lineto3d(x+lado,y+lado,z,fi);
moveto3d(x,y+lado,z+lado,fi);
lineto3d(x,y+lado,z,fi);
moveto3d(x,y,z+lado,fi);
lineto3d(x,y,z,fi);

Anda mungkin juga menyukai