/* See {Map.h} */ #include /* 3D map operations pecialized for triangulations -- maps with tetrahedral cells.*/ /* Last edited on 2007-01-31 14:14:42 by stolfi */ #define Triangulation_C_COPYRIGHT \ "Copyright © 2000 by the State University of Campinas (UNICAMP)" #include #include Topology_t MakeTopology(Place_vec_t pv) { Topology_t top; top.wedge = EnumWedges(pv, NULL); top.NFE = top.wedge.nel; /* Collect the map elements as place orbits; */ top.edge = EnumEdges(pv, NULL); top.NE = (top.edge.nel); top.wall = EnumWalls(pv, NULL); top.NF = (top.wall.nel); top.node = EnumNodes(pv, NULL); top.NV = (top.node.nel); top.cell = EnumCells(pv, NULL); top.NP = (top.node.nel); /* top.der = DegreeOfEdge(&(top.wall)); top.bdr = bdr; */ uint i, k; for (i = 0; i < top.NFE; i++) { Place_t c = top.wedge.el[i]; for (k = 0; k < 2; k++) { Node_t v = OrgV(c); uint vi = v->num; top.node.el[vi] = v; top.out.el[vi] = c; Cell_t q = PnegP(c); if (q != NULL) { uint qi = q->num; top.cell.el[qi] = q; top.region.el[qi] = Srot(c); assert(Pneg(c) == Org(top.region.el[qi])); } c = Clock(c); } } uint m = digits(top.NFE) + 1; fprintf(stderr, "\n"); fprintf(stderr, "nv = %*d\n", m, top.NV); fprintf(stderr, "ne = %*d\n", m, top.NE); fprintf(stderr, "nf = %*d\n", m, top.NF); fprintf(stderr, "np = %*d\n", m, top.NP); fprintf(stderr, "nfe = %*d\n", m, top.NFE); fprintf(stderr, "\n"); /* Euler's Number */ int euler = top.NV - top.NE + top.NF - top.NP; fprintf(stderr,"Euler's number = %d\n", euler); return top; } #define Triangulation_C_author \ "Created 2000 by L. A. P. Lozada, based on 1996 procedures by\n" \ " R. M. Rosi and J. Stolfi.\n" \ "Revisions:\n" \ " 2007-01-26 : Converted to C by J.Stolfi.\n" \ " 2007-01-31 : Moved from {Triangulation.c} to here the\n" \ " procedure {MakeTopology} and related ones."