Exemplo n.º 1
0
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;
    }
}
Exemplo n.º 2
0
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
        );
    }
}
Exemplo n.º 3
0
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;
		}
	}
}