void physics::detail::ConstructionTree::insertMesh(const aiMesh& mesh) { for (unsigned int i = 0; i < mesh.mNumFaces; ++i) { insertFace(mesh.mFaces[i], mesh.mVertices); } }
/* *构造一个体,面,外环,顶点 *@param[in] point 新顶点的位置 *@param[out] solid 新生成的体 *@return 新生成的顶点 */ Vertex* EulerOperator::mvfs(Point point,Solid*& solid) { Solid* solid2 = new Solid; Face* face = new Face; Loop* loop = new Loop; Vertex* vertex = new Vertex; vertex->point = point; loop->he = NULL; insertFace(solid2,face); insertLoop(face,loop); insertSolid(solid,solid2); return vertex; }
/* *构造顶点ve1到ve2的一条边,同时构造一个新面 *注意当前loop的走向变为ve1->ve2,新面loop的走向为ve2->ve1 *@param[in] ve1 顶点1 *@param[in] ve2 顶点2 *@param[in] loop 当前环 *@return 新生成的面 */ Face* EulerOperator::mef(Vertex* ve1,Vertex* ve2,Loop* loop) { Edge* edge = makeEdge(ve1,ve2); Half_Edge* he1 = edge->he1; Half_Edge* he2 = edge->he2; //创建新环 Loop* loop2 = new Loop; Half_Edge *tmpHe1,*tmpHe2; Half_Edge* he = loop->he; while(he->ve1!=ve1) he=he->next; tmpHe1 = he; while(he->ve1!=ve2) he=he->next; tmpHe2 = he; tmpHe1->prev->next = he1; he1->prev = tmpHe1->prev; he2->next = tmpHe1; tmpHe1->prev = he2; tmpHe2->prev->next = he2; he2->prev = tmpHe2->prev; he1->next = tmpHe2; tmpHe2->prev = he1; loop->he = he1; he1->loop = loop; loop2->he = he2; he2->loop = loop2; //创建新面 Face* face = new Face; Solid* solid = loop->face->solid; insertEdge(solid,edge); insertFace(solid,face); insertLoop(face,loop2); return face; }
void build_Triangulation( struct Triangulation_T *triang) { int i=0; // Loop counter. int len=0; // Loop length. int finished=0; // Loop control flag. #ifdef DEBUG_DELAUNAY int expected_Edges=0; // Number of edges in triangulation. int expected_Triangles=0; // Number of triangles in triangulation. #endif int edgeId=0, faceId=0; // Edge and face Id counters. int savedEdge=0; int nextConvexEdge=0; // Next edge to add to convex hull. int originVertex1=0, originVertex2=0; int originVertexIndex1=0, originVertexIndex2=0; int convex_Peak[2]; // Last two points in convex hull. struct Dcel_Vertex_T *newVertex=NULL; // New vertex to add to DCEL. struct Convex_T convex_Edge; // struct Convex_T peak_Edge; // Last edge in convex hull. // Order in angular order from bottom most point. sort( triang->dcel); // Insert invalid face. Updated when convex hull added. insertFace( triang->dcel, -1); // First vertex belongs to convex hull. convex_Edge.vertex_Index = 0; convex_Edge.edge_ID = 1; push( &triang->stack, convex_Edge); // Insert first edge. triang->dcel->vertex[0].origin_Edge = 1; insertEdge( triang->dcel, 1, -1, 3, 2, 1); // Second vertex belongs to convex hull. convex_Edge.vertex_Index = 1; convex_Edge.edge_ID = 2; push( &triang->stack, convex_Edge); // Insert second edge. triang->dcel->vertex[1].origin_Edge = 2; insertEdge( triang->dcel, 2, -1, 1, 3, 1); // Third element is inserted in convex hull at starting. convex_Edge.vertex_Index = 2; convex_Edge.edge_ID = 3; push( &triang->stack, convex_Edge); // Insert third edge. triang->dcel->vertex[2].origin_Edge = 3; insertEdge( triang->dcel, 3, -1, 2, 1, 1); // Insert first face. insertFace( triang->dcel, 1); // Initianlize variables before loop. faceId = 2; edgeId = 4; // Parse rest of points. for (i=3; i<triang->dcel->nVertex ;i++) { // Get current point. newVertex = get_Vertex( triang->dcel, i); // Initialize indexes and values. originVertexIndex1 = 0; originVertex1 = 1; originVertexIndex2 = i-1; originVertex2 = i; finished = 0; savedEdge = -1; nextConvexEdge = edgeId+2; peak_Edge = peak( &triang->stack); while (!finished) { // Get last two vertex from convex hull. convex_Edge = peak( &triang->stack); convex_Peak[0] = convex_Edge.vertex_Index; convex_Edge = peak_Prev( &triang->stack); convex_Peak[1] = convex_Edge.vertex_Index; // Insert new edge and update its twin. triang->dcel->vertex[originVertexIndex1].origin_Edge = edgeId; triang->dcel->edges[peak_Edge.edge_ID-1].twin_Edge = edgeId; insertEdge( triang->dcel, originVertex1, peak_Edge.edge_ID, edgeId+2, edgeId+1, faceId); #ifdef DEBUG_DELAUNAY printf("A %d LE ASIGNO %d y A %d LE ASIGNO %d\n", edgeId, peak_Edge.edge_ID, peak_Edge.edge_ID, edgeId); #endif // Insert new edge. triang->dcel->vertex[originVertexIndex2].origin_Edge = edgeId+1; insertEdge( triang->dcel, originVertex2, -1, edgeId, edgeId+2, faceId); #ifdef DEBUG_DELAUNAY printf("A %d LE PONGO -1\n", edgeId+1); #endif // Insert new edge. triang->dcel->vertex[i].origin_Edge = edgeId+2; insertEdge( triang->dcel, i+1, savedEdge, edgeId+1, edgeId, faceId); if (savedEdge != -1) { triang->dcel->edges[savedEdge-1].twin_Edge = edgeId+2; #ifdef DEBUG_DELAUNAY printf("A %d PONGLE ASIGNO %d y a %d LEASIGNO %d\n", edgeId+2, savedEdge, savedEdge, edgeId+2); } else { printf("A %d LE ASIGNO -1\n", edgeId+2); #endif } savedEdge = edgeId+1; // Check type of turn with new point. if ((check_Turn( &triang->dcel->vertex[convex_Peak[1]].vertex, &triang->dcel->vertex[convex_Peak[0]].vertex, &newVertex->vertex) == LEFT_TURN) || (check_Turn( &triang->dcel->vertex[convex_Peak[1]].vertex, &triang->dcel->vertex[convex_Peak[0]].vertex, &newVertex->vertex) == COLINEAR)) { // Update peak of convex hull. update_Peak( &triang->stack, edgeId+1); #ifdef DEBUG_DELAUNAY printf("Actualizo PEAK con Edge %d\n", edgeId+1); #endif // Add edge to convex hull. convex_Edge.vertex_Index = i; convex_Edge.edge_ID = nextConvexEdge; push( &triang->stack, convex_Edge); finished = 1; #ifdef DEBUG_DELAUNAY printf("METO EN PILA PUNTO %d Y EDGE %d\n", convex_Edge.vertex_Index, convex_Edge.edge_ID); #endif } else { // Update source points. convex_Edge = peak( &triang->stack); originVertexIndex1 = convex_Edge.vertex_Index; originVertex1 = convex_Edge.vertex_Index+1; // Pop convex hull. #ifdef DEBUG_DELAUNAY printf("SACO DE LA PILA\n"); #endif pop( &triang->stack); peak_Edge = peak( &triang->stack); originVertexIndex2 = peak_Edge.vertex_Index; originVertex2 = peak_Edge.vertex_Index+1; } // Insert face. insertFace( triang->dcel, edgeId); // Update counters. faceId++; edgeId = edgeId + 3; } } // Save index of first edge from convex hull. convex_Edge = peak( &triang->stack); savedEdge = convex_Edge.edge_ID; pop( &triang->stack); peak_Edge = peak( &triang->stack); // Insert first edge from convex hull. triang->dcel->edges[peak_Edge.edge_ID-1].twin_Edge = edgeId; insertEdge( triang->dcel, convex_Edge.vertex_Index+1, peak_Edge.edge_ID, edgeId+get_Stack_nElements(&triang->stack), edgeId+1, 0); // Next edge. edgeId = edgeId+1; // Update convex hull. len = get_Stack_nElements( &triang->stack)-1; for (i=0; i<len ;i++) { convex_Edge = peak( &triang->stack); pop( &triang->stack); peak_Edge = peak( &triang->stack); // Insert new edge fom convex hull triang->dcel->edges[peak_Edge.edge_ID-1].twin_Edge = edgeId; insertEdge( triang->dcel, convex_Edge.vertex_Index+1, peak_Edge.edge_ID, edgeId-1, edgeId+1, 0); // Next edge. edgeId++; } // Insert first edge from convx hull. triang->dcel->edges[savedEdge-1].twin_Edge = edgeId; insertEdge( triang->dcel, 1, savedEdge, edgeId-1, edgeId-len-1, 0); // Update convex hull face departing edge. triang->dcel->faces[0].edge = edgeId; #ifdef DEBUG_DELAUNAY // Check error in number of triangles. expected_Edges = 3*triang->dcel->nVertex - triang->stack.nElements - 3; expected_Triangles = 2*triang->dcel->nVertex - triang->stack.nElements - 2; printf("Faces %d. Expected %d\nEdges %d. Expected %d\n", triang->dcel->nFaces, expected_Triangles, triang->dcel->nEdges, expected_Edges); #endif }