Exemplo n.º 1
0
void TetMeshUtility::split(TetMesh *tetmesh, TetHalfFace *halfface) {
	
	Point newPos;
	for (int i = 0; i < 3; ++i) {
		newPos += halfface->vertex(i)->point();
	}
	newPos /= 3.0;

	TetVertex *nver = new TetVertex(tetmesh->m_next_vid, newPos, "");
	tetmesh->id2Ver[nver->id()] = nver;
	++tetmesh->m_next_vid;
	std::vector<Tetra*> nTets;

	Tetra *tet = halfface->tetra();

	for (int i = 0; i < 4; ++i) {
		TetHalfFace *hf = tet->halfface(i);
		if (hf == halfface) {
			continue;
		}
	
		Tetra *ntet = new Tetra(tetmesh->m_next_tid, tetmesh->id2Tetra.size(), hf, nver);
		tetmesh->id2Tetra[ntet->id()] = ntet;
		++tetmesh->m_next_tid;
		nTets.push_back(ntet);
	}



	std::vector<TetHalfFace*> halffaces;
	for (size_t i = 0; i < nTets.size(); ++i) {
		Tetra *tet = nTets[i];	
		for (int i = 0; i < 4; ++i) {
			halffaces.push_back(tet->halfface(i));	
		}
	}

	std::vector<TetFace*> faces;
	buildFaces(halffaces, faces);

	//remove the tet from the vertex 
	//the old edges are located in halfface(0)
	for (int i = 0; i < 4; ++i) {
		TetVertex *tv = tet->vertex(i);
		std::vector<Tetra*>& vec = tv->m_tetra; // use shorter name
		vec.erase(std::remove(vec.begin(), vec.end(), tet), vec.end());
	}

	//add the previous face
	for (int i = 0; i < 4; ++i) {
		faces.push_back(tet->halfface(i)->face());
	}

	std::vector<TetEdge*> edges;
	buildEdges(faces, edges);

	halfface->tetra()->isValid() = false;
		
} 
Exemplo n.º 2
0
void TetMeshUtility::split(TetMesh *tetmesh, TetEdge *tedge) {
	Point newPos = (tedge->vertex(0)->point() + tedge->vertex(1)->point()) / 2.0; 
	TetVertex *nver = new TetVertex(tetmesh->m_next_vid, newPos, "");
	nver->index() = tetmesh->id2Ver.size();
	tetmesh->id2Ver[nver->id()] = nver;
	++tetmesh->m_next_vid;
	std::vector<Tetra*> nTets;

	//find the one-ring tets;
	std::vector<TetFace *> prev_faces;
	for (TetEdgeTetraIterator iter(tedge); !iter.end(); ++iter) {
		Tetra *tet = *iter;
		for (int i = 0; i < 4; ++i) {
			TetHalfFace *hf = tet->halfface(i);
			if (hf->has(tedge->vertex(0)) && hf->has(tedge->vertex(1))) {
				continue;
			}
			

			Tetra *ntet = new Tetra(tetmesh->m_next_tid, tetmesh->id2Tetra.size(), hf, nver);
			prev_faces.push_back(hf->face());
			tetmesh->id2Tetra[ntet->id()] = ntet;
			++tetmesh->m_next_tid;
			nTets.push_back(ntet);

		}
	

	}	


	//delete the surrounding tetra;
	for (TetEdgeTetraIterator iter(tedge); !iter.end(); ++iter) {
		Tetra *tet = *iter;
		tet->isValid() = false;
		tetmesh->id2Tetra[tet->id()] = 0;
		delete tet;
	}

	std::vector<TetHalfFace*> halffaces;
	for (size_t i = 0; i < nTets.size(); ++i) {
		Tetra *tet = nTets[i];	
		for (int i = 1; i < 4; ++i) {
			halffaces.push_back(tet->halfface(i));	
		}
	}

	std::vector<TetFace*> faces;
	buildFaces(halffaces, faces);
	
	faces.insert(faces.end(), prev_faces.begin(), prev_faces.end());

	std::vector<TetEdge*> edges;
	buildEdges(faces, edges);

	tedge->isValid() = false;
}
Exemplo n.º 3
0
HexagonalBoard::HexagonalBoard(unsigned layers)
{
  if(layers > 0){
    generateTiles(layers);

    buildTiles(layers);
    buildEdges();
    buildVertices();
    //applyResourcesAndDie();
  }
}
Exemplo n.º 4
0
void Mesh::finalize(bool needEdges)
{
	buildVerticesInFaces();

	if (!m_externalVtxNormals && !m_externalFaceNormals)
	{
		compute_normals_per_facet();
		compute_normals_per_vertex();
	}
	else if (!m_externalFaceNormals)
	{
		average_normals_per_facet();
	}

	compute_bounding_box();		
	//mesh->estimateCurvature();
	compute_triangle_surfaces();	
	centerOfMass();
	//m_mesh->compute_volume();
	
	if (needEdges)
		buildEdges();
}
Exemplo n.º 5
0
void TetMeshUtility::split(TetMesh *tetmesh, Tetra *tetra) {
	//create the new vertex
	Point newPos;
	for (int i = 0; i < 4; ++i) {
		newPos += tetra->vertex(i)->point();
	}
	newPos /= 4.0;

	//create new Vertex;
	TetVertex *nver = new TetVertex(tetmesh->m_next_vid, newPos, "");
	nver->index() = tetmesh->id2Ver.size();
	tetmesh->id2Ver[nver->id()] = nver;
	++tetmesh->m_next_vid;
	std::vector<Tetra*> nTets;

	for (int i = 0; i < 4; ++i) {
		TetHalfFace *halfface = tetra->halfface(i);
		Tetra *ntet = new Tetra(tetmesh->m_next_tid, tetmesh->id2Tetra.size(), halfface, nver);
		tetmesh->id2Tetra[ntet->id()] = ntet;
		++tetmesh->m_next_tid;
		nTets.push_back(ntet);
	}

	std::vector<TetHalfFace*> halffaces;
	for (size_t i = 0; i < nTets.size(); ++i) {
		Tetra *tet = nTets[i];	
		for (int i = 0; i < 4; ++i) {
			halffaces.push_back(tet->halfface(i));	
		}
	}


	std::vector<TetFace*> faces;
	buildFaces(halffaces, faces);
	
	//remove the tet from the vertex 
	//the old edges are located in halfface(0)
	for (int i = 0; i < 4; ++i) {
		TetVertex *tv = tetra->vertex(i);
		std::vector<Tetra*>& vec = tv->m_tetra; // use shorter name
		vec.erase(std::remove(vec.begin(), vec.end(), tetra), vec.end());
	}

	//add the previous face
	for (int i = 0; i < 4; ++i) {
		faces.push_back(tetra->halfface(i)->face());
	}


	std::vector<TetEdge*> edges;
	buildEdges(faces, edges);
	
	//link the tetra with the vertex
	for (size_t i = 0; i < nTets.size(); ++i) {
		Tetra *tet = nTets[i];	
		for (int j = 0; j < 4; ++j) {
			TetVertex *tv = tet->vertex(j);
			tv->add(tet);
		}
	}

	tetmesh->id2Tetra[tetra->id()] = 0;
	//delete tetra;
	
}