21 #ifndef DOUBLEDESCRIPTION_Rn
22 #define DOUBLEDESCRIPTION_Rn
49 template<
class POLYHEDRON,
class ITERATOR,
class REDUNDANCY_PROCESSING >
class DoubleDescription {
53 std::vector< boost::shared_ptr<Generator_Rn_SD> > listOfGenSD;
57 poly->getListOfGeneratorsSD(listOfGenSD);
68 poly->setListOfGeneratorsSD(listOfGenSD);
80 REDUNDANCY_PROCESSING redproc,
84 std::vector< boost::shared_ptr<Generator_Rn_SD> > listOfGenSD;
88 poly->getListOfGeneratorsSD(listOfGenSD);
100 unsigned int nbRes=0;
101 std::vector< boost::shared_ptr<Generator_Rn_SD> >::const_iterator iteGenSD;
102 {
for (iteGenSD=listOfGenSD.begin(); iteGenSD!=listOfGenSD.end(); ++iteGenSD) {
106 unsigned int nbOp1 = (*iteGenSD)->getGeneratorNumber();
127 poly->setListOfGeneratorsSD(listOfGenSD);
139 std::vector< boost::shared_ptr<Generator_Rn_SD> >& GN_list,
140 const boost::shared_ptr<HalfSpace_Rn>& currentHalfSpace,
141 std::vector<double>& GN_IN_sp,
142 std::vector<double>& GN_OUT_sp,
143 std::vector< boost::shared_ptr<Generator_Rn_SD> >& GN_IN,
144 std::vector< boost::shared_ptr<Generator_Rn_SD> >& GN_OUT,
145 std::vector< boost::shared_ptr<Generator_Rn_SD> >& GN_ON)
147 int GeneratorNumber=0;
149 double halfSpaceNorm =
150 std::inner_product(currentHalfSpace->begin(), currentHalfSpace->end(), currentHalfSpace->begin(), 0.);
151 halfSpaceNorm = sqrt(halfSpaceNorm);
152 std::vector< boost::shared_ptr<Generator_Rn_SD> >::iterator iteGN;
153 for (iteGN=GN_list.begin(); iteGN!=GN_list.end(); ++iteGN) {
155 double scalarProduct =
156 std::inner_product((*iteGN)->begin(), (*iteGN)->end(), currentHalfSpace->begin(), 0.);
159 unsigned int RnDIM=currentHalfSpace->dimension();
160 std::cout.precision(15);
161 std::cout <<
"# V" << GeneratorNumber <<
" = [";
162 {
for (
unsigned int ii=0; ii<RnDIM; ii++) {
163 std::cout << (*iteGN)->getCoordinate(ii);
167 std::cout <<
"]" << std::endl <<
"{ ";
168 {
for (
unsigned int ii=0; ii<(*iteGN)->numberOfFacets(); ii++) {
169 std::cout << (*iteGN)->getFacet(ii) <<
" ";
171 std::cout <<
"}" << std::endl;
172 std::cout <<
"dotP = " << scalarProduct;
173 std::cout <<
", dist = " << (scalarProduct+currentHalfSpace->getConstant()) / halfSpaceNorm;
176 double distanceToHyperplane = (scalarProduct+currentHalfSpace->getConstant()) / halfSpaceNorm;
177 if (distanceToHyperplane > TOL) {
178 GN_IN.push_back((*iteGN));
179 GN_IN_sp.push_back(scalarProduct);
181 else if (distanceToHyperplane < -TOL) {
182 GN_OUT.push_back((*iteGN));
183 GN_OUT_sp.push_back(scalarProduct);
186 GN_ON.push_back((*iteGN));
190 if (distanceToHyperplane > TOL)
192 else if (distanceToHyperplane < -TOL)
203 bool compute(POLYHEDRON poly, ITERATOR iteHS,
int truncationStep, std::vector< boost::shared_ptr<Generator_Rn_SD> >& listOfGenSD) {
205 std::vector<double> GN_IN_sp;
206 std::vector<double> GN_OUT_sp;
208 std::vector< boost::shared_ptr<Generator_Rn_SD> > GN_IN;
209 std::vector< boost::shared_ptr<Generator_Rn_SD> > GN_OUT;
210 std::vector< boost::shared_ptr<Generator_Rn_SD> > GN_ON;
211 std::vector< boost::shared_ptr<Generator_Rn_SD> > GN_new;
213 std::vector< boost::shared_ptr<HalfSpace_Rn> > redundantHS;
214 int halfspaceNumber=truncationStep, generatorNumber=0;
215 unsigned int RnDIM=poly->dimension();
219 std::cout << std::endl <<
"DoubleDescription::compute(" << truncationStep <<
")" << std::endl;
225 generatorNumber = poly->numberOfGenerators();
226 iteHS.setStep(truncationStep);
227 {
for (iteHS.begin(); iteHS.end()!=
true; iteHS.next()) {
228 const boost::shared_ptr<HalfSpace_Rn>& currentHalfSpace = iteHS.current();
231 double halfSpaceNorm = std::inner_product(currentHalfSpace->begin(), currentHalfSpace->end(), currentHalfSpace->begin(), 0.);
232 halfSpaceNorm = sqrt(halfSpaceNorm);
233 std::cout <<
"Facet number " << halfspaceNumber << std::endl;
234 std::cout <<
"H" << halfspaceNumber <<
" = ";
235 currentHalfSpace->dump(std::cout);
236 std::cout <<
", norm=" << halfSpaceNorm;
237 std::cout << std::endl;
241 computeVertexStates(listOfGenSD, currentHalfSpace, GN_IN_sp, GN_OUT_sp, GN_IN, GN_OUT, GN_ON);
244 if (GN_IN.empty() ==
true) {
247 std::cout <<
"Truncation is empty." << std::endl;
255 if (GN_OUT.empty() ==
true) {
257 redundantHS.push_back(currentHalfSpace);
261 std::cout <<
"VX_OUT= " << GN_OUT.size() << std::endl;
262 std::cout <<
"VX_IN = " << GN_IN.size() << std::endl;
263 std::cout <<
"VX_ON = " << GN_ON.size() << std::endl;
264 std::cout <<
"redundantHS = " << redundantHS.size() << std::endl;
265 std::cout <<
"============================================" << std::endl;
268 else if (GN_IN.empty() !=
true) {
273 unsigned int count_OUT=0;
274 std::vector< boost::shared_ptr<Generator_Rn_SD> >::const_iterator iteGN_OUT;
275 {
for (iteGN_OUT=GN_OUT.begin(); iteGN_OUT!=GN_OUT.end(); ++iteGN_OUT, ++count_OUT) {
276 unsigned int count_IN=0;
277 std::vector< boost::shared_ptr<Generator_Rn_SD> >::const_iterator iteGN_IN;
278 {
for (iteGN_IN=GN_IN.begin(); iteGN_IN!=GN_IN.end(); ++iteGN_IN, ++count_IN) {
279 std::vector< unsigned int > commonPFacets;
287 unsigned int count_ON=0;
288 std::vector< boost::shared_ptr<Generator_Rn_SD> >::const_iterator iteGN_ON;
289 {
for (iteGN_ON=GN_ON.begin(); iteGN_ON!=GN_ON.end(); ++iteGN_ON, ++count_ON) {
290 std::vector< unsigned int > commonPFacets;
300 unsigned int count_ON1=0;
301 std::vector< boost::shared_ptr<Generator_Rn_SD> >::const_iterator iteGN_ON1;
302 {
for (iteGN_ON1=GN_ON.begin(); iteGN_ON1!=GN_ON.end(); ++iteGN_ON1, ++count_ON1) {
303 unsigned int count_IN=0;
304 std::vector< boost::shared_ptr<Generator_Rn_SD> >::const_iterator iteGN_IN;
305 {
for (iteGN_IN=GN_IN.begin(); iteGN_IN!=GN_IN.end(); ++iteGN_IN, ++count_IN) {
306 std::vector< unsigned int > commonPFacets;
314 unsigned int count_ON2=0;
315 std::vector< boost::shared_ptr<Generator_Rn_SD> >::const_iterator iteGN_ON2;
316 {
for (iteGN_ON2=GN_ON.begin(); iteGN_ON2!=GN_ON.end(); ++iteGN_ON2, ++count_ON2) {
317 std::vector< unsigned int > commonPFacets;
318 if (iteGN_ON1 != iteGN_ON2 &&
329 for (newGeneratorsTool.
begin(); newGeneratorsTool.
end()!=
true; newGeneratorsTool.
next()) {
337 const boost::shared_ptr<Generator_Rn_SD>& currentGeneratorIn = GN_IN[newGeneratorsTool.
currentGenInNumber()];
338 const boost::shared_ptr<Generator_Rn_SD>& currentGeneratorOut = GN_OUT[newGeneratorsTool.
currentGenOutNumber()];
342 poly->createTruncatedGenerator(currentGeneratorOut, currentGeneratorIn, newV, ay, az, currentHalfSpace->getConstant());
344 std::vector< unsigned int > commonFacets;
347 newV->setAllFacets(commonFacets);
353 std::set< unsigned int > setOfFacets;
354 std::vector< boost::shared_ptr<Generator_Rn_SD> >::const_iterator iteGN_ON_eq;
355 {
for (iteGN_ON_eq=GN_ON.begin(); iteGN_ON_eq!=GN_ON.end() && notEq==
true; ++iteGN_ON_eq) {
356 if ((*iteGN_ON_eq)->isEqual2(newV, RnDIM, TOL2)) {
360 newV->exportFacets(setOfFacets);
361 (*iteGN_ON_eq)->exportFacets(setOfFacets);
362 (*iteGN_ON_eq)->importFacets(setOfFacets);
363 (*iteGN_ON_eq)->orderFacets();
366 std::vector< boost::shared_ptr<Generator_Rn_SD> >::const_iterator iteGN_NEW_eq;
367 {
for (iteGN_NEW_eq=GN_new.begin(); iteGN_NEW_eq!=GN_new.end() && notEq==
true; ++iteGN_NEW_eq) {
368 if ((*iteGN_NEW_eq)->isEqual2(newV, RnDIM, TOL2)) {
371 newV->setFacet(halfspaceNumber);
372 newV->exportFacets(setOfFacets);
373 (*iteGN_NEW_eq)->exportFacets(setOfFacets);
374 (*iteGN_NEW_eq)->importFacets(setOfFacets);
375 (*iteGN_NEW_eq)->orderFacets();
379 newV->setFacet(halfspaceNumber);
380 GN_new.push_back(newV);
382 std::cout <<
"New Generator = [";
383 newV->save(std::cout);
384 std::cout <<
"] GeneratorIN [";
385 currentGeneratorIn->save(std::cout);
386 std::cout <<
"], VX_IN_sp=" << az <<
" GeneratorOUT [";
387 currentGeneratorOut->save(std::cout);
388 std::cout <<
"], VX_OUT_sp=" << ay << std::endl;
393 std::cout <<
"No new Generator as [";
394 newV->save(std::cout);
395 std::cout <<
"] is equal to a previous one." << std::endl;
401 std::cout <<
"VX_OUT= " << GN_OUT.size() << std::endl;
402 std::cout <<
"VX_IN = " << GN_IN.size() << std::endl;
403 std::cout <<
"VX_ON = " << GN_ON.size() << std::endl;
404 std::cout <<
"redundantHS = " << redundantHS.size() << std::endl;
405 std::cout <<
"============================================" << std::endl;
409 std::vector< boost::shared_ptr<Generator_Rn_SD> >::const_iterator iteGN_ON;
410 for (iteGN_ON=GN_ON.begin(); iteGN_ON!=GN_ON.end(); ++iteGN_ON) {
411 (*iteGN_ON)->setFacet(halfspaceNumber);
417 GN_IN.push_back(*iteGN_ON);
423 std::vector< boost::shared_ptr<Generator_Rn_SD> >::const_iterator iteGN_new;
424 for (iteGN_new=GN_new.begin(); iteGN_new!=GN_new.end(); ++iteGN_new) {
426 GN_IN.push_back(*iteGN_new);
434 std::vector< boost::shared_ptr<Generator_Rn_SD> >::const_iterator iteGN_OUT;
435 for (iteGN_OUT=GN_OUT.begin(); iteGN_OUT!=GN_OUT.end(); ++iteGN_OUT) {
476 const boost::shared_ptr<Generator_Rn>& genIn,
477 const boost::shared_ptr<Generator_Rn>& genOut,
478 std::vector< boost::shared_ptr<HalfSpace_Rn> >& commonFacets) {
479 return poly->checkNeighbours(genIn, genOut, commonFacets);
485 const boost::shared_ptr<Generator_Rn>& genIn,
486 const boost::shared_ptr<Generator_Rn>& genOut,
487 std::vector< HalfSpace_Rn* >& commonFacets) {
488 return poly->checkNeighbours(genIn, genOut, commonFacets);
525 std::vector< unsigned int >& getNumberOfVerticesPerHalfSpace) {
531 std::vector< unsigned int >&,
532 std::set< unsigned int >& getListOfRedundantHS) {
544 {
for (
unsigned int j=0; j<nbHS; ++j) {
547 std::vector< boost::shared_ptr<Generator_Rn_SD> >::const_iterator constITER_GN;
548 for (constITER_GN=LG.begin(); constITER_GN!=LG.end(); ++constITER_GN) {
549 {
for (
unsigned int j=0; j<(*constITER_GN)->numberOfFacets(); j++) {
550 unsigned int nbF = (*constITER_GN)->getFacet(j);
562 {
for (
unsigned int j=0; j<nbHS; ++j) {
563 std::set< unsigned int > genSet;
566 for (constITER_GN=LG.begin(); constITER_GN!=LG.end(); ++constITER_GN) {
567 {
for (
unsigned int j=0; j<(*constITER_GN)->numberOfFacets(); j++) {
568 unsigned int F = (*constITER_GN)->getFacet(j);
571 _allGenPerHS[F].insert( (*constITER_GN)->getGeneratorNumber() );
580 std::set< unsigned int > genSet;
588 const std::vector< boost::shared_ptr<Generator_Rn_SD> >& GN_ON) {
590 std::vector< boost::shared_ptr<Generator_Rn_SD> >::const_iterator iteGN_ON;
591 for (iteGN_ON=GN_ON.begin(); iteGN_ON!=GN_ON.end(); ++iteGN_ON)
592 _allGenPerHS[ HS ].insert( (*iteGN_ON)->getGeneratorNumber() );
597 for (
unsigned int l=0; l<GEN->numberOfFacets(); ++l) {
599 _allGenPerHS[ GEN->getFacet(l) ].insert( GEN->getGeneratorNumber() );
605 for (
unsigned int l=0; l<GEN->numberOfFacets(); ++l) {
607 _allGenPerHS[ GEN->getFacet(l) ].erase( GEN->getGeneratorNumber() );
615 const boost::shared_ptr<Generator_Rn_SD>& genIn,
616 const boost::shared_ptr<Generator_Rn_SD>& genOut,
617 std::vector< unsigned int >& commonFacets) {
619 std::set_intersection(genIn->facetsBegin(), genIn->facetsEnd(), genOut->facetsBegin(), genOut->facetsEnd(),
620 std::inserter(commonFacets, commonFacets.end()));
636 std::cout <<
"Redundant " << i;
637 std::cout << std::endl;
647 std::vector< std::set< unsigned int > >::const_iterator it_1, it_2;
651 if (it_1->size() > it_2->size()) {
652 if (std::includes(it_1->begin(), it_1->end(), it_2->begin(), it_2->end())) {
655 std::cout <<
"New redundant facet: " << i2 << std::endl;
659 else if (it_1->size() < it_2->size()) {
660 if (std::includes(it_2->begin(), it_2->end(), it_1->begin(), it_1->end())) {
663 std::cout <<
"New redundant facet: " << i1 << std::endl;
683 {
for (iteHS.begin(), hsNb=0; iteHS.end()!=
true; iteHS.next(), ++hsNb) {
687 {
for (iteGN.begin(); iteGN.end()!=
true; iteGN.next()) {
688 boost::shared_ptr<Generator_Rn> gen = iteGN.
current();
689 {
for (
int j=gen->numberOfFacets()-1; j>=0; j--) {
690 if (iteHS.current() == gen->getFacet(j))
700 {
for (iteHS2.begin(), hsNb=0; iteHS2.end()!=
true; iteHS2.next(), ++hsNb) {
712 std::vector< unsigned int > HS2Remove;
713 std::set< unsigned int >::const_iterator it;
716 std::cout << *it <<
" ";
718 HS2Remove.push_back(*it);
720 std::sort(HS2Remove.begin(), HS2Remove.end(), std::greater<unsigned int>());
721 std::vector< unsigned int >::const_iterator it2;
722 {
for (it2=HS2Remove.begin(); it2!=HS2Remove.end(); ++it2) {
724 poly->removeHalfSpace(*it2);
727 std::cout << std::endl;
736 for (
unsigned int i=0; i<truncationStep; ++i)
746 unsigned int RnDIM=poly->dimension();
747 this_stream <<
"List of redundant half-spaces :" << std::endl;
751 {
for (iteHS.begin(), hsNb=0; iteHS.end()!=
true; iteHS.next(), ++hsNb) {
753 boost::shared_ptr<HalfSpace_Rn> currentHalfSpace = iteHS.
current();
754 this_stream <<
"H = (" << currentHalfSpace->getConstant() <<
", ";
755 {
for (
unsigned int ii=0; ii<RnDIM; ii++) {
756 this_stream << currentHalfSpace->getCoefficient(ii);
760 this_stream <<
")" << std::endl;
767 std::vector< std::set< unsigned int > >::const_iterator iteGHS;
768 this_stream <<
"*** number(HalfSpace_Rn0) => {Generator_Rn0*, Generator_Rn1*, Generator_Rn2*, ...}" << std::endl;
769 unsigned int counter=0;
771 this_stream << counter <<
" => { ";
772 std::copy(iteGHS->begin(), iteGHS->end(), std::ostream_iterator<unsigned int>(std::cout,
" ") );
773 this_stream <<
"}" << std::endl;
776 this_stream <<
"*** number of generators per half-spaces : ";
778 this_stream << std::endl;
779 this_stream <<
"*** list of redundant half-spaces : ";
781 this_stream << std::endl;
void unhookRedundantHalfSpaces(POLYHEDRON poly)
bool compute(POLYHEDRON poly, ITERATOR iteHS, int truncationStep, std::vector< boost::shared_ptr< Generator_Rn_SD > > &listOfGenSD)
The main function splitting the polyhedron cone or polytope 1-skeleton with a list of half-spaces...
bool checkNeighbours(POLYHEDRON poly, const boost::shared_ptr< Generator_Rn_SD > &genIn, const boost::shared_ptr< Generator_Rn_SD > &genOut, std::vector< unsigned int > &commonFacets)
void next()
Iterator function.
void setResult_Operator(unsigned int nbRes, int nb)
Set the link between the nb-th entity of operator1 and the nbRes-th entity of the result...
void begin()
Iterator function.
void updateListOfRedundantHalfSpaces(unsigned int)
Only useful in the case of dealing and processing redundancy.
DoubleDescription(POLYHEDRON poly, ITERATOR ite, REDUNDANCY_PROCESSING redproc, int truncationStep)
void addHalfSpace()
Make space for a new half-space.
void initNumberOfVerticesPerHalfSpace(const std::vector< boost::shared_ptr< Generator_Rn_SD > > &LG, unsigned int nbHS)
Make sure all back pointers from half-spaces to vertices are set.
bool end()
Iterator function.
void incrementNumberForVerticesForHalfSpace(const boost::shared_ptr< Generator_Rn > &)
Only useful in the case of dealing and processing redundancy.
Class dedicated to degeneration processing when looking for neighbours. Let A be a polytope of wher...
void updateNumberOfVerticesPerHalfSpace(unsigned int HS, const std::vector< boost::shared_ptr< Generator_Rn_SD > > &GN_ON)
The current face must mark all the vertices with state ON.
unsigned int currentGenOutNumber()
Iterator function.
void computeVertexStates(std::vector< boost::shared_ptr< Generator_Rn_SD > > &GN_list, const boost::shared_ptr< HalfSpace_Rn > ¤tHalfSpace, std::vector< double > &GN_IN_sp, std::vector< double > &GN_OUT_sp, std::vector< boost::shared_ptr< Generator_Rn_SD > > &GN_IN, std::vector< boost::shared_ptr< Generator_Rn_SD > > &GN_OUT, std::vector< boost::shared_ptr< Generator_Rn_SD > > &GN_ON)
For each generator compute its state according to the current half-space.
void setResultEntityAsUnchanged(unsigned int nb)
Mark as Result_UNCHANGED the nb-th entity before the operation.
void initNumberOfVerticesPerHalfSpace(const std::vector< boost::shared_ptr< Generator_Rn > > &)
Only useful in the case of dealing and processing redundancy.
void updateNumberOfVerticesPerHalfSpace(const boost::shared_ptr< HalfSpace_Rn > &, unsigned int)
Only useful in the case of dealing and processing redundancy.
void fillListOfRedundantHS(const POLYHEDRON poly)
virtual bool checkNeighbours(POLYHEDRON poly, const boost::shared_ptr< Generator_Rn > &genIn, const boost::shared_ptr< Generator_Rn > &genOut, std::vector< HalfSpace_Rn * > &commonFacets)
Check whether two generators are neighbors in the context of not taking into account redundancy...
unsigned int _neigbourhoodCondition
To define the relation between generators.
const GEOMETRIC_OBJECT current()
Return the current geometric element.
void dumpListOfRedundantHS(POLYHEDRON poly, std::ostream &this_stream)
virtual void updateListOfRedundantHalfSpaces(unsigned int numberOfGeneratorsPerFacet)
std::vector< std::set< unsigned int > > _allGenPerHS
Store all raw back pointers to know which vertices belong to a given half-space.
virtual bool checkNeighbours(POLYHEDRON poly, const boost::shared_ptr< Generator_Rn > &genIn, const boost::shared_ptr< Generator_Rn > &genOut, std::vector< boost::shared_ptr< HalfSpace_Rn > > &commonFacets)
Check whether two generators are neighbors in the context of not taking into account redundancy...
Makes the assumption we do not need to process redundant half-spaces in a specific way...
void markHdescription(TrackingOperatorToResult &trackerHdesc, unsigned int truncationStep)
virtual ~NoRedundancyProcessing()
std::vector< unsigned int > _numberOfVerticesPerHalfSpace
To know about how many vertices refer to a given half-space.
virtual ~StrongRedundancyProcessing()
unsigned int _numberOfHalfSpaces
The total number of processed half-spaces.
void unhookRedundantHalfSpaces(POLYHEDRON)
bool _isEmpty
Store the current state of the intersection.
void setNumbersOfEntities(unsigned int nbEntBefore, unsigned int nbEntAfter)
static polito_EXPORT double getTolerance()
Give the minimum distance between two points.
This class stores static function that dispatch the main geometric values we use. ...
void setOperatorEntityAsUnchanged(unsigned int nb)
Mark as Operator_UNCHANGED the nb-th entity before the operation.
This class can be more time-consuming than WeakRedundancyProcessing or NoRedundancyProcessing because...
unsigned int currentGenInNumber()
Iterator function.
void decrementNumberForVerticesForHalfSpace(const boost::shared_ptr< Generator_Rn > &)
Only useful in the case of dealing and processing redundancy.
This class is designed to run the list of all geometric objects representing a polytope.
void fillListOfRedundantHS(const POLYHEDRON, std::vector< unsigned int > &, std::set< unsigned int > &getListOfRedundantHS)
DoubleDescription(POLYHEDRON poly, ITERATOR ite, REDUNDANCY_PROCESSING redproc, int truncationStep, TrackingOperatorToResult &trackerVdesc, TrackingOperatorToResult &trackerHdesc)
void setResultEntityAsModified(unsigned int nb)
Mark as Result_MODIFIED the nb-th entity after the operation.
A n-coordinates generator for internal data structure. It can be a vertex or an edge whether it is em...
static std::string getStateAsText(const HalfSpace_Rn::State &)
void decrementNumberForVerticesForHalfSpace(const boost::shared_ptr< Generator_Rn_SD > &GEN)
Make sure all the half-spaces belonging to a given generator have their vertices number decremented...
StrongRedundancyProcessing(unsigned int ngbCond)
void addGenerator(const std::vector< unsigned int > &commonFacets, unsigned int numbergenIN, unsigned int numbergenOUT, HalfSpace_Rn::State state)
Tell whether a pseudo neighbor is a genuine one comparing set of half-spaces.
void fillNumberOfVerticesPerHalfSpace(const POLYHEDRON, std::vector< unsigned int > &getNumberOfVerticesPerHalfSpace)
void setOperator_Result(unsigned int nb, int nbRes)
Set the link between the nb-th entity of operator1 and the nbRes-th entity of the result...
void setResultEntityAsCreated(unsigned int nb)
Mark as Result_CREATED the nb-th entity after the operation.
std::set< unsigned int > _listOfRedundantHS
To know whether an half-space has been ticked redundant or not.
The algorithm implemented here is an incremental algorithm as mentioned in How Good are Convex Hull ...
void setOperatorEntityAsModified(unsigned int nb)
Mark as Operator_MODIFIED the nb-th entity before the operation.
void incrementNumberForVerticesForHalfSpace(const boost::shared_ptr< Generator_Rn_SD > &GEN)
Make sure all the half-spaces belonging to a given generator have their vertices number incremented...
void dumpSD(std::ostream &this_stream)
void setOperatorEntityAsDeleted(unsigned int nb)
Mark as Operator_DELETED the nb-th entity before the operation.
REDUNDANCY_PROCESSING _redundancyProcessing
This class is dedicated to dealing with redundant half-spaces with the desired policy.