// init lower dimensional faces for (int codimension = 1; codimension < dimension+1; codimension++)
{ if(!_faces[dimension - codimension + 1].empty())
{ for (face_list_t::const_iterator it = _faces[dimension - codimension + 1].begin();
it != _faces[dimension - codimension + 1].end(); it++)
{ for (int i = 0; i < dimension - codimension + 2; i++)
{
Face * boundaryFace = it->createBoundaryFace(i); // only add boundaryFace if it is not already contained in complex if (std::find(_faces[dimension - codimension].begin(), _faces[dimension - codimension].end(), *boundaryFace) == _faces[dimension - codimension].end())
{
_faces[dimension - codimension].push_back(*boundaryFace);
}
delete boundaryFace;
}
}
}
}
// init moves if (!_faces[dimension].empty())
{ for (face_list_t::const_iterator it = _faces[dimension].begin(); it != _faces[dimension].end(); it++)
{ // add all 0-moves
_moves[0].push_back(std::make_pair(BistellarMove(*it, Face()), true));
}
} for (int codimension = 1; codimension < dimension+1; codimension++)
{ if (!_faces[dimension-codimension].empty())
{ for (face_list_t::const_iterator it = _faces[dimension-codimension].begin(); it != _faces[dimension-codimension].end(); it++)
{
std::deque< Face > linkFacets; // copy all Facets that contain (*it) as a subface to linkFacets if (!_faces[dimension].empty())
{ for (face_list_t::const_iterator it2 = _faces[dimension].begin(); it2 != _faces[dimension].end(); it2++)
{ if (it->isSubfaceOf(*it2))
linkFacets.push_back(*it2);
}
}
if (linkFacets.size() == codimension+1)
{ // add the move option.
Face linkFace = Face::linkFace(*it, linkFacets); if (linkFace.dimension() <= _dimension)
_moves[codimension].push_back(std::make_pair(BistellarMove(*it, linkFace), (std::find(_faces[linkFace.dimension()].begin(), _faces[linkFace.dimension()].end(), linkFace) == _faces[linkFace.dimension()].end())));
}
}
}
}
#ifdef Bistellar_debug_output for (int i = 0; i < dimension+1; i++)
{
std::cout << i << "-Moves: "; if (!_moves[i].empty()) list_print(std::cout, _moves[i].begin(), _moves[i].end());
std::cout << std::endl;
} #endif
}
// add ∂face*link
vertex_t largestVertex = 0; if (!_faces[0].empty())
{ for (face_list_t::const_iterator it = _faces[0].begin(); it != _faces[0].end(); it++)
{ if (vertex_t_compare(&largestVertex, &(it->vertex(0))) < 0)
largestVertex = it->vertex(0);
}
}
largestVertex++;
Face newVertex(&largestVertex, 0);
_faces[0].push_back(newVertex);
face_list_t listOfSubfaces;
addSubfacesOfFace(move.face(), listOfSubfaces);
face_list_t listOfBoundaryfaces;
addBoundaryfacesOfFace(move.face(), listOfBoundaryfaces); if (!listOfSubfaces.empty())
{ for (face_list_t::iterator it = listOfSubfaces.begin(); it != listOfSubfaces.end(); it++)
{
Face newFace = Face::unite(*it, newVertex); // add new face to complex
_faces[newFace.dimension()].push_back(newFace);
_faces[move.dimension()].erase(faceIt);
_moves[move.codimension()].erase(moveIt); if (!listOfLinkSubfaces.empty())
{ for (face_list_t::iterator it = listOfLinkSubfaces.begin(); it != listOfLinkSubfaces.end(); it++)
{ // remove old faces
Face oldFace = Face::unite(move.face(), *it);
face_list_t::iterator oldFaceIt = std::find(_faces[oldFace.dimension()].begin(), _faces[oldFace.dimension()].end(), oldFace); if (oldFaceIt != _faces[oldFace.dimension()].end())
_faces[oldFace.dimension()].erase(oldFaceIt);
// remove old moves if (!_moves[this->dimension() - oldFace.dimension()].empty())
{ for (bistellar_move_option_list_t::iterator oldMoveIt = _moves[this->dimension() - oldFace.dimension()].begin(); oldMoveIt != _moves[this->dimension() - oldFace.dimension()].end(); oldMoveIt++)
{ if (oldMoveIt->first.face() == oldFace)
{
_moves[this->dimension() - oldFace.dimension()].erase(oldMoveIt); break;
}
}
}
}
}
// add the new faces for (face_list_t::iterator it = listOfFaceSubfaces.begin(); it != listOfFaceSubfaces.end(); it++)
{
Face newFace = Face::unite(*it, move.link());
#ifdef Bistellar_debug_output
std::cout << "Resulting complex is ";
list_print(std::cout, _faces[_dimension].begin(), _faces[_dimension].end());
std::cout << "." << std::endl; for (int i = 0; i < _dimension+1; i++)
{
std::cout << _moves[i].size() << " " << i << "-Moves: "; if (!_moves[i].empty()) list_print(std::cout, _moves[i].begin(), _moves[i].end());
std::cout << std::endl;
} #endif
} else
{ #ifdef Bistellar_debug_output
std::cout << move << " is not a valid move for the complex " << *this << std::endl; #endif
}
}
// used in the implementation of moveComplex void updateBallBoundary(MovableComplex & complex, const face_list_t & ballBoundaryFaces)
{ if (!ballBoundaryFaces.empty())
{ for (face_list_t::const_iterator it = ballBoundaryFaces.begin(); it != ballBoundaryFaces.end(); it++)
{
face_list_t linkFacets; // copy all facets that contain (*it) as a subface to linkFacets if (!complex._faces[complex._dimension].empty())
{ for (face_list_t::const_iterator it2 = complex._faces[complex._dimension].begin(); it2 != complex._faces[complex._dimension].end(); it2++)
{ if (it->isSubfaceOf(*it2))
linkFacets.push_back(*it2);
}
}
// remove the move option with (*it) as face if (!complex._moves[complex._dimension - it->dimension()].empty())
{ if (!complex._moves[complex._dimension - it->dimension()].empty())
{ for (bistellar_move_option_list_t::iterator mIt = complex._moves[complex._dimension - it->dimension()].begin(); mIt != complex._moves[complex._dimension - it->dimension()].end(); mIt++)
{ if (mIt->first.face() == *it)
{
complex._moves[complex._dimension - it->dimension()].erase(mIt); break;
}
}
}
}
if (linkFacets.size() == complex._dimension - it->dimension() + 1)
{ // add the move option.
Face linkFace = Face::linkFace(*it, linkFacets); if (linkFace.dimension() <= complex._dimension)
complex._moves[complex._dimension - it->dimension()].push_back(std::make_pair(BistellarMove(*it, linkFace), (std::find(complex._faces[linkFace.dimension()].begin(), complex._faces[linkFace.dimension()].end(), linkFace) == complex._faces[linkFace.dimension()].end())));
}
}
}
} void updateMoveValidity(MovableComplex & complex)
{ for (unsignedint i = 1; i < complex._dimension + 1; i++)
{ if (!complex._moves[i].empty())
{ for (bistellar_move_option_list_t::iterator it = complex._moves[i].begin(); it != complex._moves[i].end(); it++)
it->second = (std::find(complex._faces[it->first.link().dimension()].begin(), complex._faces[it->first.link().dimension()].end(), it->first.link()) == complex._faces[it->first.link().dimension()].end());
}
}
}
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.17Bemerkung:
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.