Example #1
0
File: pick.c Project: ifbe/tool
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]);
}
Example #2
0
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;
}