#include #include #include #include #define TAULUKOKO 199 void laske(); void haekuva(char *nimi); void piirra(int kx,int ky,int kz); int initmouse(); void putmouse(int, int); void mouseposition(int *,int *); int leftbutton(); int sinit[360],cosinit[360]; int taulu[TAULUKOKO+1][4]; int koko; int k1,k2,xk,yk; long int s,et1,et2; main(int argc,char *argv[]) { int l,l2,a,b,g,x,y,vx,vy,lx,ly,ry,hy,EGA; if (argc<2) { printf("You should give the name of the picture, eg. 3D KUVA.DAT"); exit(1); } if (initmouse()!=-1) { printf("Mouse not installed"); exit(1); } printf("Loading picture data...\n"); haekuva(argv[1]); detectgraph(&a,&b); if (a==3) EGA=1; else EGA=0; initgraph(&a,&b,''); laske(); ry=getmaxy()+1; hy=getmaxy()/10+1; g=1; if (EGA) setactivepage(g); setcolor(getmaxcolor()); initmouse(); putmouse(xk,yk); x=0; y=0; do { vx=x; vy=y; mouseposition(&x,&y); if (vx!=x || vy!=y) { lx=x-320; if (lx<0) lx=lx+640; lx=lx*36/64; ly=y-yk; if (ly<0) ly=ly+ry; ly=ly*36/hy; cleardevice(); piirra(ly,lx,0); if (EGA) setvisualpage(g); g=1-g; if (EGA) setactivepage(g); } } while (!leftbutton()); closegraph(); } void laske() { int l; s=taulu[0][0]; et1=taulu[0][1]; et2=taulu[0][2]; k1=getmaxy()*4/40+1; k2=getmaxx()*3/40+1; xk=getmaxx()/2+1; yk=getmaxy()/2+1; printf("Calculating sine and cosine...\n"); for(l=0;l<360;l++) { sinit[l]=(int)(sin( (double)l/180*M_PI )*256); cosinit[l]=(int)(cos( (double)l/180*M_PI )*256); } } void piirra(int kx,int ky,int kz) { int l; long int p,x1,y1,z1,x2,y2,z2; int x,y; int vx=0; int vy=0; for(l=1;l> 8)-(z1*sinit[ky] >> 8); z2=(x1*sinit[ky] >> 8)+(z1*cosinit[ky] >> 8); x1=(x2*cosinit[kz] >> 8)+(y1*sinit[kz] >> 8); y2=-(x2*sinit[kz] >> 8)+(y1*cosinit[kz] >> 8); p=(256*et1)/((z2 >> 8)+et1+et2); x=(x1*p) >> 8; y=((y2*k1/k2)*p) >> 8; x=(x*s >> 8)+xk; y=-(y*s >> 8)+yk; if (taulu[l][0]==0) line(vx,vy,x,y); vx=x; vy=y; } } void haekuva(char *nimi) { int c; char lu[5]; int l1,l2,cl; FILE *fp; fp=fopen(nimi,"r"); if (fp==NULL) { printf("File %s didn't open properly. Execution halted.\n",nimi); exit(1); } l1=0; l2=0; while((c=getc(fp))!=EOF && l1<=TAULUKOKO) { if ((c>47 && c<58) || c==45) { cl=0; while((c>47 && c<58) || c==45) { lu[cl]=c; cl++; c=getc(fp); } lu[cl]=0; taulu[l1][l2]=atoi(lu); l2++; if (l2>3) { l1++; l2=0; } } } koko=l1; fclose(fp); } int initmouse() { struct REGPACK regs; regs.r_ax=0; intr(51,®s); return(regs.r_ax); } void mouseposition(int *x,int *y) { struct REGPACK regs; regs.r_ax=3; intr(51,®s); *x=regs.r_cx; *y=regs.r_dx; } int leftbutton() { struct REGPACK regs; regs.r_ax=3; intr(51,®s); return (regs.r_bx & 1); } void putmouse(int x,int y) { struct REGPACK regs; regs.r_ax=4; regs.r_cx=x; regs.r_dx=y; intr(51,®s); }