Doxygen Source Code Documentation
Main Page Alphabetical List Data Structures File List Data Fields Globals Search
SUMA_gts_insert.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 static void vertex_load (GtsPoint * p, gpointer * data)
00017 {
00018 float *NodeList = (float *)data[0];
00019 int *n = (int *)data[1];
00020 NodeList[*n*3] = (float) p->x;
00021 NodeList[*n*3+1] = (float) p->y;
00022 NodeList[*n*3+2] = (float) p->z;
00023 fprintf (stderr, "Node %d: %g %g %g\n", *n, (double)NodeList[*n*3], (double)NodeList[*n*3+1] , (double)NodeList[*n*3+2]);
00024 GTS_OBJECT (p)->reserved = GUINT_TO_POINTER ((*((guint *) data[1]))++);
00025 *n++;
00026 }
00027 static void face_load (GtsTriangle * t, gpointer * data)
00028 {
00029 int *FaceSetList = (int *)data[0];
00030 int *n = (int *)data[1];
00031 GtsVertex * v1, * v2, * v3;
00032 gts_triangle_vertices (t, &v1, &v2, &v3);
00033 FaceSetList[*n*3] = (int)GPOINTER_TO_UINT (GTS_OBJECT (v1)->reserved);
00034 FaceSetList[*n*3+1] =(int) GPOINTER_TO_UINT (GTS_OBJECT (v2)->reserved);
00035 FaceSetList[*n*3+2] = (int)GPOINTER_TO_UINT (GTS_OBJECT (v3)->reserved);
00036 fprintf (stderr, "Triangle %d: %d %d %d\n", *n, FaceSetList[*n*3], FaceSetList[*n*3+1], FaceSetList[*n*3+2]);
00037 GTS_OBJECT (t)->reserved = GUINT_TO_POINTER ((*((guint *) data[1]))++);
00038 *n++;
00039 }
00040
00041
00042 void gts_surface_suma (GtsSurface * s,
00043 float **NodeListp, int *N_Nodep, int *NodeDimp,
00044 int **FaceSetListp, int *N_FaceSetp, int *FaceSetDimp)
00045 {
00046 guint n = 0;
00047 gpointer data[2];
00048 GtsSurfaceStats stats;
00049 float *NodeList = NULL;
00050 int *FaceSetList = NULL;
00051
00052 g_return_if_fail (s != NULL);
00053
00054
00055
00056 gts_surface_stats (s, &stats);
00057
00058
00059 fprintf (stderr,
00060 "gts_surface_suma: Number of vertices %u\n",
00061 stats.edges_per_vertex.n);
00062 fprintf (stderr,
00063 "gts_surface_suma: Number of triangles %u\n",
00064 stats.n_faces);
00065 NodeList = (float *)calloc( stats.edges_per_vertex.n * 3, sizeof(float));
00066 FaceSetList = (int *)calloc(stats.n_faces * 3, sizeof(int));
00067
00068 if (!NodeList || !FaceSetList) {
00069 fprintf(stderr,"Critical Error gts_surface_suma: Could not allocate.\n");
00070 g_return_if_fail (0);
00071 }
00072
00073
00074 n = 0;
00075 data[0] = (gpointer)NodeList;
00076 data[1] = (gpointer)&n;
00077 gts_surface_foreach_vertex (s, (GtsFunc) vertex_load, data);
00078
00079
00080 n = 0;
00081 data[0] = (gpointer)FaceSetList;
00082 data[1] = (gpointer)&n;
00083 gts_surface_foreach_face (s, (GtsFunc) face_load , data);
00084
00085
00086
00087 gts_surface_foreach_vertex (s, (GtsFunc) gts_object_reset_reserved, NULL);
00088 gts_surface_foreach_face (s, (GtsFunc) gts_object_reset_reserved, NULL);
00089
00090
00091 *N_FaceSetp = (int)stats.n_faces;
00092 *N_Nodep = (int)stats.edges_per_vertex.n;
00093 *NodeListp = NodeList;
00094 *FaceSetListp = FaceSetList;
00095 *NodeDimp = 3;
00096 *FaceSetDimp = 3;
00097 return;
00098 }