void _nrrdMeasureLineFit(double *intc, double *slope, const void *line, int lineType, size_t len, double axmin, double axmax) { double x, y, xi=0, yi=0, xiyi=0, xisq=0, det, (*lup)(const void*, size_t); size_t ii; lup = nrrdDLookup[lineType]; if (!( AIR_EXISTS(axmin) && AIR_EXISTS(axmax) )) { axmin = 0; axmax = len-1; } if (1 == len) { *slope = 0; *intc = lup(line, 0); } else { for (ii=0; ii<len; ii++) { x = NRRD_NODE_POS(axmin, axmax, len, ii); y = lup(line, ii); xi += x; yi += y; xiyi += x*y; xisq += x*x; } det = len*xisq - xi*xi; *slope = (len*xiyi - xi*yi)/det; *intc = (-xi*xiyi + xisq*yi)/det; } }
/* ** Thu Dec 13 02:25:12 EST 2007: ** this had no use outside gage, added _ prefix */ void _gageShapeUnitItoW(gageShape *shape, double world[3], double index[3]) { int i; if (nrrdCenterNode == shape->center) { for (i=0; i<=2; i++) { world[i] = NRRD_NODE_POS(-shape->volHalfLen[i], shape->volHalfLen[i], shape->size[i], index[i]); } } else { for (i=0; i<=2; i++) { world[i] = NRRD_CELL_POS(-shape->volHalfLen[i], shape->volHalfLen[i], shape->size[i], index[i]); } } }
static void shapeUnitItoW(const gageShape *shape, double world[3], const double indx[3], const double volHalfLen[3]) { unsigned int i; if (nrrdCenterNode == shape->center) { for (i=0; i<=2; i++) { world[i] = NRRD_NODE_POS(-volHalfLen[i], volHalfLen[i], shape->size[i], indx[i]); } } else { for (i=0; i<=2; i++) { world[i] = NRRD_CELL_POS(-volHalfLen[i], volHalfLen[i], shape->size[i], indx[i]); } } }
void _nrrdMeasureLineError(void *ans, int ansType, const void *line, int lineType, size_t len, double axmin, double axmax) { double x, y, slope, intc, tmp, err=0, (*lup)(const void*, size_t); size_t ii; _nrrdMeasureLineFit(&intc, &slope, line, lineType, len, axmin, axmax); if (!( AIR_EXISTS(axmin) && AIR_EXISTS(axmax) )) { axmin = 0; axmax = len-1; } lup = nrrdDLookup[lineType]; for (ii=0; ii<len; ii++) { x = NRRD_NODE_POS(axmin, axmax, len, ii); y = lup(line, ii); tmp = slope*x + intc - y; err += tmp*tmp; } nrrdDStore[ansType](ans, err); }