36 const std::vector<Point_Rn>& listOfSeeds):_inputSpace(inputSpace),_listOfSeeds(listOfSeeds) {
40 boost::shared_ptr<HalfSpace_Rn>
Voronoi_Rn::computeMidPlane(std::vector<Point_Rn>::const_iterator iteSeed1, std::vector<Point_Rn>::const_iterator iteSeed2) {
41 unsigned int dimension = iteSeed1->dimension();
42 boost::shared_ptr<HalfSpace_Rn> HS;
44 double sum_square = 0.;
45 for (
unsigned int coord_count=0; coord_count<dimension; coord_count++) {
46 HS->setCoefficient(coord_count, iteSeed1->getCoordinate(coord_count)-iteSeed2->getCoordinate(coord_count));
47 double sq = iteSeed1->getCoordinate(coord_count)*iteSeed1->getCoordinate(coord_count);
48 sq -= iteSeed2->getCoordinate(coord_count)*iteSeed2->getCoordinate(coord_count);
52 HS->setConstant(-sum_square);
63 out << std::endl <<
"#VORONOI DIAGRAM" << std::endl;
65 std::vector< boost::shared_ptr<Polytope_Rn> >::const_iterator itePC=
_listOfVoronoiCells.begin();
67 out <<
"# Cell "<< nb << std::endl;
84 throw std::domain_error(
"Voronoi_Rn::gnuplot(std::ostream& out) dimension is not 2 ");
87 std::vector< boost::shared_ptr<Polytope_Rn> >::const_iterator iteVC=
_listOfVoronoiCells.begin();
89 double frac = (double)nb / (
double)(*iteVC)->numberOfGenerators();
90 std::ostringstream stream_;
92 std::string valString = stream_.str();
101 throw std::length_error(
"IncrementalVoronoi::compute() needs seeds as input!");
115 unsigned int counter = 0;
116 {
for (std::vector<Point_Rn>::const_iterator newVoronoiSeed = (
_listOfSeeds.begin()+1); newVoronoiSeed!=
_listOfSeeds.end(); ++newVoronoiSeed) {
119 std::cout << std::endl;
120 std::cout <<
"Seed " << newVoronoiSeed-
_listOfSeeds.begin() <<
": ";
121 (newVoronoiSeed)->save(std::cout);
122 std::cout << std::endl;
129 unsigned int newTruncationStep = newVoronoiCell->numberOfHalfSpaces();
130 {
for (std::vector<Point_Rn>::const_iterator processedSeed =
_listOfSeeds.begin(); processedSeed!=newVoronoiSeed; ++processedSeed) {
132 boost::shared_ptr<HalfSpace_Rn> HS =
computeMidPlane(newVoronoiSeed, processedSeed);
133 newVoronoiCell->addHalfSpace(HS);
139 boost::shared_ptr<PolyhedralCone_Rn>,
142 DD(newVoronoiCell, lexmin_ite, newTruncationStep);
148 std::vector<Point_Rn>::const_iterator processedSeed;
149 std::vector< boost::shared_ptr<Polytope_Rn> >::iterator oldVoronoiCell;
160 boost::shared_ptr<HalfSpace_Rn> HS =
computeMidPlane(processedSeed, newVoronoiSeed);
161 unsigned int oldTruncationStep = (*oldVoronoiCell)->numberOfHalfSpaces();
162 (*oldVoronoiCell)->addHalfSpace(HS);
167 boost::shared_ptr<PolyhedralCone_Rn>,
170 DD2(*oldVoronoiCell, lexmin_ite2, oldTruncationStep);
191 throw std::length_error(
"CellByCellVoronoi::compute() needs seeds as input!");
201 unsigned int counter = 0;
202 {
for (std::vector<Point_Rn>::const_iterator newVoronoiSeed =
_listOfSeeds.begin(); newVoronoiSeed!=
_listOfSeeds.end(); ++newVoronoiSeed) {
205 std::cout << std::endl;
206 std::cout <<
"Seed " << newVoronoiSeed-
_listOfSeeds.begin() <<
": ";
207 (newVoronoiSeed)->save(std::cout);
208 std::cout << std::endl;
215 unsigned int newTruncationStep = newVoronoiCell->numberOfHalfSpaces();
216 {
for (std::vector<Point_Rn>::const_iterator currentSeed =
_listOfSeeds.begin(); currentSeed!=
_listOfSeeds.end(); ++currentSeed) {
217 if (currentSeed != newVoronoiSeed) {
219 boost::shared_ptr<HalfSpace_Rn> HS =
computeMidPlane(newVoronoiSeed, currentSeed);
220 newVoronoiCell->addHalfSpace(HS);
227 boost::shared_ptr<PolyhedralCone_Rn>,
230 DD(newVoronoiCell, lexmin_ite, newTruncationStep);
380 bool operator() (std::pair<double, unsigned int> pt1, std::pair<double, unsigned int> pt2) {
return (pt1.first < pt2.first);}
384 std::vector< std::pair< double, unsigned int > >& allDistances,
385 std::vector<Point_Rn>::const_iterator newVoronoiSeed,
386 boost::shared_ptr<Polytope_Rn> newVoronoiCell)
389 allDistances.clear();
390 std::pair< double, unsigned int > v;
393 unsigned int distCounter = 0;
394 {
for (std::vector<Point_Rn>::const_iterator currentSeed =
_listOfSeeds.begin(); currentSeed!=
_listOfSeeds.end(); ++currentSeed) {
395 if (currentSeed != newVoronoiSeed) {
396 boost::numeric::ublas::vector<double> v1 = currentSeed->vect();
397 v1 -= newVoronoiSeed->vect();
398 allDistances[distCounter].first = norm_2(v1);
401 allDistances[distCounter].first = 0.;
404 allDistances[distCounter].second = distCounter;
413 std::partial_sort(allDistances.begin(), allDistances.begin()+nbOfSortedSeeds, allDistances.end(),
thisSortOnFirstCoord);
427 for (iteHSnewVoronoiSeed.
begin(); iteHSnewVoronoiSeed.
end()!=
true; iteHSnewVoronoiSeed.
next())
429 {
for (
unsigned int i=1; i<allDistances.size(); ++i) {
431 std::vector<Point_Rn>::const_iterator currentSeed =
_listOfSeeds.begin()+allDistances[i].second;
433 boost::shared_ptr<HalfSpace_Rn> HS =
computeMidPlane(newVoronoiSeed, currentSeed);
434 newVoronoiCell->addHalfSpace(HS);
442 throw std::length_error(
"CellByCellVoronoiDist::compute() needs seeds as input!");
452 unsigned int counter = 0;
453 {
for (std::vector<Point_Rn>::const_iterator newVoronoiSeed =
_listOfSeeds.begin(); newVoronoiSeed!=
_listOfSeeds.end(); ++newVoronoiSeed) {
456 std::cout << std::endl;
457 std::cout <<
"Seed " << newVoronoiSeed-
_listOfSeeds.begin() <<
": ";
458 (newVoronoiSeed)->save(std::cout);
459 std::cout << std::endl;
466 unsigned int newTruncationStep = newVoronoiCell->numberOfHalfSpaces();
469 std::vector< std::pair< double, unsigned int > > allDistances;
476 boost::shared_ptr<PolyhedralCone_Rn>,
479 DD(newVoronoiCell, lexmin_ite, newTruncationStep);
499 std::vector< Point_Rn >::const_iterator iteBeg =
_listOfSeeds.begin();
500 std::vector< Point_Rn >::const_iterator iteEnd =
_listOfSeeds.end();
505 std::vector< Point_Rn >::const_iterator iteBeg,
506 std::vector< Point_Rn >::const_iterator iteEnd) {
509 throw std::length_error(
"CellByCellVoronoiDistNgb::compute() needs seeds as input!");
522 {
for (std::vector<Point_Rn>::const_iterator newVoronoiSeed = iteBeg; newVoronoiSeed!=iteEnd; ++newVoronoiSeed) {
525 std::cout << std::endl;
526 std::cout <<
"Seed " << newVoronoiSeed-
_listOfSeeds.begin() <<
": ";
527 (newVoronoiSeed)->save(std::cout);
528 std::cout << std::endl;
535 unsigned int newTruncationStep = newVoronoiCell->numberOfHalfSpaces();
538 std::vector< std::pair< double, unsigned int > > allDistances;
545 boost::shared_ptr<PolyhedralCone_Rn>,
548 DD(newVoronoiCell, lexmin_ite, newTruncationStep);
574 std::vector< std::vector< std::pair<boost::shared_ptr<HalfSpace_Rn>,
unsigned int> > >::const_iterator iteSeed;
576 unsigned int cellCounter = 0;
578 this_ostream << iteSeed->size() <<
" ";
579 std::vector< std::pair<boost::shared_ptr<HalfSpace_Rn>,
unsigned int> >::const_iterator iteCurHS_NgbNb;
580 for (iteCurHS_NgbNb=iteSeed->begin(); iteCurHS_NgbNb!=iteSeed->end(); ++iteCurHS_NgbNb) {
581 this_ostream <<
_listOfVoronoiCells[cellCounter]->getHalfSpaceNumber(iteCurHS_NgbNb->first) <<
" " << iteCurHS_NgbNb->second <<
" ";
583 this_ostream << std::endl;
589 const std::vector< std::pair< double, unsigned int > >& allDistances,
590 boost::shared_ptr<Polytope_Rn> newVoronoiCell,
591 unsigned int counter,
unsigned int newTruncationStep) {
593 for (iteHS_Vorcell.
begin(); iteHS_Vorcell.
end()!=
true; iteHS_Vorcell.
next()) {
595 std::vector< boost::shared_ptr<HalfSpace_Rn> >::const_iterator iteAll;
596 unsigned int hs_all_counter = newTruncationStep;
598 if (iteHS_Vorcell.
current() == *iteAll) {
606 unsigned int ngbSeedNumber = allDistances[hs_all_counter-newTruncationStep+1].second;
607 std::pair< boost::shared_ptr<HalfSpace_Rn>,
unsigned int > curHalfspace_ngbPolytope(iteHS_Vorcell.
current(), ngbSeedNumber);
722 std::vector< std::vector< std::pair<boost::shared_ptr<HalfSpace_Rn>,
unsigned int> > >::const_iterator iteSeed;
724 unsigned int cellCounter = 0;
727 std::vector< std::pair<boost::shared_ptr<HalfSpace_Rn>,
unsigned int> >::const_iterator iteCurHS_NgbNb;
728 for (iteCurHS_NgbNb=iteSeed->begin(); iteCurHS_NgbNb!=iteSeed->end(); ++iteCurHS_NgbNb) {
729 this_ostream << iteCurHS_NgbNb->second <<
" ";
731 this_ostream << std::endl;
737 std::vector< std::vector< std::pair<boost::shared_ptr<HalfSpace_Rn>,
unsigned int> > >::const_iterator iteSeed;
739 unsigned int cellCounter = 0;
741 this_ostream << iteSeed->size() <<
" ";
742 std::vector< std::pair<boost::shared_ptr<HalfSpace_Rn>,
unsigned int> >::const_iterator iteCurHS_NgbNb;
743 for (iteCurHS_NgbNb=iteSeed->begin(); iteCurHS_NgbNb!=iteSeed->end(); ++iteCurHS_NgbNb) {
744 this_ostream <<
_listOfVoronoiCells[cellCounter]->getHalfSpaceNumber(iteCurHS_NgbNb->first) <<
" " << iteCurHS_NgbNb->second <<
" ";
746 this_ostream << std::endl;
753 throw std::length_error(
"VoronoiWithProperties::fuseCellsWithSameProperty() needs seeds as input!");
754 unsigned int currentSeedNb = 0;
755 std::vector< boost::shared_ptr<Polytope_Rn> >::iterator iteCell;
756 std::vector< std::vector< std::pair<boost::shared_ptr<HalfSpace_Rn>,
unsigned int> > >::iterator iteSeed;
761 std::vector< std::pair<boost::shared_ptr<HalfSpace_Rn>,
unsigned int> >::iterator iteCurHS_NgbNb;
762 for (iteCurHS_NgbNb=iteSeed->begin(); iteCurHS_NgbNb!=iteSeed->end(); ++iteCurHS_NgbNb) {
764 unsigned int ngbNb = iteCurHS_NgbNb->second;
768 if ((*iteCell)->numberOfHalfSpaces() > 0) {
770 boost::shared_ptr<HalfSpace_Rn> HS = iteCurHS_NgbNb->first;
772 (*iteCell)->removeHalfSpaceFromListAndGenerators(HS);
784 std::set< unsigned int > allProcessedSeeds;
785 newListOfNonConvexPolytopes.clear();
788 if (allProcessedSeeds.find(currentSeedNb) == allProcessedSeeds.end()) {
790 std::vector< unsigned int > v;
791 newListOfNonConvexPolytopes.push_back(v);
793 std::stack< unsigned int > allNeighboursWithSameProperty;
794 allNeighboursWithSameProperty.push(currentSeedNb);
797 if (allProcessedSeeds.insert(currentSeedNb).second ==
true) {
801 newListOfNonConvexPolytopes[newListOfNonConvexPolytopes.size()-1].push_back(currentSeedNb);
804 while (!allNeighboursWithSameProperty.empty()) {
805 unsigned int topSeed = allNeighboursWithSameProperty.top();
806 allNeighboursWithSameProperty.pop();
807 std::vector< std::pair<boost::shared_ptr<HalfSpace_Rn>,
unsigned int> >::iterator iteCurHS_NgbNb;
809 unsigned int ngbSeed = iteCurHS_NgbNb->second;
810 if (allProcessedSeeds.find(ngbSeed) == allProcessedSeeds.end()) {
812 allNeighboursWithSameProperty.push(ngbSeed);
813 allProcessedSeeds.insert(ngbSeed);
816 newListOfNonConvexPolytopes[newListOfNonConvexPolytopes.size()-1].push_back(ngbSeed);
833 throw std::length_error(
"VoronoiWithProperties::fuseCellsWithSameProperty() needs seeds as input!");
834 std::vector< std::vector< unsigned int > > allNonConvexPolytopeIds;
837 newListOfNonConvexPolytopes.resize(allNonConvexPolytopeIds.size());
838 std::vector< std::vector< unsigned int > >::const_iterator iteNCPIds = allNonConvexPolytopeIds.begin();
839 unsigned int currentSeedNb = 0;
840 for (; iteNCPIds != allNonConvexPolytopeIds.end(); ++iteNCPIds) {
841 std::vector< unsigned int >::const_iterator iteCurrentNCPId = iteNCPIds->begin();
842 for (; iteCurrentNCPId != iteNCPIds->end(); ++iteCurrentNCPId) {
843 newListOfNonConvexPolytopes[currentSeedNb].push_back(
_listOfVoronoiCells[*iteCurrentNCPId]);
852 std::set< boost::shared_ptr<HalfSpace_Rn> > alreadyProcessedFacets;
855 std::vector< std::pair< boost::shared_ptr<HalfSpace_Rn>,
unsigned int > >::iterator iteNgb =
_facetNeighbours[nbCell].begin();
861 alreadyProcessedFacets.insert(iteNgb->first);
862 if (nbProperty != newProperty) {
864 std::vector< boost::shared_ptr< Generator_Rn > > listOfVtcesPerFacet;
866 for (iteGN.
begin(); iteGN.
end() !=
true; iteGN.
next()) {
867 for (
unsigned int i = 0; i < iteGN.
current()->numberOfFacets(); i++) {
868 if (iteGN.
current()->getFacet(i) == iteNgb->first)
869 listOfVtcesPerFacet.push_back( iteGN.
current() );
874 else if (listOfAlreadyProcessedSeeds[iteNgb->second] ==
false) {
876 listOfAlreadyProcessedSeeds[iteNgb->second] =
true;
877 propagate(listOfAlreadyProcessedSeeds, iteNgb->second, nbProperty);
884 if (alreadyProcessedFacets.find(
_listOfVoronoiCells[nbCell]->getHalfSpace(i)) == alreadyProcessedFacets.end()) {
886 std::vector< boost::shared_ptr< Generator_Rn > > listOfVtcesPerFacet;
888 for (iteGN.
begin(); iteGN.
end() !=
true; iteGN.
next()) {
889 for (
unsigned int j = 0; j < iteGN.
current()->numberOfFacets(); ++j) {
891 listOfVtcesPerFacet.push_back( iteGN.
current() );
902 throw std::length_error(
"VoronoiWithProperties::fuseCellsWithSameProperty() needs seeds as input!");
904 std::set< unsigned int > listOfAlreadyProcessedLayers;
908 std::vector< std::vector< std::pair< boost::shared_ptr<HalfSpace_Rn>,
unsigned int > > >::const_iterator iteCell =
_facetNeighbours.begin();
913 if (listOfAlreadyProcessedSeeds[nbCell] ==
false) {
914 std::cout << listOfAlreadyProcessedSeeds[nbCell] << std::endl;
915 listOfAlreadyProcessedSeeds[nbCell] =
true;
919 propagate(listOfAlreadyProcessedSeeds, nbCell, nbProperty);