Hi Don
mris_convert -n lh.white lh.white.normals.asc
should do the trick. And this is the way that the area is computed (from mrisurf.c):
static float mrisTriangleArea(MRIS *mris, int fac, int n) { int n0,n1; face_type *f; float v0[3],v1[3],d1,d2,d3;
n0 = (n == 0) ? VERTICES_PER_FACE-1 : n-1; n1 = (n == VERTICES_PER_FACE-1) ? 0 : n+1; f = &mris->faces[fac]; v0[0] = mris->vertices[f->v[n]].x - mris->vertices[f->v[n0]].x; v0[1] = mris->vertices[f->v[n]].y - mris->vertices[f->v[n0]].y; v0[2] = mris->vertices[f->v[n]].z - mris->vertices[f->v[n0]].z; v1[0] = mris->vertices[f->v[n1]].x - mris->vertices[f->v[n]].x; v1[1] = mris->vertices[f->v[n1]].y - mris->vertices[f->v[n]].y; v1[2] = mris->vertices[f->v[n1]].z - mris->vertices[f->v[n]].z; d1 = -v1[1]*v0[2] + v0[1]*v1[2]; d2 = v1[0]*v0[2] - v0[0]*v1[2]; d3 = -v1[0]*v0[1] + v0[0]*v1[1]; return sqrt(d1*d1+d2*d2+d3*d3)/2; }
cheers Bruce
On Tue, 13 Oct 2015, Krieger, Donald N. wrote:
Hi everyone,
I need to create the vector normal to the surface at each “white” vertex.
I would like to end up with 7 fields in each entry:
1 Vertex number
2-4 RAS coordinates
5-7 RAS components of the normal vector pointed from ctx à wm
mri_annotation2label gets me the first 4.
I just don’t want to reinvent the wheel getting the normal.
If there’s a way to get freesurfer to kick out the normals, that would be best.
Here are naïve questions that arise out of this problem:
1. Is there a simple way to identify which vertices are “nearest neighbors” other than measuring and sorting the distances between each and all the others i.e. which ones form a triangle? I understand to use the normalized average of the 6 triangles which include the vertex.
2. Is there a simple way to identify the order of the sides of each triangle so that their cross product is ordered correctly to produce ctx à wm?
Thanks for your help with this.
Don