void GenerateFacesFromTriangle( int nRefineLevel, const MultiEdge & edge0, const MultiEdge & edge1, const MultiEdge & edge2, NodeVector & vecNodes, FaceVector & vecFaces ) { int i; int j; int k; int ixEndNode; int ixInt; // MultiEdges MultiEdge edgeBot; MultiEdge edgeMid; MultiEdge edgeTop; // Initial bottom edge edgeBot.push_back(edge0[0]); // Loop over all refined faces for (j = 0; j < nRefineLevel; j++) { // Generate top level vertices if (j == nRefineLevel-1) { edgeTop = edge2; } else { GenerateEdgeVertices( j+1, edge0[j+1], edge1[j+1], vecNodes, edgeTop); } // Generate faces for (i = 0; i < 2*j+1; i++) { // Downward pointing faces if (i % 2 == 0) { int ix = i/2; Face face(3); face.SetNode(0, edgeBot[ix]); face.SetNode(1, edgeTop[ix]); face.SetNode(2, edgeTop[ix+1]); vecFaces.push_back(face); // Upward pointing faces } else { int ix = (i-1)/2; Face face(3); face.SetNode(0, edgeTop[ix+1]); face.SetNode(1, edgeBot[ix+1]); face.SetNode(2, edgeBot[ix]); vecFaces.push_back(face); } } // New bottom edge edgeBot = edgeTop; } }
void GenerateIcosahedralQuadGrid( int nRefineLevel, NodeVector & vecNodes, FaceVector & vecFaces ) { // Latitude of nodes (Northern Hemisphere) const double NodeLat = atan(0.5); // Store all icosahedral nodes LonLatNodeVector vecLonLatNodes; vecLonLatNodes.push_back(LonLatNode(0.0, -0.5*M_PI)); vecLonLatNodes.push_back(LonLatNode(0.0, -NodeLat)); vecLonLatNodes.push_back(LonLatNode(2.0*M_PI*0.2, -NodeLat)); vecLonLatNodes.push_back(LonLatNode(2.0*M_PI*0.4, -NodeLat)); vecLonLatNodes.push_back(LonLatNode(2.0*M_PI*0.6, -NodeLat)); vecLonLatNodes.push_back(LonLatNode(2.0*M_PI*0.8, -NodeLat)); vecLonLatNodes.push_back(LonLatNode(2.0*M_PI*0.1, +NodeLat)); vecLonLatNodes.push_back(LonLatNode(2.0*M_PI*0.3, +NodeLat)); vecLonLatNodes.push_back(LonLatNode(2.0*M_PI*0.5, +NodeLat)); vecLonLatNodes.push_back(LonLatNode(2.0*M_PI*0.7, +NodeLat)); vecLonLatNodes.push_back(LonLatNode(2.0*M_PI*0.9, +NodeLat)); vecLonLatNodes.push_back(LonLatNode(0.0, +0.5*M_PI)); // Convert icosahedral nodes to Cartesian geometry ConvertFromLonLatToCartesian(vecLonLatNodes, vecNodes); // Vector of edges MultiEdgeVector vecEdges; vecEdges.resize(30); // Generate vertices along edges for (int i = 0; i < 5; i++) { GenerateEdgeVertices( nRefineLevel, 0, i+1, vecNodes, vecEdges[i]); } for (int i = 0; i < 5; i++) { GenerateEdgeVertices( nRefineLevel, i+1, ((i+1)%5)+1, vecNodes, vecEdges[i+5]); } GenerateEdgeVertices(nRefineLevel, 1, 6, vecNodes, vecEdges[10]); GenerateEdgeVertices(nRefineLevel, 6, 2, vecNodes, vecEdges[11]); GenerateEdgeVertices(nRefineLevel, 2, 7, vecNodes, vecEdges[12]); GenerateEdgeVertices(nRefineLevel, 7, 3, vecNodes, vecEdges[13]); GenerateEdgeVertices(nRefineLevel, 3, 8, vecNodes, vecEdges[14]); GenerateEdgeVertices(nRefineLevel, 8, 4, vecNodes, vecEdges[15]); GenerateEdgeVertices(nRefineLevel, 4, 9, vecNodes, vecEdges[16]); GenerateEdgeVertices(nRefineLevel, 9, 5, vecNodes, vecEdges[17]); GenerateEdgeVertices(nRefineLevel, 5, 10, vecNodes, vecEdges[18]); GenerateEdgeVertices(nRefineLevel, 10, 1, vecNodes, vecEdges[19]); for (int i = 0; i < 5; i++) { GenerateEdgeVertices( nRefineLevel, i+6, ((i+1)%5)+6, vecNodes, vecEdges[i+20]); } for (int i = 0; i < 5; i++) { GenerateEdgeVertices( nRefineLevel, i+6, 11, vecNodes, vecEdges[i+25]); } // Generate south polar faces for (int i = 0; i < 5; i++) { GenerateFacesFromTriangle( nRefineLevel, vecEdges[i], vecEdges[(i+1)%5], vecEdges[i+5], vecNodes, vecFaces ); } // Generate south equatorial faces for (int i = 0; i < 5; i++) { GenerateFacesFromTriangle( nRefineLevel, vecEdges[2*i+10], vecEdges[i+5], vecEdges[2*i+11], vecNodes, vecFaces ); } // Generate north equatorial faces for (int i = 0; i < 5; i++) { GenerateFacesFromTriangle( nRefineLevel, vecEdges[i+20], vecEdges[2*i+11], vecEdges[2*((i+1)%5)+10].Flip(), vecNodes, vecFaces ); } // Generate north polar faces for (int i = 0; i < 5; i++) { GenerateFacesFromTriangle( nRefineLevel, vecEdges[i+25], vecEdges[i+20], vecEdges[((i+1)%5)+25].Flip(), vecNodes, vecFaces ); } }
void RefineEverything( NodeVector & vecNodes, FaceVector & vecFaces, int nResolution ) { // Generate segment map SegmentMap mapSegment; ConstructSegmentMap(vecFaces, mapSegment, -1); FaceVector vecFacesOld = vecFaces; // Loop over all faces vecFaces.clear(); // Construct map from segments to edges std::map<Segment, Edge> mapEdge; SegmentMapIterator iter = mapSegment.begin(); for (; iter != mapSegment.end(); iter++) { Edge edge; GenerateEdgeVertices( nResolution, iter->first[0], iter->first[1], vecNodes, edge); mapEdge.insert(std::pair<Segment, Edge>(iter->first, edge)); } // Loop over all faces and refine for (int n = 0 ; n < vecFacesOld.size(); n++) { const Segment & seg0 = vecFacesOld[n].iterSegment[0]->first; const Segment & seg1 = vecFacesOld[n].iterSegment[1]->first; const Segment & seg2 = vecFacesOld[n].iterSegment[2]->first; const Segment & seg3 = vecFacesOld[n].iterSegment[3]->first; Edge edge0 = mapEdge.find(seg0)->second; Edge edge1 = mapEdge.find(seg1)->second; Edge edge3 = mapEdge.find(seg2)->second; Edge edge2 = mapEdge.find(seg3)->second; // Align bottom and left edge if (edge0[0] == edge1[0]) { } else if (edge0[0] == edge1[edge1.size()-1]) { edge1 = edge1.Flip(); } else if (edge0[edge0.size()-1] == edge1[0]) { edge0 = edge0.Flip(); } else if (edge0[edge0.size()-1] == edge1[edge1.size()-1]) { edge0 = edge0.Flip(); edge1 = edge1.Flip(); } else { _EXCEPTIONT("Logic error"); } // Align bottom and right edge if (edge0[edge0.size()-1] == edge2[0]) { } else if (edge0[edge0.size()-1] == edge2[edge2.size()-1]) { edge2 = edge2.Flip(); } else { _EXCEPTIONT("Logic error"); } // Align top and left edge if (edge1[edge1.size()-1] == edge3[0]) { } else if (edge1[edge1.size()-1] == edge3[edge3.size()-1]) { edge3 = edge3.Flip(); } else { _EXCEPTIONT("Logic error"); } Edge edgeTop; Edge edgeBot = edge0; for (int j = 0; j < nResolution; j++) { // Generate top level edge if (j != nResolution-1) { int ix0 = edge1[j+1]; int ix1 = edge2[j+1]; GenerateEdgeVertices(nResolution, ix0, ix1, vecNodes, edgeTop); } else { edgeTop = edge3; } // Generate face for (int i = 0; i < nResolution; i++) { Face face( edgeBot[i+1], edgeBot[i], edgeTop[i], edgeTop[i+1], vecFacesOld[n].nRefineLevel); face.nColor = vecFacesOld[n].nColor; face.nTag = vecFacesOld[n].nTag; vecFaces.push_back(face); } // Increment row edgeBot = edgeTop; } } }