void check(vec4 v) { vec4 p = {v[0],v[1],v[2],v[3]}; vec4 q; mat4 m; invproj(m); q[3] = m[3][0]*p[0]+m[3][1]*p[1]+m[3][2]*p[2]+m[3][3]*p[3]; q[0] = (m[0][0]*p[0]+m[0][1]*p[1]+m[0][2]*p[2]+m[0][3]*p[3])/q[3]; q[1] = (m[1][0]*p[0]+m[1][1]*p[1]+m[1][2]*p[2]+m[1][3]*p[3])/q[3]; q[2] = (m[2][0]*p[0]+m[2][1]*p[1]+m[2][2]*p[2]+m[2][3]*p[3])/q[3]; q[3] = 1.0; printf("%f,%f,%f,%f\n",q[0],q[1],q[2],q[3]); invview(m); p[0] = m[0][0]*q[0]+m[0][1]*q[1]+m[0][2]*q[2]+m[0][3]*q[3]; p[1] = m[1][0]*q[0]+m[1][1]*q[1]+m[1][2]*q[2]+m[1][3]*q[3]; p[2] = m[2][0]*q[0]+m[2][1]*q[1]+m[2][2]*q[2]+m[2][3]*q[3]; p[3] = m[3][0]*q[0]+m[3][1]*q[1]+m[3][2]*q[2]+m[3][3]*q[3]; printf("%f,%f,%f,%f\n",p[0],p[1],p[2],p[3]); fixview(m); q[0] = m[0][0]*p[0]+m[0][1]*p[1]+m[0][2]*p[2]+m[0][3]*p[3]; q[1] = m[1][0]*p[0]+m[1][1]*p[1]+m[1][2]*p[2]+m[1][3]*p[3]; q[2] = m[2][0]*p[0]+m[2][1]*p[1]+m[2][2]*p[2]+m[2][3]*p[3]; q[3] = m[3][0]*p[0]+m[3][1]*p[1]+m[3][2]*p[2]+m[3][3]*p[3]; printf("%f,%f,%f,%f\n",q[0],q[1],q[2],q[3]); fixproj(m); p[3] = m[3][0]*q[0]+m[3][1]*q[1]+m[3][2]*q[2]+m[3][3]*q[3]; p[0] = (m[0][0]*q[0]+m[0][1]*q[1]+m[0][2]*q[2]+m[0][3]*q[3])/p[3]; p[1] = (m[1][0]*q[0]+m[1][1]*q[1]+m[1][2]*q[2]+m[1][3]*q[3])/p[3]; p[2] = (m[2][0]*q[0]+m[2][1]*q[1]+m[2][2]*q[2]+m[2][3]*q[3])/p[3]; p[3] = 1.0; printf("%f,%f,%f,%f\n",p[0],p[1],p[2],p[3]); }
int doit(Nrrd *nout, Nrrd *nin, int smart, float amount) { char me[]="doit", err[BIFF_STRLEN]; Nrrd *nproj[3]; airArray *mop; int axis, srl, sap, ssi, E, margin, which; size_t min[3]; if (!(nout && nin)) { sprintf(err, "%s: got NULL pointer", me); biffAdd(NINSPECT, err); return 1; } if (!(3 == nin->dim)) { sprintf(err, "%s: given nrrd has dimension %d, not 3\n", me, nin->dim); biffAdd(NINSPECT, err); return 1; } mop = airMopNew(); airMopAdd(mop, nproj[0]=nrrdNew(), (airMopper)nrrdNuke, airMopAlways); airMopAdd(mop, nproj[1]=nrrdNew(), (airMopper)nrrdNuke, airMopAlways); airMopAdd(mop, nproj[2]=nrrdNew(), (airMopper)nrrdNuke, airMopAlways); /* how much space to put between and around the projections */ margin = 6; /* do projections for each axis, with some progress indication to sterr */ for (axis=0; axis<=2; axis++) { fprintf(stderr, "%s: doing axis %d projections ... ", me, axis); fflush(stderr); if (ninspect_proj(nproj[axis], nin, axis, smart, amount)) { fprintf(stderr, "ERROR\n"); sprintf(err, "%s: trouble doing projections for axis %d", me, axis); biffAdd(NINSPECT, err); airMopError(mop); return 1; } fprintf(stderr, "done\n"); } if (nrrdSpaceRightAnteriorSuperior == nin->space) { if (fixproj(nproj, nin)) { fprintf(stderr, "ERROR\n"); sprintf(err, "%s: trouble orienting projections", me); biffAdd(NINSPECT, err); airMopError(mop); return 1; } } srl = nproj[1]->axis[0+1].size; sap = nproj[0]->axis[0+1].size; ssi = nproj[1]->axis[1+1].size; /* allocate output as 8-bit color image. We know output type is nrrdTypeUChar because ninspect_proj finishes each projection with nrrdQuantize to 8-bits */ if (nrrdMaybeAlloc_va(nout, nrrdTypeUChar, 3, AIR_CAST(size_t, 3), AIR_CAST(size_t, srl + 3*margin + sap), AIR_CAST(size_t, ssi + 3*margin + sap))) { sprintf(err, "%s: couldn't allocate output", me); biffMove(NINSPECT, err, NRRD); airMopError(mop); return 1; } min[0] = 0; E = 0; which = 0; if (!E) { min[1] = margin; min[2] = margin; which = 1; } if (!E) E |= nrrdInset(nout, nout, nproj[1], min); if (!E) { min[1] = margin; min[2] = 2*margin + ssi; which = 2; } if (!E) E |= nrrdInset(nout, nout, nproj[2], min); if (!E) { min[1] = 2*margin + srl; min[2] = margin; which = 3; } if (!E) E |= nrrdInset(nout, nout, nproj[0], min); if (E) { sprintf(err, "%s: couldn't composite output (which = %d)", me, which); biffMove(NINSPECT, err, NRRD); airMopError(mop); return 1; } airMopOkay(mop); return 0; }