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