void build_transformation_matrix(VIO_Transform *trans, double *center, double *translations, double *scales, double *shears, double *rotations) { float **T, **SH, **S, **R, **C, **T1, **T2, **T3, **T4; int i,j; ALLOC2D(T ,5,5); ALLOC2D(SH ,5,5); ALLOC2D(S ,5,5); ALLOC2D(R ,5,5); ALLOC2D(C ,5,5); ALLOC2D(T1 ,5,5); ALLOC2D(T2 ,5,5); ALLOC2D(T3 ,5,5); ALLOC2D(T4 ,5,5); /* mat = (T)(C)(SH)(S)(R)(-C) */ nr_identf(T,1,4,1,4); /* make (T)(C) */ for(i=0; i<3; i++) { T[1+i][4] = translations[i] + center[i]; } /* make rotation matix */ make_rots(R, (float)(rotations[0]), (float)(rotations[1]), (float)(rotations[2])); /* make shear rotation matrix */ make_shears(SH, shears); /* make scaling matrix */ nr_identf(S,1,4,1,4); for(i=0; i<3; i++) { S[1+i][1+i] = scales[i]; } nr_identf(C,1,4,1,4); /* make center */ for(i=0; i<3; i++) { C[1+i][4] = -center[i]; } nr_multf(T, 1,4,1,4, S ,1,4,1,4, T1 ); nr_multf(T1,1,4,1,4, SH ,1,4,1,4, T2 ); nr_multf(T2,1,4,1,4, R ,1,4,1,4, T3 ); nr_multf(T3,1,4,1,4, C ,1,4,1,4, T4 ); for(i=0; i<4; i++) for(j=0; j<4; j++) Transform_elem(*trans, i, j ) = T4[i+1][j+1]; FREE2D(T ); FREE2D(SH ); FREE2D(S ); FREE2D(R ); FREE2D(C ); FREE2D(T1 ); FREE2D(T2 ); FREE2D(T3 ); FREE2D(T4 ); }
/* ----------------------------- MNI Header ----------------------------------- @NAME : build_inverse_transformation_matrix @INPUT : center, translations, scales, rotations @OUTPUT : the inverse linear transformation matrix of mat: since mat = (T)(C)(SH)(S)(R)(-C), then invmat = (C)(inv(r))(inv(S))(inv(SH))(-C)(-T) @RETURNS : nothing @DESCRIPTION: the matrix is to be PREmultiplied with a vector (mat*vec) when used in the application @METHOD : @GLOBALS : @CALLS : @CREATED : Tue Jun 15 16:45:35 EST 1993 LC @MODIFIED : ---------------------------------------------------------------------------- */ void build_inverse_transformation_matrix(VIO_Transform *trans, double *center, double *translations, double *scales, double *shears, double *rotations) { float **T, **SH, **S, **R, **C, **T1, **T2, **T3, **T4; int i,j; ALLOC2D(T ,5,5); ALLOC2D(SH ,5,5); ALLOC2D(S ,5,5); ALLOC2D(R ,5,5); ALLOC2D(C ,5,5); ALLOC2D(T1 ,5,5); ALLOC2D(T2 ,5,5); ALLOC2D(T3 ,5,5); ALLOC2D(T4 ,5,5); /* invmat = (C)(inv(r))(inv(S))(inv(SH))(-C)(-T) mat = (T)(C)(SH)(S)(R)(-C) */ nr_identf(T,1,4,1,4); /* make (-T)(-C) */ for(i=0; i<3; i++) { T[1+i][4] = -translations[i] - center[i]; } /* make rotation matix */ make_rots(T1, (float)(rotations[0]), (float)(rotations[1]), (float)(rotations[2])); transpose(4,4,T1,R); make_shears(T1,shears); /* make shear rotation matrix */ invertmatrix(4, T1, SH); /* get inverse of the matrix */ /* make scaling matrix */ nr_identf(S,1,4,1,4); for(i=0; i<3; i++) { if (scales[i] != 0.0) S[1+i][1+i] = 1/scales[i]; else S[1+i][1+i] = 1.0; } nr_identf(C,1,4,1,4); /* make center */ for(i=0; i<3; i++) { C[1+i][4] = center[i]; } nr_multf(C,1,4,1,4, R ,1,4,1,4, T1 ); nr_multf(T1,1,4,1,4, SH,1,4,1,4, T2 ); nr_multf(T2,1,4,1,4, S ,1,4,1,4, T3 ); nr_multf(T3,1,4,1,4, T ,1,4,1,4, T4 ); for(i=0; i<4; i++) for(j=0; j<4; j++) Transform_elem(*trans, i, j ) = T4[i+1][j+1]; FREE2D(T ); FREE2D(SH ); FREE2D(S ); FREE2D(R ); FREE2D(C ); FREE2D(T1 ); FREE2D(T2 ); FREE2D(T3 ); FREE2D(T4 ); }
static Bool InitializeAll(struct state *st) { XGCValues xgcv; XWindowAttributes xgwa; /* XSetWindowAttributes xswa;*/ Colormap cmap; XColor color; int n,i; double rspeed; st->cosilines = True; XGetWindowAttributes(st->dpy,st->win[0],&xgwa); cmap=xgwa.colormap; /* xswa.backing_store=Always; XChangeWindowAttributes(st->dpy,st->win[0],CWBackingStore,&xswa);*/ xgcv.function=GXcopy; xgcv.foreground=get_pixel_resource (st->dpy, cmap, "background", "Background"); st->fgc[32]=XCreateGC(st->dpy,st->win[0],GCForeground|GCFunction,&xgcv); n=0; if (mono_p) { st->fgc[0]=st->fgc[32]; xgcv.foreground=get_pixel_resource (st->dpy, cmap, "foreground", "Foreground"); st->fgc[1]=XCreateGC(st->dpy,st->win[0],GCForeground|GCFunction,&xgcv); for (i=0;i<32;i+=2) st->fgc[i]=st->fgc[0]; for (i=1;i<32;i+=2) st->fgc[i]=st->fgc[1]; } else for (i=0;i<32;i++) { color.red=colors[n++]<<8; color.green=colors[n++]<<8; color.blue=colors[n++]<<8; color.flags=DoRed|DoGreen|DoBlue; XAllocColor(st->dpy,cmap,&color); xgcv.foreground=color.pixel; st->fgc[i]=XCreateGC(st->dpy,st->win[0],GCForeground|GCFunction,&xgcv); } st->cgc=XCreateGC(st->dpy,st->win[0],GCForeground|GCFunction,&xgcv); XSetGraphicsExposures(st->dpy,st->cgc,False); st->cosilines = get_boolean_resource(st->dpy, "random","Boolean"); #ifdef HAVE_DOUBLE_BUFFER_EXTENSION if (get_boolean_resource (st->dpy, "useDBE", "Boolean")) st->usedouble = True; st->win[1] = xdbe_get_backbuffer (st->dpy, st->win[0], XdbeUndefined); if (!st->win[1]) { st->usedouble = False; st->win[1] = st->win[0]; } #endif /* HAVE_DOUBLE_BUFFER_EXTENSION */ st->delay=get_integer_resource(st->dpy, "delay","Integer"); rspeed=get_float_resource(st->dpy, "speed","Float"); if (rspeed<0.0001 || rspeed>0.2) { fprintf(stderr,"Speed not in valid range! (0.0001 - 0.2), using 0.1 \n"); rspeed=0.1; } st->sizx=xgwa.width; st->sizy=xgwa.height; st->midx=st->sizx>>1; st->midy=st->sizy>>1; st->stateX=0; st->stateY=0; if (!make_rots(st,rspeed,rspeed)) { fprintf(stderr,"Not enough memory for tables!\n"); return False; } return True; }