/* #define TESTROT 1 */ #ifdef TESTROT int b[3] = {100,0,0} , c[3] = {0,0,0}; #endif #include #include #define SI(x) si[x] #define CO(x) si[x+64] extern int si[1024]; brot (c,b, x, y, z) int b[3]; int c[3]; int x,y,z; { static int rm[3][3], rmx=-1000, rmy=-1000, rmz=-1000; int cx,cy,cz, sx,sy,sz; if (x != rmx || y != rmy || z != rmz ) { cx = CO(x); cy = CO(y); cz = CO(z); sx = SI(x); sy = SI(y); sz = SI(z); rm[0][0] = cz*cy/256; rm[0][1] = -(cz*((sy*sx)/256))/256-(sz*cx)/256; rm[0][2] = -(cz*((sy*cx)/256))/256+(sz*sx)/256; rm[1][0] = (sz*cy)/256; rm[1][1] = -(sz*((sy*sx)/256))/256+(cz*cx)/256; rm[1][2] = -(sz*((sy*cx)/256))/256-(cz*sx)/256; rm[2][0] = sy; rm[2][1] = (cy*sx)/256; rm[2][2] = (cy*cx)/256; #ifdef TESTROT printmat(rm); #endif rmx = x; rmy = y; rmz = z; } matvec(c,rm,b); } matvec(c,m,b) int c[3], m[3][3], b[3]; { int i,j; for (i=0; i<3; i++) { c[i] = 0; for (j=0; j<3; j++) c[i] += m[i][j] * b[j]/256; } } printvec(v) int v[3]; { int i; for (i=0; i<3; i++) printf(" %d ",v[i]); printf("\n"); } printmat(m) int m[3][3]; { int i,j; for (i=0; i<3; i++) { for (j=0; j<3; j++) printf(" %d ",m[i][j]); printf("\n"); } } #ifdef TESTROT main(argc,argv) int argc; char *argv[]; { int ii; int x,y,z; if (argc != 4) exit(-1); sscanf(argv[1],"%d",&x); sscanf(argv[2],"%d",&y); sscanf(argv[3],"%d",&z); printvec(b); printvec(c); for (ii=0; ii<2*256; ii++) si[ii]=(int) (256.0*sin(ii*2*PI/256)); brot(c,b,x,y,z); printvec(c); b[0] = 0; b[1] = 256; b[2] = 0; printvec(b); brot(c,b,x,y,z); printvec(c); b[0] = 0; b[1] = 0; b[2] = 256; printvec(b); brot(c,b,x,y,z); printvec(c); } #endif