1 #include "SUMA_suma.h"
2 
3 #include "SUMA_Homer.h"
4 #include "SUMA_head_01Define.c"
5 #include "SUMA_HomerDefine.c"
6 
is_END_vert(Point3 Vert)7 int is_END_vert (Point3 Vert) {
8    if ( SUMA_ABS(Vert.x-11111.11111f)<0.01 &&
9         SUMA_ABS(Vert.y-22222.22222f)<0.01 &&
10         SUMA_ABS(Vert.z-33333.33333f)<0.01) return(1);
11    return(0);
12 }
13 /*!
14    \brief Change the Vert structure to a SUMA NodeList vector
15    \param Vert (Point3 *)
16    \param N (int *) to contain the number of nodes in Vert
17    \SUMA_RETURN NodeList (float *) 3Nx1 vector of XYZ coordinates.
18 */
SUMA_HomerVertex(Point3 * Vert,int * N)19 float * SUMA_HomerVertex(Point3 *Vert, int *N)
20 {
21    static char FuncName[]={"SUMA_HomerVertex"};
22    float *NodeList=NULL;
23    int i, k;
24    SUMA_Boolean LocalHead = NOPE;
25 
26    SUMA_ENTRY;
27 
28    *N = 0;
29    while (!is_END_vert(Vert[*N])) ++*N;
30 
31    if (LocalHead) fprintf(SUMA_STDERR,"%d  elements in Vert.\n",
32       *N);
33 
34    NodeList = (float *)SUMA_malloc(*N*3*sizeof(float));
35    k = 0;
36    for (i=0; i<*N; ++i) {
37       NodeList[k] = 50.0*(float)Vert[i].x; ++k;
38       NodeList[k] = 50.0*(float)Vert[i].y; ++k;
39       NodeList[k] = 50.0*(float)Vert[i].z; ++k;
40    }
41 
42    SUMA_RETURN(NodeList);
43 }
44 /*!
45    \brief Change the face vector to a SUMA FaceSetList vector
46    Polygons are automatically triangulated
47 
48    \param face (long *) vector of ace indices. Faces are separated
49                        by -1 entries
50    \param N (int *) to contain the number of faces is FaceSetList
51    \SUMA_RETURN FaceSetList (int *) 3Nx1 vector of triangles making up mesh.
52 */
53 
SUMA_HomerFace(long * face,int * N)54 int * SUMA_HomerFace(long *face, int *N)
55 {
56    static char FuncName[]={"SUMA_HomerFace"};
57    int i, k, N_alloc, iface, iface0, iFS3;
58    int *FaceSetList=NULL;
59    SUMA_Boolean LocalHead = NOPE;
60 
61    SUMA_ENTRY;
62 
63    *N = 0;
64    while (face[*N] > -2) ++*N;
65 
66    if (LocalHead) fprintf(SUMA_STDERR,"%d elements in Vert.\n",
67       *N);
68 
69    /* Can't guess ahead of time, make sure you check down the line */
70    N_alloc = *N*3;
71    FaceSetList = (int *)SUMA_malloc(N_alloc*sizeof(int));
72    if (!FaceSetList) {
73       fprintf (SUMA_STDERR,"Error %s: Failed to reallocate.\n", FuncName);
74       SUMA_RETURN(NULL);
75    }
76    iFS3 =0; /* index of triangulated facet */
77    iface = 0;
78    iface0 = 0;
79    while (iface < *N) {
80       iface0 = iface ; /* 1s node in polygon */
81       if (iface0 < 0) {
82          fprintf(SUMA_STDERR, "Error %s: Unexpected end flag", FuncName);
83          SUMA_free(FaceSetList);
84          SUMA_RETURN(NULL);
85       }
86       if (LocalHead) fprintf(SUMA_STDERR,
87             "%s: iface0 = %d, face[%d] = %d: ",
88             FuncName, iface0, iface0, (int)face[iface0]) ;
89       do {
90          if (iFS3+3 > N_alloc) {
91             N_alloc = 2 * N_alloc;
92             FaceSetList = (int *)realloc((void *)FaceSetList, N_alloc * sizeof(int));
93             if (!FaceSetList) {
94                fprintf (SUMA_STDERR,"Error %s: Failed to reallocate.\n", FuncName);
95                SUMA_RETURN(NULL);
96             }
97          }
98          FaceSetList[iFS3] = face[iface0]; /* first node in polygon is first node of triangles forming polygon */
99          if (FaceSetList[iFS3] < 0) {
100             fprintf (SUMA_STDERR,"Negative index loaded (loc 0)\n");
101          }
102          if (LocalHead) fprintf(SUMA_STDERR,
103             "t(%d, ", (int)face[iface0]);
104          if (iface == iface0) ++iface;
105          if (LocalHead) fprintf(SUMA_STDERR,
106             "%d, ", (int)face[iface]);
107          ++iFS3;
108          FaceSetList[iFS3] = face[iface]; /* node 2 */
109          if (FaceSetList[iFS3] < 0) {
110             fprintf (SUMA_STDERR,"Negative index loaded (loc 1)\n");
111          }
112          if (LocalHead) fprintf(SUMA_STDERR,
113             "%d) ", (int)face[iface+1]);
114          ++iFS3;
115          FaceSetList[iFS3] = face[iface+1]; /* node 3 */
116          if (FaceSetList[iFS3] < 0) {
117             fprintf (SUMA_STDERR,"Negative index loaded (loc 2)\n");
118          }
119          ++iFS3; ++iface;
120       } while (face[iface+1] >= 0);
121       if (LocalHead) fprintf(SUMA_STDERR," iFS3/N_alloc = %d/%d\n", iFS3, N_alloc);
122       ++iface; /* skip -1 */
123       ++iface; /* goto next */
124    }
125 
126    *N = iFS3 / 3;
127 
128    /* reallocate */
129 
130       if (LocalHead) {
131          int tmpmin=-100, n3, itmp;
132          n3 = 3 * *N;
133          fprintf (SUMA_STDERR,"%s: N_FaceSet %d\n", FuncName, *N);
134          SUMA_MIN_VEC (FaceSetList, n3, tmpmin);
135          fprintf (SUMA_STDERR,"Minimum index is %d\n", tmpmin);
136          if (tmpmin < 0) {
137             fprintf (SUMA_STDERR,"Error %s: Bad ass pre-alloc negative number\n", FuncName);
138             for (itmp=0; itmp<n3; ++itmp) {
139                fprintf (SUMA_STDERR, "%d: %d\n", itmp, FaceSetList[itmp]);
140                if (FaceSetList[itmp] < 0) {
141                   fprintf (SUMA_STDERR,"%s: Min of %d, at %d\n", FuncName, FaceSetList[itmp], itmp);
142                }
143             }
144          }
145       }
146 
147    FaceSetList = (int *)SUMA_realloc((void *)FaceSetList, iFS3 * sizeof(int));
148       if (LocalHead) {
149          int tmpmin=-100, n3, itmp;
150          n3 = 3 * *N;
151          fprintf (SUMA_STDERR,"%s: N_FaceSet %d\n", FuncName, *N);
152          SUMA_MIN_VEC (FaceSetList, n3, tmpmin);
153          fprintf (SUMA_STDERR,"Minimum index is %d\n", tmpmin);
154          if (tmpmin < 0) {
155             fprintf (SUMA_STDERR,"Error %s: Bad post realloc ass negative number\n", FuncName);
156             for (itmp=0; itmp<n3; ++itmp) {
157                fprintf (SUMA_STDERR, "%d: %d\n", itmp, FaceSetList[itmp]);
158                if (FaceSetList[itmp] < 0) {
159                   fprintf (SUMA_STDERR,"%s: Min of %d, at %d\n", FuncName, FaceSetList[itmp], itmp);
160                }
161             }
162          }
163       }
164 
165 
166    if (LocalHead)
167       fprintf(SUMA_STDERR,"%s: Returning (iFS3 = %d, N = %d...)\n",
168                   FuncName, iFS3, *N);
169 
170    SUMA_RETURN(FaceSetList);
171 }
172 
SUMA_HJS_Surface(int ipart)173 SUMA_SurfaceObject *SUMA_HJS_Surface(int ipart)
174 {
175    static char FuncName[]={"SUMA_HJS_Surface"};
176    SUMA_SurfaceObject *SO=NULL;
177    int *FaceSetList=NULL, N_Node, N_FaceSet;
178    float *NodeList=NULL;
179    SUMA_NEW_SO_OPT *nsoopt = NULL;
180    SUMA_Boolean LocalHead = NOPE;
181 
182    SUMA_ENTRY;
183 
184    switch (ipart) {
185       case 0:
186          NodeList = SUMA_HomerVertex(X1_X5_Sphere_vertex, &N_Node);
187          FaceSetList = SUMA_HomerFace(X1_X5_Sphere_face, &N_FaceSet);
188          break;
189       case 1:
190          NodeList = SUMA_HomerVertex(X1_X5_X12_lleg_vertex, &N_Node);
191          FaceSetList = SUMA_HomerFace(X1_X5_X12_lleg_face, &N_FaceSet);
192          break;
193       case 2:
194          NodeList = SUMA_HomerVertex(X1_X5_X12_Rleg_vertex, &N_Node);
195          FaceSetList = SUMA_HomerFace(X1_X5_X12_Rleg_face, &N_FaceSet);
196          break;
197       case 3:
198          NodeList = SUMA_HomerVertex(X1_X5_X12_Sphere_vertex, &N_Node);
199          FaceSetList = SUMA_HomerFace(X1_X5_X12_Sphere_face, &N_FaceSet);
200          break;
201       case 4:
202          NodeList = SUMA_HomerVertex(X1_X5_X12_X31_Sphere_vertex, &N_Node);
203          FaceSetList = SUMA_HomerFace(X1_X5_X12_X31_Sphere_face, &N_FaceSet);
204          break;
205       case 5:
206          NodeList = SUMA_HomerVertex(X1_X5_X44_X45_vertex, &N_Node);
207          FaceSetList = SUMA_HomerFace(X1_X5_X44_X45_face, &N_FaceSet);
208          break;
209       case 6:
210          NodeList = SUMA_HomerVertex(X1_X5_X44_Torus_vertex,  &N_Node);
211          FaceSetList = SUMA_HomerFace(X1_X5_X44_Torus_face,  &N_FaceSet);
212          break;
213       case 7:
214          NodeList = SUMA_HomerVertex(X1_X5_X44_X57_Sphere_vertex, &N_Node);
215          FaceSetList = SUMA_HomerFace(X1_X5_X44_X57_Sphere_face, &N_FaceSet);
216          break;
217       case 8:
218          NodeList = SUMA_HomerVertex(X1_X5_X44_X88_Sphere_vertex, &N_Node);
219          FaceSetList = SUMA_HomerFace(X1_X5_X44_X88_Sphere_face, &N_FaceSet);
220          break;
221       case 9:
222          NodeList = SUMA_HomerVertex(X1_X5_X44_X88_X95_Sphere_vertex, &N_Node);
223          FaceSetList = SUMA_HomerFace(X1_X5_X44_X88_X95_Sphere_face, &N_FaceSet);
224          break;
225       case 10:
226          NodeList = SUMA_HomerVertex(X1_X5_X120_Sphere_Sphere_vertex, &N_Node);
227          FaceSetList = SUMA_HomerFace(X1_X5_X120_Sphere_Sphere_face, &N_FaceSet);
228          break;
229       case 11:
230          NodeList = SUMA_HomerVertex(X1_X5_X120_X127_Sphere_vertex, &N_Node);
231          FaceSetList = SUMA_HomerFace(X1_X5_X120_X127_Sphere_face, &N_FaceSet);
232          break;
233       case 12:
234          NodeList = SUMA_HomerVertex(X1_X5_X120_X127_X134_vertex, &N_Node);
235          FaceSetList = SUMA_HomerFace(X1_X5_X120_X127_X134_face, &N_FaceSet);
236          break;
237       case 13:
238          NodeList = SUMA_HomerVertex(X1_X5_X120_X127_Torus_vertex, &N_Node);
239          FaceSetList = SUMA_HomerFace(X1_X5_X120_X127_Torus_face, &N_FaceSet);
240          break;
241       case 14:
242          NodeList = SUMA_HomerVertex(X1_X5_X120_X127_X146_vertex, &N_Node);
243          FaceSetList = SUMA_HomerFace(X1_X5_X120_X127_X146_face, &N_FaceSet);
244          break;
245       case 15:
246          NodeList = SUMA_HomerVertex(X1_X5_X120_X127_X152_vertex, &N_Node);
247          FaceSetList = SUMA_HomerFace(X1_X5_X120_X127_X152_face, &N_FaceSet);
248          break;
249       case 16:
250          NodeList = SUMA_HomerVertex(X1_X5_X120_X127_X158_vertex, &N_Node);
251          FaceSetList = SUMA_HomerFace(X1_X5_X120_X127_X158_face, &N_FaceSet);
252          break;
253       case 17:
254          NodeList = SUMA_HomerVertex(X1_X5_X120_X127_X164_Sphere_vertex,
255                                        &N_Node);
256          FaceSetList = SUMA_HomerFace(X1_X5_X120_X127_X164_Sphere_face,
257                                        &N_FaceSet);
258          break;
259       case 18:
260          NodeList = SUMA_HomerVertex(X1_X5_X120_X127_X177_Torus_vertex, &N_Node);
261          FaceSetList = SUMA_HomerFace(X1_X5_X120_X127_X177_Torus_face,
262                                        &N_FaceSet);
263          break;
264       default:
265          SUMA_SL_Err("No more parts");
266          SUMA_RETURN(NULL);
267          break;
268    }
269 
270    /* SUMA_disp_vect(NodeList, 3*N_Node); */
271    /* SUMA_disp_dvect(FaceSetList, 3*N_FaceSet);  */
272    if (LocalHead) {
273       int tmpmin=-100, n3, itmp;
274       n3 = 3 * N_FaceSet;
275       fprintf (SUMA_STDERR,"%s: part %d, N_Node %d, N_FaceSet %d\n",
276                                  FuncName, ipart, N_Node, N_FaceSet);
277       SUMA_MIN_VEC (FaceSetList, n3, tmpmin);
278       fprintf (SUMA_STDERR,"Minimum index is %d\n", tmpmin);
279       if (tmpmin < 0) {
280          fprintf (SUMA_STDERR,
281                "Error %s: Bad in return ass negative number\n", FuncName);
282          for (itmp=0; itmp<n3; ++itmp) {
283             fprintf (SUMA_STDERR, "%d: %d\n", itmp, FaceSetList[itmp]);
284             if (FaceSetList[itmp] < 0) {
285                fprintf (SUMA_STDERR,
286                   "%s: Min of %d, at %d\n", FuncName, FaceSetList[itmp], itmp);
287             }
288          }
289       }
290    }
291 
292    /* create a surface */
293    nsoopt = SUMA_NewNewSOOpt();
294    SO = SUMA_NewSO(&NodeList, N_Node, &FaceSetList, N_FaceSet, nsoopt);
295    SO->normdir = -1;
296 
297    nsoopt=SUMA_FreeNewSOOpt(nsoopt);
298 
299    SUMA_RETURN(SO);
300 }
301 
302 
SUMA_head_01_surface(void)303 SUMA_SurfaceObject *SUMA_head_01_surface(void)
304 {
305    static char FuncName[]={"SUMA_head_01_surface"};
306    int *FaceSetList=NULL;
307    float *NodeList=NULL;
308    SUMA_SurfaceObject *SO=NULL;
309    SUMA_NEW_SO_OPT *nsoopt = NULL;
310 
311    SUMA_ENTRY;
312 
313    /* create a surface */
314    nsoopt = SUMA_NewNewSOOpt();
315    NodeList = (float *)SUMA_malloc(d1_head_01_1D_coord*d2_head_01_1D_coord*sizeof(float));
316    memcpy(NodeList, head_01_1D_coord, d1_head_01_1D_coord*d2_head_01_1D_coord*sizeof(float));
317    FaceSetList = (int *)SUMA_malloc(d1_head_01_1D_topo*d2_head_01_1D_topo*sizeof(int));
318    memcpy(FaceSetList, head_01_1D_topo, d1_head_01_1D_topo*d2_head_01_1D_topo*sizeof(int));
319 
320    SO = SUMA_NewSO(&NodeList, d1_head_01_1D_coord, &FaceSetList, d1_head_01_1D_topo, nsoopt);
321    SO->normdir = 1;
322 
323    nsoopt=SUMA_FreeNewSOOpt(nsoopt);
324 
325    SUMA_RETURN(SO);
326 }
327 
328