Está en la página 1de 6

//Ing. Carlos Fernando Jimnez Pugliese //Julio del 2003 //charlytospage@yahoo.com.mx //Extensin de la librera no estndar winbgim.

h para darle capacidad 3D // Incluir en la lnea de comandos del LINKER "-lbgi -lgdi32 -luser32" //El cdigo 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 //Dimensin de la matriz cuadrada donde estar la informacin //para grfica la funcin p //ndice de filas =coordenada x //ndice de columnas coordenada y // p[fila][columna]=f(x,y)= coordenada z //Asignacin dinmica de memoria para la matriz p double *p,fi=0; p=new double [size*size]; if(!p) { cout << "error de asignacin de memoria";

exit(1);

// Bucle para crear la matriz p con la informacin 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 tmao 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 lnea 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 tmao 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; // Rotacin en (x,y) int cx,cy; cx=x;cy=y; y=cy*cos(fi)-cx*sin(fi); x=cy*sin(fi)-cx*cos(fi); //Proyeccin 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; // Rotacin en (x,y) int cx,cy; cx=x;cy=y; y=cy*cos(fi)-cx*sin(fi); x=cy*sin(fi)-cx*cos(fi); //Proyeccin 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); }

También podría gustarte