int MRISareaErrors(MRI_SURFACE *mris) { int fno, max_f = -1 ; FACE *face ; float ferror, max_ferror, total_error, total_sq_error, error, mean_error, std_error, pct_error, n ; MRISupdateEllipsoidSurface(mris) ; total_error = total_sq_error = max_ferror = 0.0f ; for (fno = 0 ; fno < mris->nfaces ; fno++) { face = &mris->faces[fno] ; ferror = 0.0f ; error = face->area - face->orig_area ; pct_error = error / face->orig_area * 100.0f ; printf("%d %2.3f %2.3f %2.3f %2.1f\n", fno, face->orig_area, face->area, error, pct_error) ; total_sq_error += (error * error) ; ferror += fabs(error) ; total_error += error ; if (ferror >= max_ferror) { max_ferror = ferror ; max_f = fno ; } } n = (float)(2*mris->nfaces) ; mean_error = total_error / n ; std_error = sqrt(total_sq_error / (float)n - mean_error*mean_error) ; fprintf(stderr, "max error occurs at %d, error = %2.3f\n",max_f, max_ferror); fprintf(stderr, "mean error = %2.3f, std = %2.3f\n", mean_error, std_error); return(NO_ERROR) ; }
int MRISangleErrors(MRI_SURFACE *mris) { int fno, max_f = -1, ano ; FACE *face ; FILE *fp ; float ferror, max_ferror, total_error, total_sq_error, error, mean_error, std_error, pct_error, n ; fp = fopen("angle.err", "w") ; MRISupdateEllipsoidSurface(mris) ; total_error = total_sq_error = max_ferror = 0.0f ; for (fno = 0 ; fno < mris->nfaces ; fno++) { face = &mris->faces[fno] ; ferror = 0.0f ; for (ano = 0 ; ano < ANGLES_PER_TRIANGLE ; ano++) { error = deltaAngle(face->angle[ano], face->orig_angle[ano]); pct_error = error / face->orig_angle[ano] * 100.0f ; fprintf(fp, "%d %2.3f %2.3f %2.3f %2.1f\n", fno, (float)DEGREES(face->orig_angle[ano]), (float)DEGREES(face->angle[ano]), (float)DEGREES(error), (float)pct_error) ; total_sq_error += (error * error) ; ferror += fabs(error) ; total_error += error ; } if (ferror >= max_ferror) { max_ferror = ferror ; max_f = fno ; } } n = (float)(2*mris->nfaces) ; mean_error = total_error / n ; std_error = sqrt(total_sq_error / (float)n - mean_error*mean_error) ; fprintf(stderr, "max angle error occurs at %d, error = %2.3f\n", max_f, (float)DEGREES(max_ferror)); fprintf(stderr, "mean angle error = %2.3f, std = %2.3f\n", (float)DEGREES(mean_error), (float)DEGREES(std_error)); fclose(fp) ; return(NO_ERROR) ; }
MRI_SURFACE * MRISprojectOntoTranslatedSphere(MRI_SURFACE *mris_src, MRI_SURFACE *mris_dst, double r, double x0, double y0, double z0) { VERTEX *v; int vno ; double x, y, z, d, dx, dy, dz, dist, total_dist, x2, y2, z2 ; if (FZERO(r)) r = DEFAULT_RADIUS ; if (!mris_dst) mris_dst = MRISclone(mris_src) ; if ((mris_dst->status != MRIS_SPHERE) && (mris_dst->status != MRIS_PARAMETERIZED_SPHERE)) MRIScenter(mris_dst, mris_dst) ; mris_dst->radius = r ; for (total_dist = vno = 0 ; vno < mris_dst->nvertices ; vno++) { v = &mris_dst->vertices[vno]; if (v->ripflag) /* shouldn't happen */ continue ; if (vno == 118009) { DiagBreak() ; } x = ((double)v->x); y = ((double)v->y); z = ((double)v->z); x2 = x*x ; y2 = y*y ; z2 = z*z ; dist = sqrt(x2+y2+z2) ; if (FZERO(dist)) d = 0 ; else d = 1 - r / dist ; dx = d*x ; dy = d*y; dz = d*z; v->x = x-dx ; v->y = y-dy; v->z = z-dz; if (!finite(v->x) || !finite(v->y) || !finite(v->z)) DiagBreak() ; /* if ((Gdiag & DIAG_SHOW) && DIAG_VERBOSE_ON)*/ { dist = sqrt((double)(dx*dx+dy*dy+dz*dz)); total_dist += dist; } #if 1 x = (double)v->x; y = (double)v->y; z = (double)v->z; x2 = x*x ; y2 = y*y ; z2 = z*z ; dist = sqrt(x2+y2+z2) ; #endif } for (total_dist = vno = 0 ; vno < mris_dst->nvertices ; vno++) { v = &mris_dst->vertices[vno]; if (v->ripflag) /* shouldn't happen */ continue ; v->x += x0 ; v->y += y0 ; v->z += z0 ; } if ((Gdiag & DIAG_SHOW) && DIAG_VERBOSE_ON) fprintf(stdout, "sphere_project: total dist = %f\n",total_dist); MRISupdateEllipsoidSurface(mris_dst) ; mris_dst->status = mris_src->status == MRIS_PARAMETERIZED_SPHERE ? MRIS_PARAMETERIZED_SPHERE : MRIS_SPHERE ; return(mris_dst) ; }