Changes in / [9fe36b:b8d1aeb]
- Files:
-
- 26 added
- 75 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified src/Actions/small_actions.cpp ¶
r9fe36b rb8d1aeb 53 53 return NAME; 54 54 } 55 -
TabularUnified src/Makefile.am ¶
r9fe36b rb8d1aeb 1 1 ATOMSOURCE = atom.cpp atom_atominfo.cpp atom_bondedparticle.cpp atom_bondedparticleinfo.cpp atom_graphnode.cpp atom_graphnodeinfo.cpp atom_particleinfo.cpp atom_trajectoryparticle.cpp atom_trajectoryparticleinfo.cpp 2 2 ATOMHEADER = atom.hpp atom_atominfo.hpp atom_bondedparticle.hpp atom_bondedparticleinfo.hpp atom_graphnode.hpp atom_graphnodeinfo.hpp atom_particleinfo.hpp atom_trajectoryparticle.hpp atom_trajectoryparticleinfo.hpp 3 4 LINALGSOURCE = gslmatrix.cpp gslvector.cpp linearsystemofequations.cpp 5 LINALGHEADER = gslmatrix.hpp gslvector.hpp linearsystemofequations.hpp 3 6 4 7 ANALYSISSOURCE = analysis_bonds.cpp analysis_correlation.cpp … … 31 34 QTUI_DEFS = 32 35 33 SOURCE = ${ANALYSISSOURCE} ${ATOMSOURCE} ${PATTERNSOURCE} bond.cpp bondgraph.cpp boundary.cpp config.cpp element.cpp ellipsoid.cpp errorlogger.cpp graph.cpp helpers.cpp leastsquaremin.cpp linkedcell.cpp log.cpp logger.cpp memoryusageobserver.cpp moleculelist.cpp molecule.cpp molecule_dynamics.cpp molecule_fragmentation.cpp molecule_geometry.cpp molecule_graph.cpp molecule_pointcloud.cpp parser.cpp periodentafel.cpp tesselation.cpp tesselationhelpers.cpp vector.cpp verbose.cpp34 HEADER = ${ANALYSISHEADER} ${ATOMHEADER} ${PATTERNHEADER} bond.hpp bondgraph.hpp boundary.hpp config.hpp defs.hpp element.hpp ellipsoid.hpp errorlogger.hpp graph.hpp helpers.hpp leastsquaremin.hpp linkedcell.hpp lists.hpp log.hpp logger.hpp memoryallocator.hpp memoryusageobserver.hpp molecule.hpp molecule_template.hpp parser.hpp periodentafel.hpp stackclass.hpp tesselation.hpp tesselationhelpers.hpp vector.hpp verbose.hpp36 SOURCE = ${ANALYSISSOURCE} ${ATOMSOURCE} ${PATTERNSOURCE} bond.cpp bondgraph.cpp boundary.cpp config.cpp element.cpp ellipsoid.cpp errorlogger.cpp graph.cpp helpers.cpp info.cpp leastsquaremin.cpp linkedcell.cpp log.cpp logger.cpp memoryusageobserver.cpp moleculelist.cpp molecule.cpp molecule_dynamics.cpp molecule_fragmentation.cpp molecule_geometry.cpp molecule_graph.cpp molecule_pointcloud.cpp parser.cpp periodentafel.cpp tesselation.cpp tesselationhelpers.cpp vector.cpp verbose.cpp 37 HEADER = ${ANALYSISHEADER} ${ATOMHEADER} ${PATTERNHEADER} bond.hpp bondgraph.hpp boundary.hpp config.hpp defs.hpp element.hpp ellipsoid.hpp errorlogger.hpp graph.hpp helpers.hpp info.hpp leastsquaremin.hpp linkedcell.hpp lists.hpp log.hpp logger.hpp memoryallocator.hpp memoryusageobserver.hpp molecule.hpp molecule_template.hpp parser.hpp periodentafel.hpp stackclass.hpp tesselation.hpp tesselationhelpers.hpp vector.hpp verbose.hpp 35 38 36 39 BOOST_LIB = $(BOOST_LDFLAGS) $(BOOST_MPL_LIB) 37 40 INCLUDES = -I$(top_srcdir)/src/unittests 38 41 39 noinst_LIBRARIES = libmolecuilder.a lib menu.a42 noinst_LIBRARIES = libmolecuilder.a libgslwrapper.a libmenu.a 40 43 bin_PROGRAMS = molecuilder molecuildergui joiner analyzer 41 44 molecuilderdir = ${bindir} 42 45 libmolecuilder_a_SOURCES = ${SOURCE} ${HEADER} 43 46 libmenu_a_SOURCES = ${UISOURCE} ${UIHEADER} 47 libgslwrapper_a_SOURCES = ${LINALGSOURCE} ${LINALGHEADER} 44 48 molecuilder_DATA = elements.db valence.db orbitals.db Hbonddistance.db Hbondangle.db 45 49 molecuilder_LDFLAGS = $(BOOST_LIB) 46 molecuilder_SOURCES = ${FACTORYSOURCE} menu.cpp builder.cpp 47 molecuilder_LDADD = libmolecuilder.a libmenu.a 50 molecuilder_SOURCES = ${FACTORYSOURCE} menu.cpp builder.cpp 51 molecuilder_SOURCES += $(srcdir)/version.c 52 molecuilder_LDADD = libmolecuilder.a libgslwrapper.a libmenu.a 48 53 #Stuff for building the GUI using QT 49 54 molecuildergui_SOURCES = ${QTUISOURCE} ${FACTORYSOURCE} menu.cpp builder.cpp 55 molecuildergui_SOURCES += $(srcdir)/version.c 50 56 molecuildergui_CXXFLAGS = ${QT_CXXFLAGS} ${GLU_CXXFLAGS} -DUSE_GUI_QT 51 57 molecuildergui_LDFLAGS = $(BOOST_LIB) ${QT_LDFLAGS} ${GLU_LDFLAGS} 52 molecuildergui_LDADD = libmolecuilder.a lib menu.a ${QT_LDADD} ${QT_LIB_GUI} -lQtOpenGL ${GLU_LIBS}58 molecuildergui_LDADD = libmolecuilder.a libgslwrapper.a libmenu.a ${QT_LDADD} ${QT_LIB_GUI} -lQtOpenGL ${GLU_LIBS} 53 59 joiner_SOURCES = joiner.cpp datacreator.cpp parser.cpp datacreator.hpp helpers.hpp parser.hpp periodentafel.hpp 54 60 joiner_LDADD = libmolecuilder.a … … 72 78 #EXTRA_DIST = ${molecuilder_DATA} 73 79 80 FORCE: 81 $(srcdir)/.git-version: FORCE 82 @if (test -d $(top_srcdir)/../.git && cd $(srcdir) && git describe HEAD) > .git-version-t 2>/dev/null \ 83 && ! diff .git-version-t $(srcdir)/.git-version >/dev/null 2>&1; then \ 84 mv -f .git-version-t $(srcdir)/.git-version; \ 85 else \ 86 rm -f .git-version-t; \ 87 fi 88 89 EXTRA_DIST = $(srcdir)/.git-version 90 91 $(srcdir)/version.c: $(srcdir)/.git-version 92 echo "const char *ESPACKVersion = \"$(PACKAGE_NAME) -- git version: "`cat $(srcdir)/.git-version`"\";" > $@ 93 94 -
TabularUnified src/UIElements/Dialog.cpp ¶
r9fe36b rb8d1aeb 9 9 10 10 #include "UIElements/Dialog.hpp" 11 12 #include "vector.hpp" 11 13 12 14 using namespace std; … … 96 98 } 97 99 100 // Double Queries 101 102 Dialog::DoubleQuery::DoubleQuery(string title,double *_target) : 103 Query(title), target(_target) 104 {} 105 106 Dialog::DoubleQuery::~DoubleQuery() {}; 107 108 void Dialog::DoubleQuery::setResult() { 109 *target = tmp; 110 } 111 112 98 113 // Molecule Queries 99 114 … … 110 125 *target = tmp; 111 126 } 127 128 // Vector Queries 129 130 Dialog::VectorQuery::VectorQuery(std::string title,Vector *_target,const double *const _cellSize,bool _check) : 131 Query(title), target(_target), cellSize(_cellSize), check(_check) 132 { 133 tmp = new Vector(); 134 } 135 136 Dialog::VectorQuery::~VectorQuery() 137 { 138 delete tmp; 139 } 140 141 void Dialog::VectorQuery::setResult() { 142 *target = *tmp; 143 } -
TabularUnified src/UIElements/Dialog.hpp ¶
r9fe36b rb8d1aeb 14 14 class MoleculeListClass; 15 15 class molecule; 16 class Vector; 16 17 17 18 class Dialog … … 22 23 23 24 virtual void queryInt(const char *, int *)=0; 25 virtual void queryDouble(const char*,double *)=0; 24 26 virtual void queryString(const char*, std::string *)=0; 25 27 virtual void queryMolecule(const char*,molecule**,MoleculeListClass*)=0; 28 virtual void queryVector(const char*,Vector *,const double *const,bool)=0; 26 29 27 30 virtual bool display(); … … 67 70 }; 68 71 72 class DoubleQuery : public Query { 73 public: 74 DoubleQuery(std::string title,double *_target); 75 ~DoubleQuery(); 76 virtual bool handle()=0; 77 virtual void setResult(); 78 protected: 79 double tmp; 80 private: 81 double *target; 82 }; 83 69 84 class StringQuery : public Query { 70 85 public: … … 78 93 std::string *target; 79 94 }; 95 80 96 81 97 class MoleculeQuery : public Query { … … 92 108 }; 93 109 110 class VectorQuery : public Query { 111 public: 112 VectorQuery(std::string title,Vector *_target,const double *const _cellSize,bool _check); 113 ~VectorQuery(); 114 virtual bool handle()=0; 115 virtual void setResult(); 116 protected: 117 Vector *tmp; 118 const double *const cellSize; 119 bool check; 120 private: 121 Vector *target; 122 }; 123 94 124 void registerQuery(Query* query); 95 125 -
TabularUnified src/UIElements/QT4/QTDialog.cpp ¶
r9fe36b rb8d1aeb 10 10 #include <string> 11 11 #include <sstream> 12 #include <limits> 12 13 13 14 #include <Qt/qboxlayout.h> 14 15 #include <Qt/qlabel.h> 15 16 #include <Qt/qspinbox.h> 17 #include <QtGui/QDoubleSpinBox> 16 18 #include <Qt/qlineedit.h> 17 19 #include <Qt/qdialogbuttonbox.h> … … 75 77 } 76 78 79 void QTDialog::queryDouble(const char* title, double* target){ 80 registerQuery(new DoubleQTQuery(title,target,inputLayout,this)); 81 } 82 77 83 void QTDialog::queryString(const char* title, std::string *target) 78 84 { … … 84 90 registerQuery(new MoleculeQTQuery(title,target,molecules,inputLayout,this)); 85 91 } 92 93 void QTDialog::queryVector(const char* title, Vector *target,const double *const cellSize, bool check) { 94 registerQuery(new VectorQTQuery(title,target,cellSize,check,inputLayout,this)); 95 } 96 97 /************************** Query Objects *******************************/ 86 98 87 99 QTDialog::IntQTQuery::IntQTQuery(string _title,int *_target,QBoxLayout *_parent,QTDialog *_dialog) : … … 110 122 bool QTDialog::IntQTQuery::handle() 111 123 { 124 return true; 125 } 126 127 QTDialog::DoubleQTQuery::DoubleQTQuery(string title,double *_target,QBoxLayout *_parent,QTDialog *_dialog) : 128 Dialog::DoubleQuery(title,_target), 129 parent(_parent) 130 { 131 thisLayout = new QHBoxLayout(); 132 titleLabel = new QLabel(QString(getTitle().c_str())); 133 inputBox = new QDoubleSpinBox(); 134 inputBox->setValue(0); 135 inputBox->setRange(-numeric_limits<double>::max(),numeric_limits<double>::max()); 136 inputBox->setDecimals(3); 137 parent->addLayout(thisLayout); 138 thisLayout->addWidget(titleLabel); 139 thisLayout->addWidget(inputBox); 140 141 pipe = new DoubleQTQueryPipe(&tmp,_dialog); 142 pipe->update(inputBox->value()); 143 connect(inputBox,SIGNAL(valueChanged(double)),pipe,SLOT(update(double))); 144 } 145 146 QTDialog::DoubleQTQuery::~DoubleQTQuery() 147 { 148 delete pipe; 149 } 150 151 bool QTDialog::DoubleQTQuery::handle() { 112 152 return true; 113 153 } … … 177 217 } 178 218 219 QTDialog::VectorQTQuery::VectorQTQuery(std::string title, Vector *_target, const double *const _cellSize, bool _check,QBoxLayout *_parent,QTDialog *_dialog) : 220 Dialog::VectorQuery(title,_target,_cellSize,_check), 221 parent(_parent) 222 { 223 // About the j: I don't know why it was done this way, but it was used this way in Vector::AskPosition, so I reused it 224 int j = -1; 225 const char *coords[3] = {"x:","y:","z:"}; 226 mainLayout= new QHBoxLayout(); 227 titleLabel = new QLabel(QString(getTitle().c_str())); 228 mainLayout->addWidget(titleLabel); 229 subLayout = new QVBoxLayout(); 230 mainLayout->addLayout(subLayout); 231 for(int i=0; i<3; i++) { 232 j+=i+1; 233 coordLayout[i] = new QHBoxLayout(); 234 subLayout->addLayout(coordLayout[i]); 235 coordLabel[i] = new QLabel(QString(coords[i])); 236 coordLayout[i]->addWidget(coordLabel[i]); 237 coordInput[i] = new QDoubleSpinBox(); 238 coordInput[i]->setRange(0,cellSize[j]); 239 coordInput[i]->setDecimals(3); 240 coordLayout[i]->addWidget(coordInput[i]); 241 pipe[i] = new DoubleQTQueryPipe(&((*tmp)[i]),_dialog); 242 pipe[i]->update(coordInput[i]->value()); 243 connect(coordInput[i],SIGNAL(valueChanged(double)),pipe[i],SLOT(update(double))); 244 245 } 246 parent->addLayout(mainLayout); 247 } 248 249 QTDialog::VectorQTQuery::~VectorQTQuery() 250 {} 251 252 bool QTDialog::VectorQTQuery::handle() { 253 return true; 254 } 255 179 256 180 257 /*************************** Plumbing *******************************/ … … 203 280 void IntQTQueryPipe::update(int newInt) { 204 281 (*content) = newInt; 282 dialog->update(); 283 } 284 285 DoubleQTQueryPipe::DoubleQTQueryPipe(double *_content, QTDialog *_dialog) : 286 content(_content), 287 dialog(_dialog) 288 {} 289 290 DoubleQTQueryPipe::~DoubleQTQueryPipe() 291 {} 292 293 void DoubleQTQueryPipe::update(double newDbl) { 294 (*content) = newDbl; 205 295 dialog->update(); 206 296 } -
TabularUnified src/UIElements/QT4/QTDialog.hpp ¶
r9fe36b rb8d1aeb 15 15 class QLabel; 16 16 class QSpinBox; 17 class QDoubleSpinBox; 17 18 class QLineEdit; 18 19 class QComboBox; … … 23 24 class StringQTQueryPipe; 24 25 class IntQTQueryPipe; 26 class DoubleQTQueryPipe; 25 27 class MoleculeQTQueryPipe; 26 28 … … 34 36 virtual void queryInt(const char *, int *); 35 37 virtual void queryString(const char*, std::string *); 38 virtual void queryDouble(const char*,double *); 36 39 virtual void queryMolecule(const char*,molecule**,MoleculeListClass*); 40 virtual void queryVector(const char*,Vector *,const double *const,bool); 37 41 38 42 virtual bool display(); … … 53 57 54 58 IntQTQueryPipe *pipe; 59 }; 60 61 class DoubleQTQuery : public Dialog::DoubleQuery { 62 public: 63 DoubleQTQuery(std::string title, double *_target,QBoxLayout *_parent,QTDialog *_dialog); 64 ~DoubleQTQuery(); 65 virtual bool handle(); 66 private: 67 QBoxLayout *parent; 68 QBoxLayout *thisLayout; 69 QLabel *titleLabel; 70 QDoubleSpinBox *inputBox; 71 72 DoubleQTQueryPipe *pipe; 55 73 }; 56 74 … … 81 99 82 100 MoleculeQTQueryPipe *pipe; 101 }; 102 103 class VectorQTQuery : public Dialog::VectorQuery { 104 public: 105 VectorQTQuery(std::string title,Vector *_target,const double *const _cellSize,bool _check,QBoxLayout *,QTDialog *); 106 ~VectorQTQuery(); 107 virtual bool handle(); 108 private: 109 QBoxLayout *parent; 110 QBoxLayout *mainLayout; 111 QLabel *titleLabel; 112 QBoxLayout *subLayout; 113 QBoxLayout *coordLayout[3]; 114 QLabel *coordLabel[3]; 115 QDoubleSpinBox *coordInput[3]; 116 117 DoubleQTQueryPipe *pipe[3]; 83 118 }; 84 119 … … 124 159 }; 125 160 161 class DoubleQTQueryPipe : public QWidget { 162 Q_OBJECT 163 public: 164 DoubleQTQueryPipe(double *_content, QTDialog *_dialog); 165 ~DoubleQTQueryPipe(); 166 167 public slots: 168 void update(double); 169 170 private: 171 double *content; 172 QTDialog *dialog; 173 174 }; 126 175 127 176 class MoleculeQTQueryPipe : public QWidget { -
TabularUnified src/UIElements/TextDialog.cpp ¶
r9fe36b rb8d1aeb 31 31 } 32 32 33 void TextDialog::queryDouble(const char* title, double* target){ 34 registerQuery(new DoubleTextQuery(title,target)); 35 } 36 33 37 void TextDialog::queryString(const char* title, string* target){ 34 38 registerQuery(new StringTextQuery(title,target)); … … 37 41 void TextDialog::queryMolecule(const char* title, molecule **target, MoleculeListClass *molecules) { 38 42 registerQuery(new MoleculeTextQuery(title,target,molecules)); 43 } 44 45 void TextDialog::queryVector(const char* title, Vector *target,const double *const cellSize, bool check) { 46 registerQuery(new VectorTextQuery(title,target,cellSize,check)); 39 47 } 40 48 … … 65 73 } 66 74 75 TextDialog::DoubleTextQuery::DoubleTextQuery(string title,double *_target) : 76 Dialog::DoubleQuery(title,_target) 77 {} 78 79 TextDialog::DoubleTextQuery::~DoubleTextQuery() {} 80 81 bool TextDialog::DoubleTextQuery::handle() { 82 Log() << Verbose(0) << getTitle(); 83 cin >> tmp; 84 return true; 85 } 86 67 87 TextDialog::MoleculeTextQuery::MoleculeTextQuery(string title, molecule **_target, MoleculeListClass *_molecules) : 68 88 Dialog::MoleculeQuery(title,_target,_molecules) … … 84 104 return (idxOfMol!=-1); 85 105 } 106 107 TextDialog::VectorTextQuery::VectorTextQuery(std::string title, Vector *_target, const double *const _cellSize, bool _check) : 108 Dialog::VectorQuery(title,_target,_cellSize,_check) 109 {} 110 111 TextDialog::VectorTextQuery::~VectorTextQuery() 112 {} 113 114 bool TextDialog::VectorTextQuery::handle() { 115 tmp->AskPosition(cellSize,check); 116 return true; 117 } -
TabularUnified src/UIElements/TextDialog.hpp ¶
r9fe36b rb8d1aeb 21 21 virtual void queryInt(const char *, int *); 22 22 virtual void queryString(const char*, std::string *); 23 virtual void queryDouble(const char*, double*); 23 24 virtual void queryMolecule(const char*,molecule**,MoleculeListClass*); 25 virtual void queryVector(const char*,Vector *,const double * const,bool); 24 26 25 27 protected: … … 29 31 IntTextQuery(std::string title, int *_target); 30 32 ~IntTextQuery(); 33 virtual bool handle(); 34 }; 35 36 class DoubleTextQuery : public Dialog::DoubleQuery { 37 public: 38 DoubleTextQuery(std::string title, double *_target); 39 ~DoubleTextQuery(); 31 40 virtual bool handle(); 32 41 }; … … 45 54 virtual bool handle(); 46 55 }; 56 57 class VectorTextQuery : public Dialog::VectorQuery { 58 public: 59 VectorTextQuery(std::string title,Vector *_target,const double *const _cellSize,bool _check); 60 ~VectorTextQuery(); 61 virtual bool handle(); 62 }; 47 63 }; 48 64 -
TabularUnified src/analysis_correlation.cpp ¶
r9fe36b rb8d1aeb 10 10 #include "analysis_correlation.hpp" 11 11 #include "element.hpp" 12 #include "info.hpp" 12 13 #include "log.hpp" 13 14 #include "molecule.hpp" … … 28 29 PairCorrelationMap *PairCorrelation(MoleculeListClass * const &molecules, const element * const type1, const element * const type2 ) 29 30 { 31 Info FunctionInfo(__func__); 30 32 PairCorrelationMap *outmap = NULL; 31 33 double distance = 0.; … … 77 79 PairCorrelationMap *PeriodicPairCorrelation(MoleculeListClass * const &molecules, const element * const type1, const element * const type2, const int ranges[NDIM] ) 78 80 { 81 Info FunctionInfo(__func__); 79 82 PairCorrelationMap *outmap = NULL; 80 83 double distance = 0.; … … 154 157 CorrelationToPointMap *CorrelationToPoint(MoleculeListClass * const &molecules, const element * const type, const Vector *point ) 155 158 { 159 Info FunctionInfo(__func__); 156 160 CorrelationToPointMap *outmap = NULL; 157 161 double distance = 0.; … … 190 194 CorrelationToPointMap *PeriodicCorrelationToPoint(MoleculeListClass * const &molecules, const element * const type, const Vector *point, const int ranges[NDIM] ) 191 195 { 196 Info FunctionInfo(__func__); 192 197 CorrelationToPointMap *outmap = NULL; 193 198 double distance = 0.; … … 243 248 CorrelationToSurfaceMap *CorrelationToSurface(MoleculeListClass * const &molecules, const element * const type, const Tesselation * const Surface, const LinkedCell *LC ) 244 249 { 250 Info FunctionInfo(__func__); 245 251 CorrelationToSurfaceMap *outmap = NULL; 246 252 double distance = 0; … … 261 267 Log() << Verbose(3) << "Current atom is " << *Walker << "." << endl; 262 268 if ((type == NULL) || (Walker->type == type)) { 263 triangle = Surface->FindClosestTriangleTo Point(Walker->node, LC );269 triangle = Surface->FindClosestTriangleToVector(Walker->node, LC ); 264 270 if (triangle != NULL) { 265 271 distance = DistanceToTrianglePlane(Walker->node, triangle); … … 288 294 CorrelationToSurfaceMap *PeriodicCorrelationToSurface(MoleculeListClass * const &molecules, const element * const type, const Tesselation * const Surface, const LinkedCell *LC, const int ranges[NDIM] ) 289 295 { 296 Info FunctionInfo(__func__); 290 297 CorrelationToSurfaceMap *outmap = NULL; 291 298 double distance = 0; … … 301 308 } 302 309 outmap = new CorrelationToSurfaceMap; 310 double ShortestDistance = 0.; 311 BoundaryTriangleSet *ShortestTriangle = NULL; 303 312 for (MoleculeList::const_iterator MolWalker = molecules->ListOfMolecules.begin(); MolWalker != molecules->ListOfMolecules.end(); MolWalker++) 304 313 if ((*MolWalker)->ActiveFlag) { … … 314 323 periodicX.MatrixMultiplication(FullInverseMatrix); // x now in [0,1)^3 315 324 // go through every range in xyz and get distance 325 ShortestDistance = -1.; 316 326 for (n[0]=-ranges[0]; n[0] <= ranges[0]; n[0]++) 317 327 for (n[1]=-ranges[1]; n[1] <= ranges[1]; n[1]++) … … 320 330 checkX.AddVector(&periodicX); 321 331 checkX.MatrixMultiplication(FullMatrix); 322 triangle = Surface->FindClosestTriangleToPoint(&checkX, LC ); 323 if (triangle != NULL) { 324 distance = DistanceToTrianglePlane(&checkX, triangle); 325 outmap->insert ( pair<double, pair<atom *, BoundaryTriangleSet*> >(distance, pair<atom *, BoundaryTriangleSet*> (Walker, triangle) ) ); 332 triangle = Surface->FindClosestTriangleToVector(&checkX, LC); 333 distance = Surface->GetDistanceSquaredToTriangle(checkX, triangle); 334 if ((ShortestDistance == -1.) || (distance < ShortestDistance)) { 335 ShortestDistance = distance; 336 ShortestTriangle = triangle; 326 337 } 327 } 338 } 339 // insert 340 ShortestDistance = sqrt(ShortestDistance); 341 outmap->insert ( pair<double, pair<atom *, BoundaryTriangleSet*> >(ShortestDistance, pair<atom *, BoundaryTriangleSet*> (Walker, ShortestTriangle) ) ); 342 //Log() << Verbose(1) << "INFO: Inserting " << Walker << " with distance " << ShortestDistance << " to " << *ShortestTriangle << "." << endl; 328 343 } 329 344 } … … 342 357 double GetBin ( const double value, const double BinWidth, const double BinStart ) 343 358 { 359 Info FunctionInfo(__func__); 344 360 double bin =(double) (floor((value - BinStart)/BinWidth)); 345 361 return (bin*BinWidth+BinStart); … … 353 369 void OutputCorrelation( ofstream * const file, const BinPairMap * const map ) 354 370 { 371 Info FunctionInfo(__func__); 355 372 *file << "# BinStart\tCount" << endl; 356 373 for (BinPairMap::const_iterator runner = map->begin(); runner != map->end(); ++runner) { … … 365 382 void OutputPairCorrelation( ofstream * const file, const PairCorrelationMap * const map ) 366 383 { 384 Info FunctionInfo(__func__); 367 385 *file << "# BinStart\tAtom1\tAtom2" << endl; 368 386 for (PairCorrelationMap::const_iterator runner = map->begin(); runner != map->end(); ++runner) { … … 377 395 void OutputCorrelationToPoint( ofstream * const file, const CorrelationToPointMap * const map ) 378 396 { 397 Info FunctionInfo(__func__); 379 398 *file << "# BinStart\tAtom::x[i]-point.x[i]" << endl; 380 399 for (CorrelationToPointMap::const_iterator runner = map->begin(); runner != map->end(); ++runner) { … … 392 411 void OutputCorrelationToSurface( ofstream * const file, const CorrelationToSurfaceMap * const map ) 393 412 { 413 Info FunctionInfo(__func__); 394 414 *file << "# BinStart\tTriangle" << endl; 395 415 for (CorrelationToSurfaceMap::const_iterator runner = map->begin(); runner != map->end(); ++runner) { 396 *file << runner->first << "\t" << *(runner->second. second) << endl;397 } 398 }; 399 416 *file << runner->first << "\t" << *(runner->second.first) << "\t" << *(runner->second.second) << endl; 417 } 418 }; 419 -
TabularUnified src/analysis_correlation.hpp ¶
r9fe36b rb8d1aeb 53 53 double GetBin ( const double value, const double BinWidth, const double BinStart ); 54 54 void OutputCorrelation( ofstream * const file, const BinPairMap * const map ); 55 void OutputPairCorrelation( ofstream * const file, const BinPairMap * const map );56 void OutputCorrelationToPoint( ofstream * const file, const BinPairMap * const map );57 void OutputCorrelationToSurface( ofstream * const file, const BinPairMap * const map );55 void OutputPairCorrelation( ofstream * const file, const PairCorrelationMap * const map ); 56 void OutputCorrelationToPoint( ofstream * const file, const CorrelationToPointMap * const map ); 57 void OutputCorrelationToSurface( ofstream * const file, const CorrelationToSurfaceMap * const map ); 58 58 59 59 -
TabularUnified src/analyzer.cpp ¶
r9fe36b rb8d1aeb 7 7 8 8 //============================ INCLUDES =========================== 9 10 #include <cstring> 9 11 10 12 #include "datacreator.hpp" -
TabularUnified src/atom_bondedparticle.cpp ¶
r9fe36b rb8d1aeb 121 121 bond *CandidateBond = NULL; 122 122 123 NoBonds = CountBonds(); 123 124 //Log() << Verbose(3) << "Walker " << *this << ": " << (int)this->type->NoValenceOrbitals << " > " << NoBonds << "?" << endl; 124 NoBonds = CountBonds();125 125 if ((int)(type->NoValenceOrbitals) > NoBonds) { // we have a mismatch, check all bonding partners for mismatch 126 126 for (BondList::const_iterator Runner = ListOfBonds.begin(); Runner != ListOfBonds.end(); (++Runner)) { 127 127 OtherWalker = (*Runner)->GetOtherAtom(this); 128 128 OtherNoBonds = OtherWalker->CountBonds(); 129 //Log() << Verbose(3) << "OtherWalker " << *OtherWalker << ": " << (int)OtherWalker->type->NoValenceOrbitals << " > " << NoBonds << "?" << endl;130 if ((int)(OtherWalker->type->NoValenceOrbitals) > NoBonds) { // check if possible candidate129 //Log() << Verbose(3) << "OtherWalker " << *OtherWalker << ": " << (int)OtherWalker->type->NoValenceOrbitals << " > " << OtherNoBonds << "?" << endl; 130 if ((int)(OtherWalker->type->NoValenceOrbitals) > OtherNoBonds) { // check if possible candidate 131 131 if ((CandidateBond == NULL) || (ListOfBonds.size() > OtherWalker->ListOfBonds.size())) { // pick the one with fewer number of bonds first 132 132 CandidateBond = (*Runner); … … 137 137 if ((CandidateBond != NULL)) { 138 138 CandidateBond->BondDegree++; 139 Log() << Verbose(2) << "Increased bond degree for bond " << *CandidateBond << "." << endl;139 //Log() << Verbose(2) << "Increased bond degree for bond " << *CandidateBond << "." << endl; 140 140 } else { 141 //Log() << Verbose(2) << "Could not find correct degree for atom " << *this << "." << endl;141 eLog() << Verbose(2) << "Could not find correct degree for atom " << *this << "." << endl; 142 142 FalseBondDegree++; 143 143 } -
TabularUnified src/bondgraph.cpp ¶
r9fe36b rb8d1aeb 11 11 #include "bondgraph.hpp" 12 12 #include "element.hpp" 13 #include "info.hpp" 13 14 #include "log.hpp" 14 15 #include "molecule.hpp" … … 35 36 /** Parses the bond lengths in a given file and puts them int a matrix form. 36 37 * Allocates \a MatrixContainer for BondGraph::BondLengthMatrix, using MatrixContainer::ParseMatrix(), 37 * but only if parsing is successful l. Otherwise variable is left as NULL.38 * but only if parsing is successful. Otherwise variable is left as NULL. 38 39 * \param *out output stream for debugging 39 40 * \param filename file with bond lengths to parse … … 42 43 bool BondGraph::LoadBondLengthTable(const string &filename) 43 44 { 45 Info FunctionInfo(__func__); 44 46 bool status = true; 45 47 MatrixContainer *TempContainer = NULL; … … 53 55 54 56 // parse in matrix 55 status = TempContainer->ParseMatrix(filename.c_str(), 0, 1, 0); 57 if (status = TempContainer->ParseMatrix(filename.c_str(), 0, 1, 0)) { 58 Log() << Verbose(1) << "Parsing bond length matrix successful." << endl; 59 } else { 60 eLog() << Verbose(1) << "Parsing bond length matrix failed." << endl; 61 } 56 62 57 63 // find greatest distance -
TabularUnified src/boundary.cpp ¶
r9fe36b rb8d1aeb 10 10 #include "element.hpp" 11 11 #include "helpers.hpp" 12 #include "info.hpp" 12 13 #include "linkedcell.hpp" 13 14 #include "log.hpp" … … 33 34 double *GetDiametersOfCluster(const Boundaries *BoundaryPtr, const molecule *mol, Tesselation *&TesselStruct, const bool IsAngstroem) 34 35 { 36 Info FunctionInfo(__func__); 35 37 // get points on boundary of NULL was given as parameter 36 38 bool BoundaryFreeFlag = false; … … 53 55 } else { 54 56 BoundaryPoints = BoundaryPtr; 55 Log() << Verbose( 1) << "Using given boundary points set." << endl;57 Log() << Verbose(0) << "Using given boundary points set." << endl; 56 58 } 57 59 // determine biggest "diameter" of cluster for each axis … … 67 69 //Log() << Verbose(1) << "Current component is " << component << ", Othercomponent is " << Othercomponent << "." << endl; 68 70 for (Boundaries::const_iterator runner = BoundaryPoints[axis].begin(); runner != BoundaryPoints[axis].end(); runner++) { 69 //Log() << Verbose( 2) << "Current runner is " << *(runner->second.second) << "." << endl;71 //Log() << Verbose(1) << "Current runner is " << *(runner->second.second) << "." << endl; 70 72 // seek for the neighbours pair where the Othercomponent sign flips 71 73 Neighbour = runner; … … 82 84 DistanceVector.CopyVector(&runner->second.second->x); 83 85 DistanceVector.SubtractVector(&Neighbour->second.second->x); 84 //Log() << Verbose( 3) << "OldComponent is " << OldComponent << ", new one is " << DistanceVector.x[Othercomponent] << "." << endl;86 //Log() << Verbose(2) << "OldComponent is " << OldComponent << ", new one is " << DistanceVector.x[Othercomponent] << "." << endl; 85 87 } while ((runner != Neighbour) && (fabs(OldComponent / fabs( 86 88 OldComponent) - DistanceVector.x[Othercomponent] / fabs( … … 91 93 OtherNeighbour = BoundaryPoints[axis].end(); 92 94 OtherNeighbour--; 93 //Log() << Verbose( 2) << "The pair, where the sign of OtherComponent flips, is: " << *(Neighbour->second.second) << " and " << *(OtherNeighbour->second.second) << "." << endl;95 //Log() << Verbose(1) << "The pair, where the sign of OtherComponent flips, is: " << *(Neighbour->second.second) << " and " << *(OtherNeighbour->second.second) << "." << endl; 94 96 // now we have found the pair: Neighbour and OtherNeighbour 95 97 OtherVector.CopyVector(&runner->second.second->x); 96 98 OtherVector.SubtractVector(&OtherNeighbour->second.second->x); 97 //Log() << Verbose( 2) << "Distances to Neighbour and OtherNeighbour are " << DistanceVector.x[component] << " and " << OtherVector.x[component] << "." << endl;98 //Log() << Verbose( 2) << "OtherComponents to Neighbour and OtherNeighbour are " << DistanceVector.x[Othercomponent] << " and " << OtherVector.x[Othercomponent] << "." << endl;99 //Log() << Verbose(1) << "Distances to Neighbour and OtherNeighbour are " << DistanceVector.x[component] << " and " << OtherVector.x[component] << "." << endl; 100 //Log() << Verbose(1) << "OtherComponents to Neighbour and OtherNeighbour are " << DistanceVector.x[Othercomponent] << " and " << OtherVector.x[Othercomponent] << "." << endl; 99 101 // do linear interpolation between points (is exact) to extract exact intersection between Neighbour and OtherNeighbour 100 102 w1 = fabs(OtherVector.x[Othercomponent]); … … 103 105 * OtherVector.x[component]) / (w1 + w2)); 104 106 // mark if it has greater diameter 105 //Log() << Verbose( 2) << "Comparing current greatest " << GreatestDiameter[component] << " to new " << tmp << "." << endl;107 //Log() << Verbose(1) << "Comparing current greatest " << GreatestDiameter[component] << " to new " << tmp << "." << endl; 106 108 GreatestDiameter[component] = (GreatestDiameter[component] 107 109 > tmp) ? GreatestDiameter[component] : tmp; 108 110 } //else 109 //Log() << Verbose( 2) << "Saw no sign flip, probably top or bottom node." << endl;111 //Log() << Verbose(1) << "Saw no sign flip, probably top or bottom node." << endl; 110 112 } 111 113 } … … 135 137 Boundaries *GetBoundaryPoints(const molecule *mol, Tesselation *&TesselStruct) 136 138 { 139 Info FunctionInfo(__func__); 137 140 atom *Walker = NULL; 138 141 PointMap PointsOnBoundary; … … 149 152 double angle = 0.; 150 153 151 Log() << Verbose(1) << "Finding all boundary points." << endl;152 154 // 3a. Go through every axis 153 155 for (int axis = 0; axis < NDIM; axis++) { … … 176 178 angle = 0.; // otherwise it's a vector in Axis Direction and unimportant for boundary issues 177 179 178 //Log() << Verbose( 2) << "Checking sign in quadrant : " << ProjectedVector.Projection(&AngleReferenceNormalVector) << "." << endl;180 //Log() << Verbose(1) << "Checking sign in quadrant : " << ProjectedVector.Projection(&AngleReferenceNormalVector) << "." << endl; 179 181 if (ProjectedVector.ScalarProduct(&AngleReferenceNormalVector) > 0) { 180 182 angle = 2. * M_PI - angle; 181 183 } 182 Log() << Verbose( 2) << "Inserting " << *Walker << ": (r, alpha) = (" << radius << "," << angle << "): " << ProjectedVector << endl;184 Log() << Verbose(1) << "Inserting " << *Walker << ": (r, alpha) = (" << radius << "," << angle << "): " << ProjectedVector << endl; 183 185 BoundaryTestPair = BoundaryPoints[axis].insert(BoundariesPair(angle, DistancePair (radius, Walker))); 184 186 if (!BoundaryTestPair.second) { // same point exists, check first r, then distance of original vectors to center of gravity … … 210 212 // printing all inserted for debugging 211 213 // { 212 // Log() << Verbose( 2) << "Printing list of candidates for axis " << axis << " which we have inserted so far." << endl;214 // Log() << Verbose(1) << "Printing list of candidates for axis " << axis << " which we have inserted so far." << endl; 213 215 // int i=0; 214 216 // for(Boundaries::iterator runner = BoundaryPoints[axis].begin(); runner != BoundaryPoints[axis].end(); runner++) { 215 217 // if (runner != BoundaryPoints[axis].begin()) 216 // Log() << Verbose( 2) << ", " << i << ": " << *runner->second.second;218 // Log() << Verbose(0) << ", " << i << ": " << *runner->second.second; 217 219 // else 218 // Log() << Verbose( 2) << i << ": " << *runner->second.second;220 // Log() << Verbose(0) << i << ": " << *runner->second.second; 219 221 // i++; 220 222 // } 221 // Log() << Verbose( 2) << endl;223 // Log() << Verbose(0) << endl; 222 224 // } 223 225 // 3c. throw out points whose distance is less than the mean of left and right neighbours … … 249 251 SideA.SubtractVector(MolCenter); 250 252 SideA.ProjectOntoPlane(&AxisVector); 251 // Log() << Verbose( 0) << "SideA: " << SideA << endl;253 // Log() << Verbose(1) << "SideA: " << SideA << endl; 252 254 253 255 SideB.CopyVector(&right->second.second->x); 254 256 SideB.SubtractVector(MolCenter); 255 257 SideB.ProjectOntoPlane(&AxisVector); 256 // Log() << Verbose( 0) << "SideB: " << SideB << endl;258 // Log() << Verbose(1) << "SideB: " << SideB << endl; 257 259 258 260 SideC.CopyVector(&left->second.second->x); 259 261 SideC.SubtractVector(&right->second.second->x); 260 262 SideC.ProjectOntoPlane(&AxisVector); 261 // Log() << Verbose( 0) << "SideC: " << SideC << endl;263 // Log() << Verbose(1) << "SideC: " << SideC << endl; 262 264 263 265 SideH.CopyVector(&runner->second.second->x); 264 266 SideH.SubtractVector(MolCenter); 265 267 SideH.ProjectOntoPlane(&AxisVector); 266 // Log() << Verbose( 0) << "SideH: " << SideH << endl;268 // Log() << Verbose(1) << "SideH: " << SideH << endl; 267 269 268 270 // calculate each length … … 277 279 const double delta = SideC.Angle(&SideH); 278 280 const double MinDistance = a * sin(beta) / (sin(delta)) * (((alpha < M_PI / 2.) || (gamma < M_PI / 2.)) ? 1. : -1.); 279 //Log() << Verbose( 2) << " I calculated: a = " << a << ", h = " << h << ", beta(" << left->second.second->Name << "," << left->second.second->Name << "-" << right->second.second->Name << ") = " << beta << ", delta(" << left->second.second->Name << "," << runner->second.second->Name << ") = " << delta << ", Min = " << MinDistance << "." << endl;281 //Log() << Verbose(1) << " I calculated: a = " << a << ", h = " << h << ", beta(" << left->second.second->Name << "," << left->second.second->Name << "-" << right->second.second->Name << ") = " << beta << ", delta(" << left->second.second->Name << "," << runner->second.second->Name << ") = " << delta << ", Min = " << MinDistance << "." << endl; 280 282 Log() << Verbose(1) << "Checking CoG distance of runner " << *runner->second.second << " " << h << " against triangle's side length spanned by (" << *left->second.second << "," << *right->second.second << ") of " << MinDistance << "." << endl; 281 283 if ((fabs(h / fabs(h) - MinDistance / fabs(MinDistance)) < MYEPSILON) && ((h - MinDistance)) < -MYEPSILON) { … … 303 305 void FindConvexBorder(const molecule* mol, Tesselation *&TesselStruct, const LinkedCell *LCList, const char *filename) 304 306 { 307 Info FunctionInfo(__func__); 305 308 bool BoundaryFreeFlag = false; 306 309 Boundaries *BoundaryPoints = NULL; 307 308 Log() << Verbose(1) << "Begin of FindConvexBorder" << endl;309 310 310 311 if (TesselStruct != NULL) // free if allocated … … 317 318 BoundaryPoints = GetBoundaryPoints(mol, TesselStruct); 318 319 } else { 319 Log() << Verbose( 1) << "Using given boundary points set." << endl;320 Log() << Verbose(0) << "Using given boundary points set." << endl; 320 321 } 321 322 … … 323 324 for (int axis=0; axis < NDIM; axis++) 324 325 { 325 Log() << Verbose( 2) << "Printing list of candidates for axis " << axis << " which we have inserted so far." << endl;326 Log() << Verbose(1) << "Printing list of candidates for axis " << axis << " which we have inserted so far." << endl; 326 327 int i=0; 327 328 for(Boundaries::iterator runner = BoundaryPoints[axis].begin(); runner != BoundaryPoints[axis].end(); runner++) { 328 329 if (runner != BoundaryPoints[axis].begin()) 329 Log() << Verbose( 2) << ", " << i << ": " << *runner->second.second;330 Log() << Verbose(0) << ", " << i << ": " << *runner->second.second; 330 331 else 331 Log() << Verbose( 2) << i << ": " << *runner->second.second;332 Log() << Verbose(0) << i << ": " << *runner->second.second; 332 333 i++; 333 334 } 334 Log() << Verbose( 2) << endl;335 Log() << Verbose(0) << endl; 335 336 } 336 337 … … 341 342 eLog() << Verbose(2) << "Point " << *(runner->second.second) << " is already present!" << endl; 342 343 343 Log() << Verbose( 2) << "I found " << TesselStruct->PointsOnBoundaryCount << " points on the convex boundary." << endl;344 Log() << Verbose(0) << "I found " << TesselStruct->PointsOnBoundaryCount << " points on the convex boundary." << endl; 344 345 // now we have the whole set of edge points in the BoundaryList 345 346 … … 347 348 // Log() << Verbose(1) << "Listing PointsOnBoundary:"; 348 349 // for(PointMap::iterator runner = PointsOnBoundary.begin(); runner != PointsOnBoundary.end(); runner++) { 349 // Log() << Verbose( 1) << " " << *runner->second;350 // Log() << Verbose(0) << " " << *runner->second; 350 351 // } 351 // Log() << Verbose( 1) << endl;352 // Log() << Verbose(0) << endl; 352 353 353 354 // 3a. guess starting triangle … … 359 360 // 3c. check whether all atoms lay inside the boundary, if not, add to boundary points, segment triangle into three with the new point 360 361 if (!TesselStruct->InsertStraddlingPoints(mol, LCList)) 361 Log() << Verbose(1) << "Insertion of straddling points failed!" << endl;362 363 Log() << Verbose( 2) << "I created " << TesselStruct->TrianglesOnBoundary.size() << " intermediate triangles with " << TesselStruct->LinesOnBoundary.size() << " lines and " << TesselStruct->PointsOnBoundary.size() << " points." << endl;362 eLog() << Verbose(1) << "Insertion of straddling points failed!" << endl; 363 364 Log() << Verbose(0) << "I created " << TesselStruct->TrianglesOnBoundary.size() << " intermediate triangles with " << TesselStruct->LinesOnBoundary.size() << " lines and " << TesselStruct->PointsOnBoundary.size() << " points." << endl; 364 365 365 366 // 4. Store triangles in tecplot file … … 411 412 // Log() << Verbose(1) << "Correction of concave tesselpoints failed!" << endl; 412 413 413 Log() << Verbose( 2) << "I created " << TesselStruct->TrianglesOnBoundary.size() << " triangles with " << TesselStruct->LinesOnBoundary.size() << " lines and " << TesselStruct->PointsOnBoundary.size() << " points." << endl;414 Log() << Verbose(0) << "I created " << TesselStruct->TrianglesOnBoundary.size() << " triangles with " << TesselStruct->LinesOnBoundary.size() << " lines and " << TesselStruct->PointsOnBoundary.size() << " points." << endl; 414 415 415 416 // 4. Store triangles in tecplot file … … 437 438 if (BoundaryFreeFlag) 438 439 delete[] (BoundaryPoints); 439 440 Log() << Verbose(1) << "End of FindConvexBorder" << endl;441 440 }; 442 441 … … 450 449 bool RemoveAllBoundaryPoints(class Tesselation *&TesselStruct, const molecule * const mol, const char * const filename) 451 450 { 451 Info FunctionInfo(__func__); 452 452 int i=0; 453 453 char number[MAXSTRINGSIZE]; … … 460 460 PointMap::iterator PointRunner; 461 461 while (!TesselStruct->PointsOnBoundary.empty()) { 462 Log() << Verbose( 2) << "Remaining points are: ";462 Log() << Verbose(1) << "Remaining points are: "; 463 463 for (PointMap::iterator PointSprinter = TesselStruct->PointsOnBoundary.begin(); PointSprinter != TesselStruct->PointsOnBoundary.end(); PointSprinter++) 464 Log() << Verbose( 2) << *(PointSprinter->second) << "\t";465 Log() << Verbose( 2) << endl;464 Log() << Verbose(0) << *(PointSprinter->second) << "\t"; 465 Log() << Verbose(0) << endl; 466 466 467 467 PointRunner = TesselStruct->PointsOnBoundary.begin(); … … 503 503 double ConvexizeNonconvexEnvelope(class Tesselation *&TesselStruct, const molecule * const mol, const char * const filename) 504 504 { 505 Info FunctionInfo(__func__); 505 506 double volume = 0; 506 507 class BoundaryPointSet *point = NULL; … … 516 517 int run = 0; 517 518 518 Log() << Verbose(0) << "Begin of ConvexizeNonconvexEnvelope" << endl;519 520 519 // check whether there is something to work on 521 520 if (TesselStruct == NULL) { … … 539 538 for (LineMap::iterator LineRunner = point->lines.begin(); LineRunner != point->lines.end(); LineRunner++) { 540 539 line = LineRunner->second; 541 Log() << Verbose( 2) << "INFO: Current line of point " << *point << " is " << *line << "." << endl;540 Log() << Verbose(1) << "INFO: Current line of point " << *point << " is " << *line << "." << endl; 542 541 if (!line->CheckConvexityCriterion()) { 543 542 // remove the point if needed … … 604 603 605 604 // end 606 Log() << Verbose(1) << "Volume is " << volume << "." << endl; 607 Log() << Verbose(0) << "End of ConvexizeNonconvexEnvelope" << endl; 605 Log() << Verbose(0) << "Volume is " << volume << "." << endl; 608 606 return volume; 609 607 }; … … 619 617 double VolumeOfConvexEnvelope(class Tesselation *TesselStruct, class config *configuration) 620 618 { 619 Info FunctionInfo(__func__); 621 620 bool IsAngstroem = configuration->GetIsAngstroem(); 622 621 double volume = 0.; … … 625 624 626 625 // 6a. Every triangle forms a pyramid with the center of gravity as its peak, sum up the volumes 627 Log() << Verbose(1)628 << "Calculating the volume of the pyramids formed out of triangles and center of gravity."629 << endl;630 626 for (TriangleMap::iterator runner = TesselStruct->TrianglesOnBoundary.begin(); runner != TesselStruct->TrianglesOnBoundary.end(); runner++) 631 627 { // go through every triangle, calculate volume of its pyramid with CoG as peak … … 642 638 const double h = x.Norm(); // distance of CoG to triangle 643 639 const double PyramidVolume = (1. / 3.) * G * h; // this formula holds for _all_ pyramids (independent of n-edge base or (not) centered peak) 644 Log() << Verbose( 2) << "Area of triangle is " << setprecision(10) << G << " "640 Log() << Verbose(1) << "Area of triangle is " << setprecision(10) << G << " " 645 641 << (IsAngstroem ? "angstrom" : "atomiclength") << "^2, height is " 646 642 << h << " and the volume is " << PyramidVolume << " " … … 658 654 * \param *out output stream for debugging 659 655 * \param *mol molecule with atoms and bonds 660 * \param * &TesselStruct Tesselation with boundary triangles656 * \param *TesselStruct Tesselation with boundary triangles 661 657 * \param *filename prefix of filename 662 658 * \param *extraSuffix intermediate suffix 663 659 */ 664 void StoreTrianglesinFile(const molecule * const mol, const Tesselation * &TesselStruct, const char *filename, const char *extraSuffix)660 void StoreTrianglesinFile(const molecule * const mol, const Tesselation * const TesselStruct, const char *filename, const char *extraSuffix) 665 661 { 662 Info FunctionInfo(__func__); 666 663 // 4. Store triangles in tecplot file 667 664 if (filename != NULL) { … … 671 668 OutputName.append(TecplotSuffix); 672 669 ofstream *tecplot = new ofstream(OutputName.c_str()); 673 WriteTecplotFile(tecplot, TesselStruct, mol, 0);670 WriteTecplotFile(tecplot, TesselStruct, mol, -1); 674 671 tecplot->close(); 675 672 delete(tecplot); … … 698 695 void PrepareClustersinWater(config *configuration, molecule *mol, double ClusterVolume, double celldensity) 699 696 { 697 Info FunctionInfo(__func__); 700 698 bool IsAngstroem = true; 701 699 double *GreatestDiameter = NULL; … … 791 789 * \param configuration contains box dimensions 792 790 * \param distance[NDIM] distance between filling molecules in each direction 791 * \param boundary length of boundary zone between molecule and filling mollecules 792 * \param epsilon distance to surface which is not filled 793 793 * \param RandAtomDisplacement maximum distance for random displacement per atom 794 794 * \param RandMolDisplacement maximum distance for random displacement per filler molecule … … 796 796 * \return *mol pointer to new molecule with filled atoms 797 797 */ 798 molecule * FillBoxWithMolecule(MoleculeListClass *List, molecule *filler, config &configuration, double distance[NDIM], double RandomAtomDisplacement, double RandomMolDisplacement,bool DoRandomRotation)798 molecule * FillBoxWithMolecule(MoleculeListClass *List, molecule *filler, config &configuration, const double distance[NDIM], const double boundary, const double RandomAtomDisplacement, const double RandomMolDisplacement, const bool DoRandomRotation) 799 799 { 800 Info FunctionInfo(__func__); 800 801 molecule *Filling = new molecule(filler->elemente); 801 802 Vector CurrentPosition; … … 815 816 class Tesselation *TesselStruct[List->ListOfMolecules.size()]; 816 817 817 Log() << Verbose(0) << "Begin of FillBoxWithMolecule" << endl;818 819 818 i=0; 820 819 for (MoleculeList::iterator ListRunner = List->ListOfMolecules.begin(); ListRunner != List->ListOfMolecules.end(); ListRunner++) { 821 820 Log() << Verbose(1) << "Pre-creating linked cell lists for molecule " << *ListRunner << "." << endl; 822 LCList[i] = new LinkedCell((*ListRunner), 5.); // get linked cell list 823 if (TesselStruct[i] == NULL) { 824 Log() << Verbose(1) << "Pre-creating tesselation for molecule " << *ListRunner << "." << endl; 825 FindNonConvexBorder((*ListRunner), TesselStruct[i], (const LinkedCell *&)LCList[i], 5., NULL); 826 } 821 LCList[i] = new LinkedCell((*ListRunner), 10.); // get linked cell list 822 Log() << Verbose(1) << "Pre-creating tesselation for molecule " << *ListRunner << "." << endl; 823 TesselStruct[i] = NULL; 824 FindNonConvexBorder((*ListRunner), TesselStruct[i], (const LinkedCell *&)LCList[i], 5., NULL); 827 825 i++; 828 826 } … … 838 836 FillerDistance.Init(distance[0], distance[1], distance[2]); 839 837 FillerDistance.InverseMatrixMultiplication(M); 840 Log() << Verbose(1) << "INFO: Grid steps are "; 841 for(int i=0;i<NDIM;i++) { 838 for(int i=0;i<NDIM;i++) 842 839 N[i] = (int) ceil(1./FillerDistance.x[i]); 843 Log() << Verbose(1) << N[i]; 844 if (i != NDIM-1) 845 Log() << Verbose(1)<< ", "; 846 else 847 Log() << Verbose(1) << "." << endl; 848 } 840 Log() << Verbose(1) << "INFO: Grid steps are " << N[0] << ", " << N[1] << ", " << N[2] << "." << endl; 849 841 850 842 // go over [0,1]^3 filler grid … … 862 854 // get linked cell list 863 855 if (TesselStruct[i] == NULL) { 864 eLog() << Verbose( 1) << "TesselStruct of " << (*ListRunner) << " is NULL. Didn't we pre-create it?" << endl;856 eLog() << Verbose(0) << "TesselStruct of " << (*ListRunner) << " is NULL. Didn't we pre-create it?" << endl; 865 857 FillIt = false; 866 858 } else { 867 FillIt = FillIt && (!TesselStruct[i]->IsInnerPoint(CurrentPosition, LCList[i])); 859 const double distance = (TesselStruct[i]->GetDistanceSquaredToSurface(CurrentPosition, LCList[i])); 860 FillIt = FillIt && (distance > boundary*boundary); 861 if (FillIt) { 862 Log() << Verbose(1) << "INFO: Position at " << CurrentPosition << " is outer point." << endl; 863 } else { 864 Log() << Verbose(1) << "INFO: Position at " << CurrentPosition << " is inner point or within boundary." << endl; 865 break; 866 } 868 867 i++; 869 868 } … … 877 876 for (int i=0;i<NDIM;i++) 878 877 FillerTranslations.x[i] = RandomMolDisplacement*(rand()/(RAND_MAX/2.) - 1.); 879 Log() << Verbose( 3) << "INFO: Translating this filler by " << FillerTranslations << "." << endl;878 Log() << Verbose(2) << "INFO: Translating this filler by " << FillerTranslations << "." << endl; 880 879 881 880 // go through all atoms … … 934 933 } 935 934 Free(&M); 935 936 // output to file 937 TesselStruct[0]->LastTriangle = NULL; 938 StoreTrianglesinFile(Filling, TesselStruct[0], "Tesselated", ".dat"); 939 936 940 for (size_t i=0;i<List->ListOfMolecules.size();i++) { 937 941 delete(LCList[i]); 938 942 delete(TesselStruct[i]); 939 943 } 940 Log() << Verbose(0) << "End of FillBoxWithMolecule" << endl;941 942 944 return Filling; 943 945 }; … … 951 953 * \param RADIUS radius of the virtual sphere 952 954 * \param *filename filename prefix for output of vertex data 953 */ 954 void FindNonConvexBorder(const molecule* const mol, Tesselation *&TesselStruct, const LinkedCell *&LCList, const double RADIUS, const char *filename = NULL) 955 * \return true - tesselation successful, false - tesselation failed 956 */ 957 bool FindNonConvexBorder(const molecule* const mol, Tesselation *&TesselStruct, const LinkedCell *&LCList, const double RADIUS, const char *filename = NULL) 955 958 { 959 Info FunctionInfo(__func__); 956 960 bool freeLC = false; 957 LineMap::iterator baseline; 961 bool status = false; 962 CandidateForTesselation *baseline; 958 963 LineMap::iterator testline; 959 bool OneLoopWithoutSuccessFlag = false; // marks whether we went once through all baselines without finding any without two triangles964 bool OneLoopWithoutSuccessFlag = true; // marks whether we went once through all baselines without finding any without two triangles 960 965 bool TesselationFailFlag = false; 961 962 Log() << Verbose(1) << "Entering search for non convex hull. " << endl; 966 BoundaryTriangleSet *T = NULL; 967 963 968 if (TesselStruct == NULL) { 964 969 Log() << Verbose(1) << "Allocating Tesselation struct ..." << endl; … … 970 975 } 971 976 972 Log() << Verbose(0) << "Begin of FindNonConvexBorder\n";973 974 977 // initialise Linked Cell 975 978 if (LCList == NULL) { … … 982 985 983 986 // 2. expand from there 984 baseline = TesselStruct->LinesOnBoundary.begin(); 985 baseline++; // skip first line 986 while ((baseline != TesselStruct->LinesOnBoundary.end()) || (OneLoopWithoutSuccessFlag)) { 987 if (baseline->second->triangles.size() == 1) { 988 CheckListOfBaselines(TesselStruct); 989 // 3. find next triangle 990 TesselationFailFlag = TesselStruct->FindNextSuitableTriangle(*(baseline->second), *(((baseline->second->triangles.begin()))->second), RADIUS, LCList); //the line is there, so there is a triangle, but only one. 991 OneLoopWithoutSuccessFlag = OneLoopWithoutSuccessFlag || TesselationFailFlag; 992 if (!TesselationFailFlag) 993 eLog() << Verbose(2) << "FindNextSuitableTriangle failed." << endl; 994 995 // write temporary envelope 996 if (filename != NULL) { 997 if ((DoSingleStepOutput && ((TesselStruct->TrianglesOnBoundary.size() % SingleStepWidth == 0)))) { // if we have a new triangle and want to output each new triangle configuration 998 TesselStruct->Output(filename, mol); 999 } 987 while ((!TesselStruct->OpenLines.empty()) && (OneLoopWithoutSuccessFlag)) { 988 // 2a. fill all new OpenLines 989 Log() << Verbose(1) << "There are " << TesselStruct->OpenLines.size() << " open lines to scan for candidates:" << endl; 990 for (CandidateMap::iterator Runner = TesselStruct->OpenLines.begin(); Runner != TesselStruct->OpenLines.end(); Runner++) 991 Log() << Verbose(2) << *(Runner->second) << endl; 992 993 for (CandidateMap::iterator Runner = TesselStruct->OpenLines.begin(); Runner != TesselStruct->OpenLines.end(); Runner++) { 994 baseline = Runner->second; 995 if (baseline->pointlist.empty()) { 996 T = (((baseline->BaseLine->triangles.begin()))->second); 997 Log() << Verbose(1) << "Finding best candidate for open line " << *baseline->BaseLine << " of triangle " << *T << endl; 998 TesselationFailFlag = TesselStruct->FindNextSuitableTriangle(*baseline, *T, RADIUS, LCList); //the line is there, so there is a triangle, but only one. 1000 999 } 1001 if (TesselationFailFlag) { 1002 baseline = TesselStruct->LinesOnBoundary.begin(); 1003 OneLoopWithoutSuccessFlag = false; 1004 Log() << Verbose(2) << "Baseline set to begin." << endl; 1000 } 1001 1002 // 2b. search for smallest ShortestAngle among all candidates 1003 double ShortestAngle = 4.*M_PI; 1004 Log() << Verbose(1) << "There are " << TesselStruct->OpenLines.size() << " open lines to scan for the best candidates:" << endl; 1005 for (CandidateMap::iterator Runner = TesselStruct->OpenLines.begin(); Runner != TesselStruct->OpenLines.end(); Runner++) 1006 Log() << Verbose(2) << *(Runner->second) << endl; 1007 1008 for (CandidateMap::iterator Runner = TesselStruct->OpenLines.begin(); Runner != TesselStruct->OpenLines.end(); Runner++) { 1009 if (Runner->second->ShortestAngle < ShortestAngle) { 1010 baseline = Runner->second; 1011 ShortestAngle = baseline->ShortestAngle; 1012 //Log() << Verbose(1) << "New best candidate is " << *baseline->BaseLine << " with point " << *baseline->point << " and angle " << baseline->ShortestAngle << endl; 1005 1013 } 1006 } else { 1007 //Log() << Verbose(1) << "Line " << *baseline->second << " has " << baseline->second->triangles.size() << " triangles adjacent" << endl; 1008 if (baseline->second->triangles.size() != 2) { 1009 eLog() << Verbose(0) << "TESSELATION FINISHED WITH INVALID TRIANGLE COUNT!" << endl; 1010 performCriticalExit(); 1014 } 1015 if ((ShortestAngle == 4.*M_PI) || (baseline->pointlist.empty())) 1016 OneLoopWithoutSuccessFlag = false; 1017 else { 1018 TesselStruct->AddCandidateTriangle(*baseline); 1019 } 1020 1021 // write temporary envelope 1022 if (filename != NULL) { 1023 if ((DoSingleStepOutput && ((TesselStruct->TrianglesOnBoundary.size() % SingleStepWidth == 0)))) { // if we have a new triangle and want to output each new triangle configuration 1024 TesselStruct->Output(filename, mol); 1011 1025 } 1012 1026 } 1013 1014 if ((baseline == TesselStruct->LinesOnBoundary.end()) && (OneLoopWithoutSuccessFlag)) { 1015 baseline = TesselStruct->LinesOnBoundary.begin(); // restart if we reach end due to newly inserted lines 1016 OneLoopWithoutSuccessFlag = false; 1017 } 1018 baseline++; 1019 } 1020 // check envelope for consistency 1021 CheckListOfBaselines(TesselStruct); 1022 1023 // look whether all points are inside of the convex envelope, otherwise add them via degenerated triangles 1024 //->InsertStraddlingPoints(mol, LCList); 1027 } 1028 // // check envelope for consistency 1029 // status = CheckListOfBaselines(TesselStruct); 1030 // 1031 // // look whether all points are inside of the convex envelope, otherwise add them via degenerated triangles 1032 // //->InsertStraddlingPoints(mol, LCList); 1025 1033 // mol->GoToFirst(); 1026 1034 // class TesselPoint *Runner = NULL; … … 1037 1045 // } 1038 1046 1039 // Purges surplus triangles.1040 TesselStruct->RemoveDegeneratedTriangles();1047 // // Purges surplus triangles. 1048 // TesselStruct->RemoveDegeneratedTriangles(); 1041 1049 1042 1050 // check envelope for consistency 1043 CheckListOfBaselines(TesselStruct); 1051 status = CheckListOfBaselines(TesselStruct); 1052 1053 // store before correction 1054 StoreTrianglesinFile(mol, (const Tesselation *&)TesselStruct, filename, ""); 1055 1056 // correct degenerated polygons 1057 TesselStruct->CorrectAllDegeneratedPolygons(); 1058 1059 // check envelope for consistency 1060 status = CheckListOfBaselines(TesselStruct); 1044 1061 1045 1062 // write final envelope … … 1049 1066 if (freeLC) 1050 1067 delete(LCList); 1051 Log() << Verbose(0) << "End of FindNonConvexBorder\n"; 1068 1069 return status; 1052 1070 }; 1053 1071 … … 1061 1079 Vector* FindEmbeddingHole(MoleculeListClass *mols, molecule *srcmol) 1062 1080 { 1081 Info FunctionInfo(__func__); 1063 1082 Vector *Center = new Vector; 1064 1083 Center->Zero(); -
TabularUnified src/boundary.hpp ¶
r9fe36b rb8d1aeb 35 35 36 36 #define DEBUG 1 37 #define DoSingleStepOutput 138 #define SingleStepWidth 1 37 #define DoSingleStepOutput 0 38 #define SingleStepWidth 10 39 39 40 40 #define DistancePair pair < double, atom* > … … 49 49 50 50 double ConvexizeNonconvexEnvelope(class Tesselation *&TesselStruct, const molecule * const mol, const char * const filename); 51 molecule * FillBoxWithMolecule(MoleculeListClass *List, molecule *filler, config &configuration, double distance[NDIM], double RandAtomDisplacement, double RandMolDisplacement,bool DoRandomRotation);51 molecule * FillBoxWithMolecule(MoleculeListClass *List, molecule *filler, config &configuration, const double distance[NDIM], const double boundary, const double RandomAtomDisplacement, const double RandomMolDisplacement, const bool DoRandomRotation); 52 52 void FindConvexBorder(const molecule* const mol, Tesselation *&TesselStruct, const LinkedCell *LCList, const char *filename); 53 53 Vector* FindEmbeddingHole(MoleculeListClass *mols, molecule *srcmol); 54 54 void FindNextSuitablePoint(class BoundaryTriangleSet *BaseTriangle, class BoundaryLineSet *BaseLine, atom*& OptCandidate, Vector *OptCandidateCenter, double *ShortestAngle, const double RADIUS, LinkedCell *LC); 55 voidFindNonConvexBorder(const molecule* const mol, Tesselation *&TesselStruct, const LinkedCell *&LC, const double RADIUS, const char *tempbasename);55 bool FindNonConvexBorder(const molecule* const mol, Tesselation *&TesselStruct, const LinkedCell *&LC, const double RADIUS, const char *tempbasename); 56 56 Boundaries *GetBoundaryPoints(const molecule *mol, Tesselation *&TesselStruct); 57 57 double * GetDiametersOfCluster(const Boundaries *BoundaryPtr, const molecule *mol, Tesselation *&TesselStruct, const bool IsAngstroem); 58 58 void PrepareClustersinWater(config *configuration, molecule *mol, double ClusterVolume, double celldensity); 59 59 bool RemoveAllBoundaryPoints(class Tesselation *&TesselStruct, const molecule * const mol, const char * const filename); 60 void StoreTrianglesinFile(const molecule * const mol, const Tesselation * &TesselStruct, const char *filename, const char *extraSuffix);60 void StoreTrianglesinFile(const molecule * const mol, const Tesselation * const TesselStruct, const char *filename, const char *extraSuffix); 61 61 double VolumeOfConvexEnvelope(class Tesselation *TesselStruct, class config *configuration); 62 62 -
TabularUnified src/builder.cpp ¶
r9fe36b rb8d1aeb 52 52 using namespace std; 53 53 54 #include <cstring> 55 54 56 #include "analysis_correlation.hpp" 55 57 #include "atom.hpp" … … 74 76 #include "Actions/MethodAction.hpp" 75 77 #include "Actions/small_actions.hpp" 76 78 #include "version.h" 79 80 /********************************************* Subsubmenu routine ************************************/ 81 #if 0 82 /** Submenu for adding atoms to the molecule. 83 * \param *periode periodentafel 84 * \param *molecule molecules with atoms 85 */ 86 static void AddAtoms(periodentafel *periode, molecule *mol) 87 { 88 atom *first, *second, *third, *fourth; 89 Vector **atoms; 90 Vector x,y,z,n; // coordinates for absolute point in cell volume 91 double a,b,c; 92 char choice; // menu choice char 93 bool valid; 94 95 Log() << Verbose(0) << "===========ADD ATOM============================" << endl; 96 Log() << Verbose(0) << " a - state absolute coordinates of atom" << endl; 97 Log() << Verbose(0) << " b - state relative coordinates of atom wrt to reference point" << endl; 98 Log() << Verbose(0) << " c - state relative coordinates of atom wrt to already placed atom" << endl; 99 Log() << Verbose(0) << " d - state two atoms, two angles and a distance" << endl; 100 Log() << Verbose(0) << " e - least square distance position to a set of atoms" << endl; 101 Log() << Verbose(0) << "all else - go back" << endl; 102 Log() << Verbose(0) << "===============================================" << endl; 103 Log() << Verbose(0) << "Note: Specifiy angles in degrees not multiples of Pi!" << endl; 104 Log() << Verbose(0) << "INPUT: "; 105 cin >> choice; 106 107 switch (choice) { 108 default: 109 eLog() << Verbose(2) << "Not a valid choice." << endl; 110 break; 111 case 'a': // absolute coordinates of atom 112 Log() << Verbose(0) << "Enter absolute coordinates." << endl; 113 first = new atom; 114 first->x.AskPosition(mol->cell_size, false); 115 first->type = periode->AskElement(); // give type 116 mol->AddAtom(first); // add to molecule 117 break; 118 119 case 'b': // relative coordinates of atom wrt to reference point 120 first = new atom; 121 valid = true; 122 do { 123 if (!valid) eLog() << Verbose(2) << "Resulting position out of cell." << endl; 124 Log() << Verbose(0) << "Enter reference coordinates." << endl; 125 x.AskPosition(mol->cell_size, true); 126 Log() << Verbose(0) << "Enter relative coordinates." << endl; 127 first->x.AskPosition(mol->cell_size, false); 128 first->x.AddVector((const Vector *)&x); 129 Log() << Verbose(0) << "\n"; 130 } while (!(valid = mol->CheckBounds((const Vector *)&first->x))); 131 first->type = periode->AskElement(); // give type 132 mol->AddAtom(first); // add to molecule 133 break; 134 135 case 'c': // relative coordinates of atom wrt to already placed atom 136 first = new atom; 137 valid = true; 138 do { 139 if (!valid) eLog() << Verbose(2) << "Resulting position out of cell." << endl; 140 second = mol->AskAtom("Enter atom number: "); 141 Log() << Verbose(0) << "Enter relative coordinates." << endl; 142 first->x.AskPosition(mol->cell_size, false); 143 for (int i=NDIM;i--;) { 144 first->x.x[i] += second->x.x[i]; 145 } 146 } while (!(valid = mol->CheckBounds((const Vector *)&first->x))); 147 first->type = periode->AskElement(); // give type 148 mol->AddAtom(first); // add to molecule 149 break; 150 151 case 'd': // two atoms, two angles and a distance 152 first = new atom; 153 valid = true; 154 do { 155 if (!valid) { 156 eLog() << Verbose(2) << "Resulting coordinates out of cell - " << first->x << endl; 157 } 158 Log() << Verbose(0) << "First, we need two atoms, the first atom is the central, while the second is the outer one." << endl; 159 second = mol->AskAtom("Enter central atom: "); 160 third = mol->AskAtom("Enter second atom (specifying the axis for first angle): "); 161 fourth = mol->AskAtom("Enter third atom (specifying a plane for second angle): "); 162 a = ask_value("Enter distance between central (first) and new atom: "); 163 b = ask_value("Enter angle between new, first and second atom (degrees): "); 164 b *= M_PI/180.; 165 bound(&b, 0., 2.*M_PI); 166 c = ask_value("Enter second angle between new and normal vector of plane defined by first, second and third atom (degrees): "); 167 c *= M_PI/180.; 168 bound(&c, -M_PI, M_PI); 169 Log() << Verbose(0) << "radius: " << a << "\t phi: " << b*180./M_PI << "\t theta: " << c*180./M_PI << endl; 170 /* 171 second->Output(1,1,(ofstream *)&cout); 172 third->Output(1,2,(ofstream *)&cout); 173 fourth->Output(1,3,(ofstream *)&cout); 174 n.MakeNormalvector((const vector *)&second->x, (const vector *)&third->x, (const vector *)&fourth->x); 175 x.Copyvector(&second->x); 176 x.SubtractVector(&third->x); 177 x.Copyvector(&fourth->x); 178 x.SubtractVector(&third->x); 179 180 if (!z.SolveSystem(&x,&y,&n, b, c, a)) { 181 Log() << Verbose(0) << "Failure solving self-dependent linear system!" << endl; 182 continue; 183 } 184 Log() << Verbose(0) << "resulting relative coordinates: "; 185 z.Output(); 186 Log() << Verbose(0) << endl; 187 */ 188 // calc axis vector 189 x.CopyVector(&second->x); 190 x.SubtractVector(&third->x); 191 x.Normalize(); 192 Log() << Verbose(0) << "x: ", 193 x.Output(); 194 Log() << Verbose(0) << endl; 195 z.MakeNormalVector(&second->x,&third->x,&fourth->x); 196 Log() << Verbose(0) << "z: ", 197 z.Output(); 198 Log() << Verbose(0) << endl; 199 y.MakeNormalVector(&x,&z); 200 Log() << Verbose(0) << "y: ", 201 y.Output(); 202 Log() << Verbose(0) << endl; 203 204 // rotate vector around first angle 205 first->x.CopyVector(&x); 206 first->x.RotateVector(&z,b - M_PI); 207 Log() << Verbose(0) << "Rotated vector: ", 208 first->x.Output(); 209 Log() << Verbose(0) << endl; 210 // remove the projection onto the rotation plane of the second angle 211 n.CopyVector(&y); 212 n.Scale(first->x.ScalarProduct(&y)); 213 Log() << Verbose(0) << "N1: ", 214 n.Output(); 215 Log() << Verbose(0) << endl; 216 first->x.SubtractVector(&n); 217 Log() << Verbose(0) << "Subtracted vector: ", 218 first->x.Output(); 219 Log() << Verbose(0) << endl; 220 n.CopyVector(&z); 221 n.Scale(first->x.ScalarProduct(&z)); 222 Log() << Verbose(0) << "N2: ", 223 n.Output(); 224 Log() << Verbose(0) << endl; 225 first->x.SubtractVector(&n); 226 Log() << Verbose(0) << "2nd subtracted vector: ", 227 first->x.Output(); 228 Log() << Verbose(0) << endl; 229 230 // rotate another vector around second angle 231 n.CopyVector(&y); 232 n.RotateVector(&x,c - M_PI); 233 Log() << Verbose(0) << "2nd Rotated vector: ", 234 n.Output(); 235 Log() << Verbose(0) << endl; 236 237 // add the two linear independent vectors 238 first->x.AddVector(&n); 239 first->x.Normalize(); 240 first->x.Scale(a); 241 first->x.AddVector(&second->x); 242 243 Log() << Verbose(0) << "resulting coordinates: "; 244 first->x.Output(); 245 Log() << Verbose(0) << endl; 246 } while (!(valid = mol->CheckBounds((const Vector *)&first->x))); 247 first->type = periode->AskElement(); // give type 248 mol->AddAtom(first); // add to molecule 249 break; 250 251 case 'e': // least square distance position to a set of atoms 252 first = new atom; 253 atoms = new (Vector*[128]); 254 valid = true; 255 for(int i=128;i--;) 256 atoms[i] = NULL; 257 int i=0, j=0; 258 Log() << Verbose(0) << "Now we need at least three molecules.\n"; 259 do { 260 Log() << Verbose(0) << "Enter " << i+1 << "th atom: "; 261 cin >> j; 262 if (j != -1) { 263 second = mol->FindAtom(j); 264 atoms[i++] = &(second->x); 265 } 266 } while ((j != -1) && (i<128)); 267 if (i >= 2) { 268 first->x.LSQdistance((const Vector **)atoms, i); 269 270 first->x.Output(); 271 first->type = periode->AskElement(); // give type 272 mol->AddAtom(first); // add to molecule 273 } else { 274 delete first; 275 Log() << Verbose(0) << "Please enter at least two vectors!\n"; 276 } 277 break; 278 }; 279 }; 280 281 /** Submenu for centering the atoms in the molecule. 282 * \param *mol molecule with all the atoms 283 */ 284 static void CenterAtoms(molecule *mol) 285 { 286 Vector x, y, helper; 287 char choice; // menu choice char 288 289 Log() << Verbose(0) << "===========CENTER ATOMS=========================" << endl; 290 Log() << Verbose(0) << " a - on origin" << endl; 291 Log() << Verbose(0) << " b - on center of gravity" << endl; 292 Log() << Verbose(0) << " c - within box with additional boundary" << endl; 293 Log() << Verbose(0) << " d - within given simulation box" << endl; 294 Log() << Verbose(0) << "all else - go back" << endl; 295 Log() << Verbose(0) << "===============================================" << endl; 296 Log() << Verbose(0) << "INPUT: "; 297 cin >> choice; 298 299 switch (choice) { 300 default: 301 Log() << Verbose(0) << "Not a valid choice." << endl; 302 break; 303 case 'a': 304 Log() << Verbose(0) << "Centering atoms in config file on origin." << endl; 305 mol->CenterOrigin(); 306 break; 307 case 'b': 308 Log() << Verbose(0) << "Centering atoms in config file on center of gravity." << endl; 309 mol->CenterPeriodic(); 310 break; 311 case 'c': 312 Log() << Verbose(0) << "Centering atoms in config file within given additional boundary." << endl; 313 for (int i=0;i<NDIM;i++) { 314 Log() << Verbose(0) << "Enter axis " << i << " boundary: "; 315 cin >> y.x[i]; 316 } 317 mol->CenterEdge(&x); // make every coordinate positive 318 mol->Center.AddVector(&y); // translate by boundary 319 helper.CopyVector(&y); 320 helper.Scale(2.); 321 helper.AddVector(&x); 322 mol->SetBoxDimension(&helper); // update Box of atoms by boundary 323 break; 324 case 'd': 325 Log() << Verbose(1) << "Centering atoms in config file within given simulation box." << endl; 326 for (int i=0;i<NDIM;i++) { 327 Log() << Verbose(0) << "Enter axis " << i << " boundary: "; 328 cin >> x.x[i]; 329 } 330 // update Box of atoms by boundary 331 mol->SetBoxDimension(&x); 332 // center 333 mol->CenterInBox(); 334 break; 335 } 336 }; 337 338 /** Submenu for aligning the atoms in the molecule. 339 * \param *periode periodentafel 340 * \param *mol molecule with all the atoms 341 */ 342 static void AlignAtoms(periodentafel *periode, molecule *mol) 343 { 344 atom *first, *second, *third; 345 Vector x,n; 346 char choice; // menu choice char 347 348 Log() << Verbose(0) << "===========ALIGN ATOMS=========================" << endl; 349 Log() << Verbose(0) << " a - state three atoms defining align plane" << endl; 350 Log() << Verbose(0) << " b - state alignment vector" << endl; 351 Log() << Verbose(0) << " c - state two atoms in alignment direction" << endl; 352 Log() << Verbose(0) << " d - align automatically by least square fit" << endl; 353 Log() << Verbose(0) << "all else - go back" << endl; 354 Log() << Verbose(0) << "===============================================" << endl; 355 Log() << Verbose(0) << "INPUT: "; 356 cin >> choice; 357 358 switch (choice) { 359 default: 360 case 'a': // three atoms defining mirror plane 361 first = mol->AskAtom("Enter first atom: "); 362 second = mol->AskAtom("Enter second atom: "); 363 third = mol->AskAtom("Enter third atom: "); 364 365 n.MakeNormalVector((const Vector *)&first->x,(const Vector *)&second->x,(const Vector *)&third->x); 366 break; 367 case 'b': // normal vector of mirror plane 368 Log() << Verbose(0) << "Enter normal vector of mirror plane." << endl; 369 n.AskPosition(mol->cell_size,0); 370 n.Normalize(); 371 break; 372 case 'c': // three atoms defining mirror plane 373 first = mol->AskAtom("Enter first atom: "); 374 second = mol->AskAtom("Enter second atom: "); 375 376 n.CopyVector((const Vector *)&first->x); 377 n.SubtractVector((const Vector *)&second->x); 378 n.Normalize(); 379 break; 380 case 'd': 381 char shorthand[4]; 382 Vector a; 383 struct lsq_params param; 384 do { 385 fprintf(stdout, "Enter the element of atoms to be chosen: "); 386 fscanf(stdin, "%3s", shorthand); 387 } while ((param.type = periode->FindElement(shorthand)) == NULL); 388 Log() << Verbose(0) << "Element is " << param.type->name << endl; 389 mol->GetAlignvector(¶m); 390 for (int i=NDIM;i--;) { 391 x.x[i] = gsl_vector_get(param.x,i); 392 n.x[i] = gsl_vector_get(param.x,i+NDIM); 393 } 394 gsl_vector_free(param.x); 395 Log() << Verbose(0) << "Offset vector: "; 396 x.Output(); 397 Log() << Verbose(0) << endl; 398 n.Normalize(); 399 break; 400 }; 401 Log() << Verbose(0) << "Alignment vector: "; 402 n.Output(); 403 Log() << Verbose(0) << endl; 404 mol->Align(&n); 405 }; 406 407 /** Submenu for mirroring the atoms in the molecule. 408 * \param *mol molecule with all the atoms 409 */ 410 static void MirrorAtoms(molecule *mol) 411 { 412 atom *first, *second, *third; 413 Vector n; 414 char choice; // menu choice char 415 416 Log() << Verbose(0) << "===========MIRROR ATOMS=========================" << endl; 417 Log() << Verbose(0) << " a - state three atoms defining mirror plane" << endl; 418 Log() << Verbose(0) << " b - state normal vector of mirror plane" << endl; 419 Log() << Verbose(0) << " c - state two atoms in normal direction" << endl; 420 Log() << Verbose(0) << "all else - go back" << endl; 421 Log() << Verbose(0) << "===============================================" << endl; 422 Log() << Verbose(0) << "INPUT: "; 423 cin >> choice; 424 425 switch (choice) { 426 default: 427 case 'a': // three atoms defining mirror plane 428 first = mol->AskAtom("Enter first atom: "); 429 second = mol->AskAtom("Enter second atom: "); 430 third = mol->AskAtom("Enter third atom: "); 431 432 n.MakeNormalVector((const Vector *)&first->x,(const Vector *)&second->x,(const Vector *)&third->x); 433 break; 434 case 'b': // normal vector of mirror plane 435 Log() << Verbose(0) << "Enter normal vector of mirror plane." << endl; 436 n.AskPosition(mol->cell_size,0); 437 n.Normalize(); 438 break; 439 case 'c': // three atoms defining mirror plane 440 first = mol->AskAtom("Enter first atom: "); 441 second = mol->AskAtom("Enter second atom: "); 442 443 n.CopyVector((const Vector *)&first->x); 444 n.SubtractVector((const Vector *)&second->x); 445 n.Normalize(); 446 break; 447 }; 448 Log() << Verbose(0) << "Normal vector: "; 449 n.Output(); 450 Log() << Verbose(0) << endl; 451 mol->Mirror((const Vector *)&n); 452 }; 453 >>>>>>> MenuRefactoring:molecuilder/src/builder.cpp 454 455 /** Submenu for removing the atoms from the molecule. 456 * \param *mol molecule with all the atoms 457 */ 458 static void RemoveAtoms(molecule *mol) 459 { 460 atom *first, *second; 461 int axis; 462 double tmp1, tmp2; 463 char choice; // menu choice char 464 465 Log() << Verbose(0) << "===========REMOVE ATOMS=========================" << endl; 466 Log() << Verbose(0) << " a - state atom for removal by number" << endl; 467 Log() << Verbose(0) << " b - keep only in radius around atom" << endl; 468 Log() << Verbose(0) << " c - remove this with one axis greater value" << endl; 469 Log() << Verbose(0) << "all else - go back" << endl; 470 Log() << Verbose(0) << "===============================================" << endl; 471 Log() << Verbose(0) << "INPUT: "; 472 cin >> choice; 473 474 switch (choice) { 475 default: 476 case 'a': 477 if (mol->RemoveAtom(mol->AskAtom("Enter number of atom within molecule: "))) 478 Log() << Verbose(1) << "Atom removed." << endl; 479 else 480 Log() << Verbose(1) << "Atom not found." << endl; 481 break; 482 case 'b': 483 second = mol->AskAtom("Enter number of atom as reference point: "); 484 Log() << Verbose(0) << "Enter radius: "; 485 cin >> tmp1; 486 first = mol->start; 487 second = first->next; 488 while(second != mol->end) { 489 first = second; 490 second = first->next; 491 if (first->x.DistanceSquared((const Vector *)&second->x) > tmp1*tmp1) // distance to first above radius ... 492 mol->RemoveAtom(first); 493 } 494 break; 495 case 'c': 496 Log() << Verbose(0) << "Which axis is it: "; 497 cin >> axis; 498 Log() << Verbose(0) << "Lower boundary: "; 499 cin >> tmp1; 500 Log() << Verbose(0) << "Upper boundary: "; 501 cin >> tmp2; 502 first = mol->start; 503 second = first->next; 504 while(second != mol->end) { 505 first = second; 506 second = first->next; 507 if ((first->x.x[axis] < tmp1) || (first->x.x[axis] > tmp2)) {// out of boundary ... 508 //Log() << Verbose(0) << "Atom " << *first << " with " << first->x.x[axis] << " on axis " << axis << " is out of bounds [" << tmp1 << "," << tmp2 << "]." << endl; 509 mol->RemoveAtom(first); 510 } 511 } 512 break; 513 }; 514 //mol->Output(); 515 choice = 'r'; 516 }; 517 518 /** Submenu for measuring out the atoms in the molecule. 519 * \param *periode periodentafel 520 * \param *mol molecule with all the atoms 521 */ 522 static void MeasureAtoms(periodentafel *periode, molecule *mol, config *configuration) 523 { 524 atom *first, *second, *third; 525 Vector x,y; 526 double min[256], tmp1, tmp2, tmp3; 527 int Z; 528 char choice; // menu choice char 529 530 Log() << Verbose(0) << "===========MEASURE ATOMS=========================" << endl; 531 Log() << Verbose(0) << " a - calculate bond length between one atom and all others" << endl; 532 Log() << Verbose(0) << " b - calculate bond length between two atoms" << endl; 533 Log() << Verbose(0) << " c - calculate bond angle" << endl; 534 Log() << Verbose(0) << " d - calculate principal axis of the system" << endl; 535 Log() << Verbose(0) << " e - calculate volume of the convex envelope" << endl; 536 Log() << Verbose(0) << " f - calculate temperature from current velocity" << endl; 537 Log() << Verbose(0) << " g - output all temperatures per step from velocities" << endl; 538 Log() << Verbose(0) << "all else - go back" << endl; 539 Log() << Verbose(0) << "===============================================" << endl; 540 Log() << Verbose(0) << "INPUT: "; 541 cin >> choice; 542 543 switch(choice) { 544 default: 545 Log() << Verbose(1) << "Not a valid choice." << endl; 546 break; 547 case 'a': 548 first = mol->AskAtom("Enter first atom: "); 549 for (int i=MAX_ELEMENTS;i--;) 550 min[i] = 0.; 551 552 second = mol->start; 553 while ((second->next != mol->end)) { 554 second = second->next; // advance 555 Z = second->type->Z; 556 tmp1 = 0.; 557 if (first != second) { 558 x.CopyVector((const Vector *)&first->x); 559 x.SubtractVector((const Vector *)&second->x); 560 tmp1 = x.Norm(); 561 } 562 if ((tmp1 != 0.) && ((min[Z] == 0.) || (tmp1 < min[Z]))) min[Z] = tmp1; 563 //Log() << Verbose(0) << "Bond length between Atom " << first->nr << " and " << second->nr << ": " << tmp1 << " a.u." << endl; 564 } 565 for (int i=MAX_ELEMENTS;i--;) 566 if (min[i] != 0.) Log() << Verbose(0) << "Minimum Bond length between " << first->type->name << " Atom " << first->nr << " and next Ion of type " << (periode->FindElement(i))->name << ": " << min[i] << " a.u." << endl; 567 break; 568 569 case 'b': 570 first = mol->AskAtom("Enter first atom: "); 571 second = mol->AskAtom("Enter second atom: "); 572 for (int i=NDIM;i--;) 573 min[i] = 0.; 574 x.CopyVector((const Vector *)&first->x); 575 x.SubtractVector((const Vector *)&second->x); 576 tmp1 = x.Norm(); 577 Log() << Verbose(1) << "Distance vector is "; 578 x.Output(); 579 Log() << Verbose(0) << "." << endl << "Norm of distance is " << tmp1 << "." << endl; 580 break; 581 582 case 'c': 583 Log() << Verbose(0) << "Evaluating bond angle between three - first, central, last - atoms." << endl; 584 first = mol->AskAtom("Enter first atom: "); 585 second = mol->AskAtom("Enter central atom: "); 586 third = mol->AskAtom("Enter last atom: "); 587 tmp1 = tmp2 = tmp3 = 0.; 588 x.CopyVector((const Vector *)&first->x); 589 x.SubtractVector((const Vector *)&second->x); 590 y.CopyVector((const Vector *)&third->x); 591 y.SubtractVector((const Vector *)&second->x); 592 Log() << Verbose(0) << "Bond angle between first atom Nr." << first->nr << ", central atom Nr." << second->nr << " and last atom Nr." << third->nr << ": "; 593 Log() << Verbose(0) << (acos(x.ScalarProduct((const Vector *)&y)/(y.Norm()*x.Norm()))/M_PI*180.) << " degrees" << endl; 594 break; 595 case 'd': 596 Log() << Verbose(0) << "Evaluating prinicipal axis." << endl; 597 Log() << Verbose(0) << "Shall we rotate? [0/1]: "; 598 cin >> Z; 599 if ((Z >=0) && (Z <=1)) 600 mol->PrincipalAxisSystem((bool)Z); 601 else 602 mol->PrincipalAxisSystem(false); 603 break; 604 case 'e': 605 { 606 Log() << Verbose(0) << "Evaluating volume of the convex envelope."; 607 class Tesselation *TesselStruct = NULL; 608 const LinkedCell *LCList = NULL; 609 LCList = new LinkedCell(mol, 10.); 610 FindConvexBorder(mol, TesselStruct, LCList, NULL); 611 double clustervolume = VolumeOfConvexEnvelope(TesselStruct, configuration); 612 Log() << Verbose(0) << "The tesselated surface area is " << clustervolume << "." << endl;\ 613 delete(LCList); 614 delete(TesselStruct); 615 } 616 break; 617 case 'f': 618 mol->OutputTemperatureFromTrajectories((ofstream *)&cout, mol->MDSteps-1, mol->MDSteps); 619 break; 620 case 'g': 621 { 622 char filename[255]; 623 Log() << Verbose(0) << "Please enter filename: " << endl; 624 cin >> filename; 625 Log() << Verbose(1) << "Storing temperatures in " << filename << "." << endl; 626 ofstream *output = new ofstream(filename, ios::trunc); 627 if (!mol->OutputTemperatureFromTrajectories(output, 0, mol->MDSteps)) 628 Log() << Verbose(2) << "File could not be written." << endl; 629 else 630 Log() << Verbose(2) << "File stored." << endl; 631 output->close(); 632 delete(output); 633 } 634 break; 635 } 636 }; 637 638 /** Submenu for measuring out the atoms in the molecule. 639 * \param *mol molecule with all the atoms 640 * \param *configuration configuration structure for the to be written config files of all fragments 641 */ 642 static void FragmentAtoms(molecule *mol, config *configuration) 643 { 644 int Order1; 645 clock_t start, end; 646 647 Log() << Verbose(0) << "Fragmenting molecule with current connection matrix ..." << endl; 648 Log() << Verbose(0) << "What's the desired bond order: "; 649 cin >> Order1; 650 if (mol->first->next != mol->last) { // there are bonds 651 start = clock(); 652 mol->FragmentMolecule(Order1, configuration); 653 end = clock(); 654 Log() << Verbose(0) << "Clocks for this operation: " << (end-start) << ", time: " << ((double)(end-start)/CLOCKS_PER_SEC) << "s." << endl; 655 } else 656 Log() << Verbose(0) << "Connection matrix has not yet been generated!" << endl; 657 }; 658 659 /********************************************** Submenu routine **************************************/ 660 661 /** Submenu for manipulating atoms. 662 * \param *periode periodentafel 663 * \param *molecules list of molecules whose atoms are to be manipulated 664 */ 665 static void ManipulateAtoms(periodentafel *periode, MoleculeListClass *molecules, config *configuration) 666 { 667 atom *first, *second; 668 molecule *mol = NULL; 669 Vector x,y,z,n; // coordinates for absolute point in cell volume 670 double *factor; // unit factor if desired 671 double bond, minBond; 672 char choice; // menu choice char 673 bool valid; 674 675 Log() << Verbose(0) << "=========MANIPULATE ATOMS======================" << endl; 676 Log() << Verbose(0) << "a - add an atom" << endl; 677 Log() << Verbose(0) << "r - remove an atom" << endl; 678 Log() << Verbose(0) << "b - scale a bond between atoms" << endl; 679 Log() << Verbose(0) << "u - change an atoms element" << endl; 680 Log() << Verbose(0) << "l - measure lengths, angles, ... for an atom" << endl; 681 Log() << Verbose(0) << "all else - go back" << endl; 682 Log() << Verbose(0) << "===============================================" << endl; 683 if (molecules->NumberOfActiveMolecules() > 1) 684 eLog() << Verbose(2) << "There is more than one molecule active! Atoms will be added to each." << endl; 685 Log() << Verbose(0) << "INPUT: "; 686 cin >> choice; 687 688 switch (choice) { 689 default: 690 Log() << Verbose(0) << "Not a valid choice." << endl; 691 break; 692 693 case 'a': // add atom 694 for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++) 695 if ((*ListRunner)->ActiveFlag) { 696 mol = *ListRunner; 697 Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl; 698 AddAtoms(periode, mol); 699 } 700 break; 701 702 case 'b': // scale a bond 703 for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++) 704 if ((*ListRunner)->ActiveFlag) { 705 mol = *ListRunner; 706 Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl; 707 Log() << Verbose(0) << "Scaling bond length between two atoms." << endl; 708 first = mol->AskAtom("Enter first (fixed) atom: "); 709 second = mol->AskAtom("Enter second (shifting) atom: "); 710 minBond = 0.; 711 for (int i=NDIM;i--;) 712 minBond += (first->x.x[i]-second->x.x[i])*(first->x.x[i] - second->x.x[i]); 713 minBond = sqrt(minBond); 714 Log() << Verbose(0) << "Current Bond length between " << first->type->name << " Atom " << first->nr << " and " << second->type->name << " Atom " << second->nr << ": " << minBond << " a.u." << endl; 715 Log() << Verbose(0) << "Enter new bond length [a.u.]: "; 716 cin >> bond; 717 for (int i=NDIM;i--;) { 718 second->x.x[i] -= (second->x.x[i]-first->x.x[i])/minBond*(minBond-bond); 719 } 720 //Log() << Verbose(0) << "New coordinates of Atom " << second->nr << " are: "; 721 //second->Output(second->type->No, 1); 722 } 723 break; 724 725 case 'c': // unit scaling of the metric 726 for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++) 727 if ((*ListRunner)->ActiveFlag) { 728 mol = *ListRunner; 729 Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl; 730 Log() << Verbose(0) << "Angstroem -> Bohrradius: 1.8897261\t\tBohrradius -> Angstroem: 0.52917721" << endl; 731 Log() << Verbose(0) << "Enter three factors: "; 732 factor = new double[NDIM]; 733 cin >> factor[0]; 734 cin >> factor[1]; 735 cin >> factor[2]; 736 valid = true; 737 mol->Scale((const double ** const)&factor); 738 delete[](factor); 739 } 740 break; 741 742 case 'l': // measure distances or angles 743 for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++) 744 if ((*ListRunner)->ActiveFlag) { 745 mol = *ListRunner; 746 Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl; 747 MeasureAtoms(periode, mol, configuration); 748 } 749 break; 750 751 case 'r': // remove atom 752 for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++) 753 if ((*ListRunner)->ActiveFlag) { 754 mol = *ListRunner; 755 Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl; 756 RemoveAtoms(mol); 757 } 758 break; 759 760 case 'u': // change an atom's element 761 for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++) 762 if ((*ListRunner)->ActiveFlag) { 763 int Z; 764 mol = *ListRunner; 765 Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl; 766 first = NULL; 767 do { 768 Log() << Verbose(0) << "Change the element of which atom: "; 769 cin >> Z; 770 } while ((first = mol->FindAtom(Z)) == NULL); 771 Log() << Verbose(0) << "New element by atomic number Z: "; 772 cin >> Z; 773 first->type = periode->FindElement(Z); 774 Log() << Verbose(0) << "Atom " << first->nr << "'s element is " << first->type->name << "." << endl; 775 } 776 break; 777 } 778 }; 779 780 /** Submenu for manipulating molecules. 781 * \param *periode periodentafel 782 * \param *molecules list of molecule to manipulate 783 */ 784 static void ManipulateMolecules(periodentafel *periode, MoleculeListClass *molecules, config *configuration) 785 { 786 atom *first = NULL; 787 Vector x,y,z,n; // coordinates for absolute point in cell volume 788 int j, axis, count, faktor; 789 char choice; // menu choice char 790 molecule *mol = NULL; 791 element **Elements; 792 Vector **vectors; 793 MoleculeLeafClass *Subgraphs = NULL; 794 795 Log() << Verbose(0) << "=========MANIPULATE GLOBALLY===================" << endl; 796 Log() << Verbose(0) << "c - scale by unit transformation" << endl; 797 Log() << Verbose(0) << "d - duplicate molecule/periodic cell" << endl; 798 Log() << Verbose(0) << "f - fragment molecule many-body bond order style" << endl; 799 Log() << Verbose(0) << "g - center atoms in box" << endl; 800 Log() << Verbose(0) << "i - realign molecule" << endl; 801 Log() << Verbose(0) << "m - mirror all molecules" << endl; 802 Log() << Verbose(0) << "o - create connection matrix" << endl; 803 Log() << Verbose(0) << "t - translate molecule by vector" << endl; 804 Log() << Verbose(0) << "all else - go back" << endl; 805 Log() << Verbose(0) << "===============================================" << endl; 806 if (molecules->NumberOfActiveMolecules() > 1) 807 eLog() << Verbose(2) << "There is more than one molecule active! Atoms will be added to each." << endl; 808 Log() << Verbose(0) << "INPUT: "; 809 cin >> choice; 810 811 switch (choice) { 812 default: 813 Log() << Verbose(0) << "Not a valid choice." << endl; 814 break; 815 816 case 'd': // duplicate the periodic cell along a given axis, given times 817 for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++) 818 if ((*ListRunner)->ActiveFlag) { 819 mol = *ListRunner; 820 Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl; 821 Log() << Verbose(0) << "State the axis [(+-)123]: "; 822 cin >> axis; 823 Log() << Verbose(0) << "State the factor: "; 824 cin >> faktor; 825 826 mol->CountAtoms(); // recount atoms 827 if (mol->AtomCount != 0) { // if there is more than none 828 count = mol->AtomCount; // is changed becausing of adding, thus has to be stored away beforehand 829 Elements = new element *[count]; 830 vectors = new Vector *[count]; 831 j = 0; 832 first = mol->start; 833 while (first->next != mol->end) { // make a list of all atoms with coordinates and element 834 first = first->next; 835 Elements[j] = first->type; 836 vectors[j] = &first->x; 837 j++; 838 } 839 if (count != j) 840 eLog() << Verbose(1) << "AtomCount " << count << " is not equal to number of atoms in molecule " << j << "!" << endl; 841 x.Zero(); 842 y.Zero(); 843 y.x[abs(axis)-1] = mol->cell_size[(abs(axis) == 2) ? 2 : ((abs(axis) == 3) ? 5 : 0)] * abs(axis)/axis; // last term is for sign, first is for magnitude 844 for (int i=1;i<faktor;i++) { // then add this list with respective translation factor times 845 x.AddVector(&y); // per factor one cell width further 846 for (int k=count;k--;) { // go through every atom of the original cell 847 first = new atom(); // create a new body 848 first->x.CopyVector(vectors[k]); // use coordinate of original atom 849 first->x.AddVector(&x); // translate the coordinates 850 first->type = Elements[k]; // insert original element 851 mol->AddAtom(first); // and add to the molecule (which increments ElementsInMolecule, AtomCount, ...) 852 } 853 } 854 if (mol->first->next != mol->last) // if connect matrix is present already, redo it 855 mol->CreateAdjacencyList(mol->BondDistance, configuration->GetIsAngstroem(), &BondGraph::CovalentMinMaxDistance, NULL); 856 // free memory 857 delete[](Elements); 858 delete[](vectors); 859 // correct cell size 860 if (axis < 0) { // if sign was negative, we have to translate everything 861 x.Zero(); 862 x.AddVector(&y); 863 x.Scale(-(faktor-1)); 864 mol->Translate(&x); 865 } 866 mol->cell_size[(abs(axis) == 2) ? 2 : ((abs(axis) == 3) ? 5 : 0)] *= faktor; 867 } 868 } 869 break; 870 871 case 'f': 872 FragmentAtoms(mol, configuration); 873 break; 874 875 case 'g': // center the atoms 876 for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++) 877 if ((*ListRunner)->ActiveFlag) { 878 mol = *ListRunner; 879 Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl; 880 CenterAtoms(mol); 881 } 882 break; 883 884 case 'i': // align all atoms 885 for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++) 886 if ((*ListRunner)->ActiveFlag) { 887 mol = *ListRunner; 888 Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl; 889 AlignAtoms(periode, mol); 890 } 891 break; 892 893 case 'm': // mirror atoms along a given axis 894 for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++) 895 if ((*ListRunner)->ActiveFlag) { 896 mol = *ListRunner; 897 Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl; 898 MirrorAtoms(mol); 899 } 900 break; 901 902 case 'o': // create the connection matrix 903 for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++) 904 if ((*ListRunner)->ActiveFlag) { 905 mol = *ListRunner; 906 double bonddistance; 907 clock_t start,end; 908 Log() << Verbose(0) << "What's the maximum bond distance: "; 909 cin >> bonddistance; 910 start = clock(); 911 mol->CreateAdjacencyList(bonddistance, configuration->GetIsAngstroem(), &BondGraph::CovalentMinMaxDistance, NULL); 912 end = clock(); 913 Log() << Verbose(0) << "Clocks for this operation: " << (end-start) << ", time: " << ((double)(end-start)/CLOCKS_PER_SEC) << "s." << endl; 914 } 915 break; 916 917 case 't': // translate all atoms 918 for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++) 919 if ((*ListRunner)->ActiveFlag) { 920 mol = *ListRunner; 921 Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl; 922 Log() << Verbose(0) << "Enter translation vector." << endl; 923 x.AskPosition(mol->cell_size,0); 924 mol->Center.AddVector((const Vector *)&x); 925 } 926 break; 927 } 928 // Free all 929 if (Subgraphs != NULL) { // free disconnected subgraph list of DFS analysis was performed 930 while (Subgraphs->next != NULL) { 931 Subgraphs = Subgraphs->next; 932 delete(Subgraphs->previous); 933 } 934 delete(Subgraphs); 935 } 936 }; 937 938 939 /** Submenu for creating new molecules. 940 * \param *periode periodentafel 941 * \param *molecules list of molecules to add to 942 */ 943 static void EditMolecules(periodentafel *periode, MoleculeListClass *molecules) 944 { 945 char choice; // menu choice char 946 Vector center; 947 int nr, count; 948 molecule *mol = NULL; 949 950 Log() << Verbose(0) << "==========EDIT MOLECULES=====================" << endl; 951 Log() << Verbose(0) << "c - create new molecule" << endl; 952 Log() << Verbose(0) << "l - load molecule from xyz file" << endl; 953 Log() << Verbose(0) << "n - change molecule's name" << endl; 954 Log() << Verbose(0) << "N - give molecules filename" << endl; 955 Log() << Verbose(0) << "p - parse atoms in xyz file into molecule" << endl; 956 Log() << Verbose(0) << "r - remove a molecule" << endl; 957 Log() << Verbose(0) << "all else - go back" << endl; 958 Log() << Verbose(0) << "===============================================" << endl; 959 Log() << Verbose(0) << "INPUT: "; 960 cin >> choice; 961 962 switch (choice) { 963 default: 964 Log() << Verbose(0) << "Not a valid choice." << endl; 965 break; 966 case 'c': 967 mol = new molecule(periode); 968 molecules->insert(mol); 969 break; 970 971 case 'l': // load from XYZ file 972 { 973 char filename[MAXSTRINGSIZE]; 974 Log() << Verbose(0) << "Format should be XYZ with: ShorthandOfElement\tX\tY\tZ" << endl; 975 mol = new molecule(periode); 976 do { 977 Log() << Verbose(0) << "Enter file name: "; 978 cin >> filename; 979 } while (!mol->AddXYZFile(filename)); 980 mol->SetNameFromFilename(filename); 981 // center at set box dimensions 982 mol->CenterEdge(¢er); 983 mol->cell_size[0] = center.x[0]; 984 mol->cell_size[1] = 0; 985 mol->cell_size[2] = center.x[1]; 986 mol->cell_size[3] = 0; 987 mol->cell_size[4] = 0; 988 mol->cell_size[5] = center.x[2]; 989 molecules->insert(mol); 990 } 991 break; 992 993 case 'n': 994 { 995 char filename[MAXSTRINGSIZE]; 996 do { 997 Log() << Verbose(0) << "Enter index of molecule: "; 998 cin >> nr; 999 mol = molecules->ReturnIndex(nr); 1000 } while (mol == NULL); 1001 Log() << Verbose(0) << "Enter name: "; 1002 cin >> filename; 1003 strcpy(mol->name, filename); 1004 } 1005 break; 1006 1007 case 'N': 1008 { 1009 char filename[MAXSTRINGSIZE]; 1010 do { 1011 Log() << Verbose(0) << "Enter index of molecule: "; 1012 cin >> nr; 1013 mol = molecules->ReturnIndex(nr); 1014 } while (mol == NULL); 1015 Log() << Verbose(0) << "Enter name: "; 1016 cin >> filename; 1017 mol->SetNameFromFilename(filename); 1018 } 1019 break; 1020 1021 case 'p': // parse XYZ file 1022 { 1023 char filename[MAXSTRINGSIZE]; 1024 mol = NULL; 1025 do { 1026 Log() << Verbose(0) << "Enter index of molecule: "; 1027 cin >> nr; 1028 mol = molecules->ReturnIndex(nr); 1029 } while (mol == NULL); 1030 Log() << Verbose(0) << "Format should be XYZ with: ShorthandOfElement\tX\tY\tZ" << endl; 1031 do { 1032 Log() << Verbose(0) << "Enter file name: "; 1033 cin >> filename; 1034 } while (!mol->AddXYZFile(filename)); 1035 mol->SetNameFromFilename(filename); 1036 } 1037 break; 1038 1039 case 'r': 1040 Log() << Verbose(0) << "Enter index of molecule: "; 1041 cin >> nr; 1042 count = 1; 1043 for(MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++) 1044 if (nr == (*ListRunner)->IndexNr) { 1045 mol = *ListRunner; 1046 molecules->ListOfMolecules.erase(ListRunner); 1047 delete(mol); 1048 break; 1049 } 1050 break; 1051 } 1052 }; 1053 1054 1055 /** Submenu for merging molecules. 1056 * \param *periode periodentafel 1057 * \param *molecules list of molecules to add to 1058 */ 1059 static void MergeMolecules(periodentafel *periode, MoleculeListClass *molecules) 1060 { 1061 char choice; // menu choice char 1062 1063 Log() << Verbose(0) << "===========MERGE MOLECULES=====================" << endl; 1064 Log() << Verbose(0) << "a - simple add of one molecule to another" << endl; 1065 Log() << Verbose(0) << "e - embedding merge of two molecules" << endl; 1066 Log() << Verbose(0) << "m - multi-merge of all molecules" << endl; 1067 Log() << Verbose(0) << "s - scatter merge of two molecules" << endl; 1068 Log() << Verbose(0) << "t - simple merge of two molecules" << endl; 1069 Log() << Verbose(0) << "all else - go back" << endl; 1070 Log() << Verbose(0) << "===============================================" << endl; 1071 Log() << Verbose(0) << "INPUT: "; 1072 cin >> choice; 1073 1074 switch (choice) { 1075 default: 1076 Log() << Verbose(0) << "Not a valid choice." << endl; 1077 break; 1078 1079 case 'a': 1080 { 1081 int src, dest; 1082 molecule *srcmol = NULL, *destmol = NULL; 1083 { 1084 do { 1085 Log() << Verbose(0) << "Enter index of destination molecule: "; 1086 cin >> dest; 1087 destmol = molecules->ReturnIndex(dest); 1088 } while ((destmol == NULL) && (dest != -1)); 1089 do { 1090 Log() << Verbose(0) << "Enter index of source molecule to add from: "; 1091 cin >> src; 1092 srcmol = molecules->ReturnIndex(src); 1093 } while ((srcmol == NULL) && (src != -1)); 1094 if ((src != -1) && (dest != -1)) 1095 molecules->SimpleAdd(srcmol, destmol); 1096 } 1097 } 1098 break; 1099 1100 case 'e': 1101 { 1102 int src, dest; 1103 molecule *srcmol = NULL, *destmol = NULL; 1104 do { 1105 Log() << Verbose(0) << "Enter index of matrix molecule (the variable one): "; 1106 cin >> src; 1107 srcmol = molecules->ReturnIndex(src); 1108 } while ((srcmol == NULL) && (src != -1)); 1109 do { 1110 Log() << Verbose(0) << "Enter index of molecule to merge into (the fixed one): "; 1111 cin >> dest; 1112 destmol = molecules->ReturnIndex(dest); 1113 } while ((destmol == NULL) && (dest != -1)); 1114 if ((src != -1) && (dest != -1)) 1115 molecules->EmbedMerge(destmol, srcmol); 1116 } 1117 break; 1118 1119 case 'm': 1120 { 1121 int nr; 1122 molecule *mol = NULL; 1123 do { 1124 Log() << Verbose(0) << "Enter index of molecule to merge into: "; 1125 cin >> nr; 1126 mol = molecules->ReturnIndex(nr); 1127 } while ((mol == NULL) && (nr != -1)); 1128 if (nr != -1) { 1129 int N = molecules->ListOfMolecules.size()-1; 1130 int *src = new int(N); 1131 for(MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++) 1132 if ((*ListRunner)->IndexNr != nr) 1133 src[N++] = (*ListRunner)->IndexNr; 1134 molecules->SimpleMultiMerge(mol, src, N); 1135 delete[](src); 1136 } 1137 } 1138 break; 1139 1140 case 's': 1141 Log() << Verbose(0) << "Not implemented yet." << endl; 1142 break; 1143 1144 case 't': 1145 { 1146 int src, dest; 1147 molecule *srcmol = NULL, *destmol = NULL; 1148 { 1149 do { 1150 Log() << Verbose(0) << "Enter index of destination molecule: "; 1151 cin >> dest; 1152 destmol = molecules->ReturnIndex(dest); 1153 } while ((destmol == NULL) && (dest != -1)); 1154 do { 1155 Log() << Verbose(0) << "Enter index of source molecule to merge into: "; 1156 cin >> src; 1157 srcmol = molecules->ReturnIndex(src); 1158 } while ((srcmol == NULL) && (src != -1)); 1159 if ((src != -1) && (dest != -1)) 1160 molecules->SimpleMerge(srcmol, destmol); 1161 } 1162 } 1163 break; 1164 } 1165 }; 1166 1167 /********************************************** Test routine **************************************/ 1168 1169 /** Is called always as option 'T' in the menu. 1170 * \param *molecules list of molecules 1171 */ 1172 static void testroutine(MoleculeListClass *molecules) 1173 { 1174 // the current test routine checks the functionality of the KeySet&Graph concept: 1175 // We want to have a multiindex (the KeySet) describing a unique subgraph 1176 int i, comp, counter=0; 1177 1178 // create a clone 1179 molecule *mol = NULL; 1180 if (molecules->ListOfMolecules.size() != 0) // clone 1181 mol = (molecules->ListOfMolecules.front())->CopyMolecule(); 1182 else { 1183 eLog() << Verbose(0) << "I don't have anything to test on ... "; 1184 performCriticalExit(); 1185 return; 1186 } 1187 atom *Walker = mol->start; 1188 1189 // generate some KeySets 1190 Log() << Verbose(0) << "Generating KeySets." << endl; 1191 KeySet TestSets[mol->AtomCount+1]; 1192 i=1; 1193 while (Walker->next != mol->end) { 1194 Walker = Walker->next; 1195 for (int j=0;j<i;j++) { 1196 TestSets[j].insert(Walker->nr); 1197 } 1198 i++; 1199 } 1200 Log() << Verbose(0) << "Testing insertion of already present item in KeySets." << endl; 1201 KeySetTestPair test; 1202 test = TestSets[mol->AtomCount-1].insert(Walker->nr); 1203 if (test.second) { 1204 Log() << Verbose(1) << "Insertion worked?!" << endl; 1205 } else { 1206 Log() << Verbose(1) << "Insertion rejected: Present object is " << (*test.first) << "." << endl; 1207 } 1208 TestSets[mol->AtomCount].insert(mol->end->previous->nr); 1209 TestSets[mol->AtomCount].insert(mol->end->previous->previous->previous->nr); 1210 1211 // constructing Graph structure 1212 Log() << Verbose(0) << "Generating Subgraph class." << endl; 1213 Graph Subgraphs; 1214 1215 // insert KeySets into Subgraphs 1216 Log() << Verbose(0) << "Inserting KeySets into Subgraph class." << endl; 1217 for (int j=0;j<mol->AtomCount;j++) { 1218 Subgraphs.insert(GraphPair (TestSets[j],pair<int, double>(counter++, 1.))); 1219 } 1220 Log() << Verbose(0) << "Testing insertion of already present item in Subgraph." << endl; 1221 GraphTestPair test2; 1222 test2 = Subgraphs.insert(GraphPair (TestSets[mol->AtomCount],pair<int, double>(counter++, 1.))); 1223 if (test2.second) { 1224 Log() << Verbose(1) << "Insertion worked?!" << endl; 1225 } else { 1226 Log() << Verbose(1) << "Insertion rejected: Present object is " << (*(test2.first)).second.first << "." << endl; 1227 } 1228 1229 // show graphs 1230 Log() << Verbose(0) << "Showing Subgraph's contents, checking that it's sorted." << endl; 1231 Graph::iterator A = Subgraphs.begin(); 1232 while (A != Subgraphs.end()) { 1233 Log() << Verbose(0) << (*A).second.first << ": "; 1234 KeySet::iterator key = (*A).first.begin(); 1235 comp = -1; 1236 while (key != (*A).first.end()) { 1237 if ((*key) > comp) 1238 Log() << Verbose(0) << (*key) << " "; 1239 else 1240 Log() << Verbose(0) << (*key) << "! "; 1241 comp = (*key); 1242 key++; 1243 } 1244 Log() << Verbose(0) << endl; 1245 A++; 1246 } 1247 delete(mol); 1248 }; 1249 1250 #endif 77 1251 78 1252 /** Parses the command line options. … … 103 1277 int argptr; 104 1278 molecule *mol = NULL; 105 string BondGraphFileName(" ");1279 string BondGraphFileName("\n"); 106 1280 int verbosity = 0; 107 1281 strncpy(configuration.databasepath, LocalPath, MAXSTRINGSIZE-1); … … 126 1300 Log() << Verbose(0) << "\t-B xx xy xz yy yz zz\tBound atoms by domain with given symmetric matrix of (xx,xy,xz,yy,yz,zz)." << endl; 127 1301 Log() << Verbose(0) << "\t-c x1 x2 x3\tCenter atoms in domain with a minimum distance to boundary of (x1,x2,x3)." << endl; 128 Log() << Verbose(0) << "\t-C \tPair Correlation analysis." << endl;1302 Log() << Verbose(0) << "\t-C <Z> <output> <bin output>\tPair Correlation analysis." << endl; 129 1303 Log() << Verbose(0) << "\t-d x1 x2 x3\tDuplicate cell along each axis by given factor." << endl; 130 1304 Log() << Verbose(0) << "\t-D <bond distance>\tDepth-First-Search Analysis of the molecule, giving cycles and tree/back edges." << endl; 131 1305 Log() << Verbose(0) << "\t-e <file>\tSets the databases path to be parsed (default: ./)." << endl; 132 1306 Log() << Verbose(0) << "\t-E <id> <Z>\tChange atom <id>'s element to <Z>, <id> begins at 0." << endl; 133 Log() << Verbose(0) << "\t-f/F <dist> <order>\tFragments the molecule in BOSSANOVA manner (with/out rings compressed) and stores config files in same dir as config (return code 0 - fragmented, 2 - no fragmentation necessary)." << endl; 1307 Log() << Verbose(0) << "\t-f <dist> <order>\tFragments the molecule in BOSSANOVA manner (with/out rings compressed) and stores config files in same dir as config (return code 0 - fragmented, 2 - no fragmentation necessary)." << endl; 1308 Log() << Verbose(0) << "\t-F <dist_x> <dist_y> <dist_z> <epsilon> <randatom> <randmol> <DoRotate>\tFilling Box with water molecules." << endl; 134 1309 Log() << Verbose(0) << "\t-g <file>\tParses a bond length table from the given file." << endl; 135 1310 Log() << Verbose(0) << "\t-h/-H/-?\tGive this help screen." << endl; 1311 Log() << Verbose(0) << "\t-I\t Dissect current system of molecules into a set of disconnected (subgraphs of) molecules." << endl; 136 1312 Log() << Verbose(0) << "\t-L <step0> <step1> <prefix>\tStore a linear interpolation between two configurations <step0> and <step1> into single config files with prefix <prefix> and as Trajectories into the current config file." << endl; 137 1313 Log() << Verbose(0) << "\t-m <0/1>\tCalculate (0)/ Align in(1) PAS with greatest EV along z axis." << endl; … … 257 1433 mol = new molecule(periode); 258 1434 mol->ActiveFlag = true; 1435 if (ConfigFileName != NULL) 1436 mol->SetNameFromFilename(ConfigFileName); 259 1437 molecules->insert(mol); 1438 } 1439 if (configuration.BG == NULL) { 1440 configuration.BG = new BondGraph(configuration.GetIsAngstroem()); 1441 if ((!BondGraphFileName.empty()) && (configuration.BG->LoadBondLengthTable(BondGraphFileName))) { 1442 Log() << Verbose(0) << "Bond length table loaded successfully." << endl; 1443 } else { 1444 eLog() << Verbose(1) << "Bond length table loading failed." << endl; 1445 } 260 1446 } 261 1447 … … 359 1545 //argptr+=1; 360 1546 break; 1547 case 'I': 1548 Log() << Verbose(1) << "Dissecting molecular system into a set of disconnected subgraphs ... " << endl; 1549 // @TODO rather do the dissection afterwards 1550 molecules->DissectMoleculeIntoConnectedSubgraphs(periode, &configuration); 1551 mol = NULL; 1552 if (molecules->ListOfMolecules.size() != 0) { 1553 for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++) 1554 if ((*ListRunner)->ActiveFlag) { 1555 mol = *ListRunner; 1556 break; 1557 } 1558 } 1559 if (mol == NULL) { 1560 mol = *(molecules->ListOfMolecules.begin()); 1561 mol->ActiveFlag = true; 1562 } 1563 break; 361 1564 case 'C': 362 1565 if (ExitFlag == 0) ExitFlag = 1; … … 366 1569 performCriticalExit(); 367 1570 } else { 368 SaveFlag = false;369 1571 ofstream output(argv[argptr+1]); 370 1572 ofstream binoutput(argv[argptr+2]); … … 386 1588 counter = 0; 387 1589 for (MoleculeList::iterator BigFinder = molecules->ListOfMolecules.begin(); BigFinder != molecules->ListOfMolecules.end(); BigFinder++) { 388 Actives[counter ] = (*BigFinder)->ActiveFlag;1590 Actives[counter++] = (*BigFinder)->ActiveFlag; 389 1591 (*BigFinder)->ActiveFlag = (*BigFinder == Boundary) ? false : true; 390 1592 } … … 394 1596 int ranges[NDIM] = {1,1,1}; 395 1597 CorrelationToSurfaceMap *surfacemap = PeriodicCorrelationToSurface( molecules, elemental, TesselStruct, LCList, ranges ); 1598 //OutputCorrelationToSurface(&output, surfacemap); 396 1599 BinPairMap *binmap = BinData( surfacemap, 0.5, 0., 0. ); 397 1600 OutputCorrelation ( &binoutput, binmap ); … … 399 1602 binoutput.close(); 400 1603 for (MoleculeList::iterator BigFinder = molecules->ListOfMolecules.begin(); BigFinder != molecules->ListOfMolecules.end(); BigFinder++) 401 (*BigFinder)->ActiveFlag = Actives[counter ];1604 (*BigFinder)->ActiveFlag = Actives[counter++]; 402 1605 Free(&Actives); 403 1606 delete(LCList); … … 422 1625 case 'F': 423 1626 if (ExitFlag == 0) ExitFlag = 1; 424 if (argptr+ 5>=argc) {1627 if (argptr+6 >=argc) { 425 1628 ExitFlag = 255; 426 eLog() << Verbose(0) << "Not enough or invalid arguments given for filling box with water: -F <dist_x> <dist_y> <dist_z> < randatom> <randmol> <DoRotate>" << endl;1629 eLog() << Verbose(0) << "Not enough or invalid arguments given for filling box with water: -F <dist_x> <dist_y> <dist_z> <boundary> <randatom> <randmol> <DoRotate>" << endl; 427 1630 performCriticalExit(); 428 1631 } else { … … 430 1633 Log() << Verbose(1) << "Filling Box with water molecules." << endl; 431 1634 // construct water molecule 432 molecule *filler = new molecule(periode); ;1635 molecule *filler = new molecule(periode); 433 1636 molecule *Filling = NULL; 434 1637 atom *second = NULL, *third = NULL; 1638 // first = new atom(); 1639 // first->type = periode->FindElement(5); 1640 // first->x.Zero(); 1641 // filler->AddAtom(first); 435 1642 first = new atom(); 436 1643 first->type = periode->FindElement(1); … … 451 1658 for (int i=0;i<NDIM;i++) 452 1659 distance[i] = atof(argv[argptr+i]); 453 Filling = FillBoxWithMolecule(molecules, filler, configuration, distance, atof(argv[argptr+3]), atof(argv[argptr+4]), ato i(argv[argptr+5]));1660 Filling = FillBoxWithMolecule(molecules, filler, configuration, distance, atof(argv[argptr+3]), atof(argv[argptr+4]), atof(argv[argptr+5]), atoi(argv[argptr+6])); 454 1661 if (Filling != NULL) { 1662 Filling->ActiveFlag = false; 455 1663 molecules->insert(Filling); 456 1664 } … … 499 1707 start = clock(); 500 1708 LCList = new LinkedCell(Boundary, atof(argv[argptr])*2.); 501 FindNonConvexBorder(Boundary, T, LCList, atof(argv[argptr]), argv[argptr+1]); 1709 if (!FindNonConvexBorder(Boundary, T, LCList, atof(argv[argptr]), argv[argptr+1])) 1710 ExitFlag = 255; 502 1711 //FindDistributionOfEllipsoids(T, &LCList, N, number, filename.c_str()); 503 1712 end = clock(); 504 1713 Log() << Verbose(0) << "Clocks for this operation: " << (end-start) << ", time: " << ((double)(end-start)/CLOCKS_PER_SEC) << "s." << endl; 505 1714 delete(LCList); 1715 delete(T); 506 1716 argptr+=2; 507 1717 } … … 799 2009 if (volume != -1) 800 2010 ExitFlag = 255; 801 eLog() << Verbose(0) << "Not enough arguments given for suspension: -u <density>" << endl;2011 eLog() << Verbose(0) << "Not enough or invalid arguments given for suspension: -u <density>" << endl; 802 2012 performCriticalExit(); 803 2013 } else { … … 920 2130 Action *eraseMoleculeAction = new MethodAction("eraseMoleculeAction",boost::bind(&MoleculeListClass::eraseMolecule,molecules)); 921 2131 new ActionMenuItem('r',"remove a molecule",editMoleculesMenu,eraseMoleculeAction); 2132 922 2133 } 923 2134 … … 971 2182 972 2183 { 2184 cout << ESPACKVersion << endl; 2185 2186 setVerbosity(0); 2187 973 2188 menuPopulaters populaters; 974 2189 populaters.MakeEditMoleculesMenu = populateEditMoleculesMenu; … … 981 2196 MainWindow *mainWindow = UIFactory::get()->makeMainWindow(populaters,molecules, configuration, periode, ConfigFileName); 982 2197 mainWindow->display(); 2198 983 2199 delete mainWindow; 984 2200 } -
TabularUnified src/config.cpp ¶
r9fe36b rb8d1aeb 6 6 7 7 #include <stdio.h> 8 #include <cstring> 8 9 9 10 #include "atom.hpp" … … 27 28 char number1[8]; 28 29 char number2[8]; 29 c har *dummy1, *dummy2;30 const char *dummy1, *dummy2; 30 31 //Log() << Verbose(0) << s1 << " " << s2 << endl; 31 32 dummy1 = strchr(s1, '_')+sizeof(char)*5; // go just after "Ion_Type" … … 140 141 void ConfigFileBuffer::MapIonTypesInBuffer(const int NoAtoms) 141 142 { 142 map<const char *, int, IonTypeCompare> LineList;143 map<const char *, int, IonTypeCompare> IonTypeLineMap; 143 144 if (LineMapping == NULL) { 144 145 eLog() << Verbose(0) << "map pointer is NULL: " << LineMapping << endl; … … 149 150 // put all into hashed map 150 151 for (int i=0; i<NoAtoms; ++i) { 151 LineList.insert(pair<const char *, int> (buffer[CurrentLine+i], CurrentLine+i));152 IonTypeLineMap.insert(pair<const char *, int> (buffer[CurrentLine+i], CurrentLine+i)); 152 153 } 153 154 154 155 // fill map 155 156 int nr=0; 156 for (map<const char *, int, IonTypeCompare>::iterator runner = LineList.begin(); runner != LineList.end(); ++runner) {157 for (map<const char *, int, IonTypeCompare>::iterator runner = IonTypeLineMap.begin(); runner != IonTypeLineMap.end(); ++runner) { 157 158 if (CurrentLine+nr < NoLines) 158 159 LineMapping[CurrentLine+(nr++)] = runner->second; … … 1056 1057 1057 1058 // 2. parse the bond graph file if given 1058 BG = new BondGraph(IsAngstroem); 1059 if (BG->LoadBondLengthTable(BondGraphFileName)) { 1060 Log() << Verbose(0) << "Bond length table loaded successfully." << endl; 1061 } else { 1062 eLog() << Verbose(1) << "Bond length table loading failed." << endl; 1059 if (BG == NULL) { 1060 BG = new BondGraph(IsAngstroem); 1061 if (BG->LoadBondLengthTable(BondGraphFileName)) { 1062 Log() << Verbose(0) << "Bond length table loaded successfully." << endl; 1063 } else { 1064 eLog() << Verbose(1) << "Bond length table loading failed." << endl; 1065 } 1063 1066 } 1064 1067 1065 1068 // 3. parse the molecule in 1066 1069 LoadMolecule(mol, FileBuffer, periode, FastParsing); 1070 mol->SetNameFromFilename(filename); 1067 1071 mol->ActiveFlag = true; 1072 MolList->insert(mol); 1068 1073 1069 1074 // 4. dissect the molecule into connected subgraphs 1070 MolList->DissectMoleculeIntoConnectedSubgraphs(mol,this); 1071 1072 delete(mol); 1075 // don't do this here ... 1076 //MolList->DissectMoleculeIntoConnectedSubgraphs(mol,this); 1077 //delete(mol); 1078 1073 1079 delete(FileBuffer); 1074 1080 }; … … 1782 1788 ofstream output; 1783 1789 molecule *mol = new molecule(periode); 1790 mol->SetNameFromFilename(ConfigFileName); 1784 1791 1785 1792 if (!strcmp(configpath, GetDefaultPath())) { … … 1791 1798 if (ConfigFileName != NULL) 1792 1799 strcpy(filename, ConfigFileName); 1793 else1800 if (output == NULL) 1794 1801 strcpy(filename,"main_pcp_linux"); 1795 1802 Log() << Verbose(0) << "Saving as pdb input "; … … 1802 1809 if (ConfigFileName != NULL) 1803 1810 strcpy(filename, ConfigFileName); 1804 else1811 if (output == NULL) 1805 1812 strcpy(filename,"main_pcp_linux"); 1806 1813 Log() << Verbose(0) << "Saving as tremolo data input "; … … 1856 1863 output.open(filename, ios::trunc); 1857 1864 } 1858 else{1865 if (output == NULL) { 1859 1866 strcpy(filename,"main_pcp_linux"); 1860 1867 strcat(filename, ".xyz"); … … 1879 1886 if (ConfigFileName != NULL) 1880 1887 strcpy(filename, ConfigFileName); 1881 else1888 if (output == NULL) 1882 1889 strcpy(filename,"main_pcp_linux"); 1883 1890 Log() << Verbose(0) << "Saving as mpqc input "; … … 2241 2248 } 2242 2249 line++; 2243 } while ( dummy1 != NULL && (dummy1[0] == '#') || (dummy1[0] == '\n'));2250 } while ((dummy1 != NULL) && ((dummy1[0] == '#') || (dummy1[0] == '\n'))); 2244 2251 dummy = dummy1; 2245 2252 } else { // simple int, strings or doubles start in the same line -
TabularUnified src/helpers.hpp ¶
r9fe36b rb8d1aeb 74 74 x = y; 75 75 y = tmp; 76 }; 77 78 /** returns greater of the two values. 79 * \param x first value 80 * \param y second value 81 * \return greater of the two (by operator>()) 82 */ 83 template <typename T> T Max(T x, T y) 84 { 85 if (x > y) 86 return x; 87 else return y; 88 }; 89 90 /** returns smaller of the two values. 91 * \param x first value 92 * \param y second value 93 * \return smaller of the two (by operator<()) 94 */ 95 template <typename T> T Min(T x, T y) 96 { 97 if (x < y) 98 return x; 99 else return y; 76 100 }; 77 101 -
TabularUnified src/joiner.cpp ¶
r9fe36b rb8d1aeb 7 7 8 8 //============================ INCLUDES =========================== 9 10 #include <cstring> 9 11 10 12 #include "datacreator.hpp" -
TabularUnified src/memoryallocator.hpp ¶
r9fe36b rb8d1aeb 16 16 #endif 17 17 18 #include <cstdlib> 18 19 #include <iostream> 19 20 #include <iomanip> -
TabularUnified src/memoryusageobserver.cpp ¶
r9fe36b rb8d1aeb 4 4 * This class represents a Singleton for observing memory usage. 5 5 */ 6 7 #include <cstdlib> 6 8 7 9 #include "log.hpp" -
TabularUnified src/molecule.cpp ¶
r9fe36b rb8d1aeb 4 4 * 5 5 */ 6 7 #include <cstring> 6 8 7 9 #include "atom.hpp" … … 599 601 else 600 602 molname = filename; // contains no slashes 601 c har *endname = strchr(molname, '.');603 const char *endname = strchr(molname, '.'); 602 604 if ((endname == NULL) || (endname < molname)) 603 605 length = strlen(molname); -
TabularUnified src/molecule.hpp ¶
r9fe36b rb8d1aeb 114 114 115 115 // re-definition of virtual functions from PointCloud 116 const char * const GetName() const; 116 117 Vector *GetCenter() const ; 117 118 TesselPoint *GetPoint() const ; 118 119 TesselPoint *GetTerminalPoint() const ; 120 int GetMaxId() const; 119 121 void GoToNext() const ; 120 122 void GoToPrevious() const ; … … 332 334 void Enumerate(ofstream *out); 333 335 void Output(ofstream *out); 334 void DissectMoleculeIntoConnectedSubgraphs( molecule * const mol, config * const configuration);336 void DissectMoleculeIntoConnectedSubgraphs(const periodentafel * const periode, config * const configuration); 335 337 int CountAllAtoms() const; 336 338 -
TabularUnified src/molecule_dynamics.cpp ¶
r9fe36b rb8d1aeb 370 370 371 371 // argument minimise the constrained potential in this injective PermutationMap 372 Log() << Verbose(1) << "Argument minimising the PermutationMap , at current potential " << OldPotential << " ..." << endl;372 Log() << Verbose(1) << "Argument minimising the PermutationMap." << endl; 373 373 OldPotential = 1e+10; 374 374 round = 0; 375 375 do { 376 Log() << Verbose(2) << "Starting round " << ++round << " ... " << endl;376 Log() << Verbose(2) << "Starting round " << ++round << ", at current potential " << OldPotential << " ... " << endl; 377 377 OlderPotential = OldPotential; 378 378 do { -
TabularUnified src/molecule_fragmentation.cpp ¶
r9fe36b rb8d1aeb 5 5 * Author: heber 6 6 */ 7 8 #include <cstring> 7 9 8 10 #include "atom.hpp" -
TabularUnified src/molecule_geometry.cpp ¶
r9fe36b rb8d1aeb 101 101 { 102 102 int Num = 0; 103 atom *ptr = start ->next; // start at first in list103 atom *ptr = start; // start at first in list 104 104 105 105 Center.Zero(); 106 106 107 if (ptr != end) { //list not empty?107 if (ptr->next != end) { //list not empty? 108 108 while (ptr->next != end) { // continue with second if present 109 109 ptr = ptr->next; -
TabularUnified src/molecule_graph.cpp ¶
r9fe36b rb8d1aeb 1117 1117 bool status = true; 1118 1118 if (ReferenceStack->IsEmpty()) { 1119 eLog() << Verbose(0) << "ReferenceStack is empty!" << endl; 1120 performCriticalExit(); 1119 Log() << Verbose(1) << "ReferenceStack is empty!" << endl; 1121 1120 return false; 1122 1121 } -
TabularUnified src/molecule_pointcloud.cpp ¶
r9fe36b rb8d1aeb 13 13 /************************************* Functions for class molecule *********************************/ 14 14 15 /** Returns a name for this point cloud, here the molecule's name. 16 * \return name of point cloud 17 */ 18 const char * const molecule::GetName() const 19 { 20 return name; 21 }; 15 22 16 23 /** Determine center of all atoms. … … 41 48 { 42 49 return end; 50 }; 51 52 /** Return the greatest index of all atoms in the list. 53 * \return greatest index 54 */ 55 int molecule::GetMaxId() const 56 { 57 return last_atom; 43 58 }; 44 59 -
TabularUnified src/moleculelist.cpp ¶
r9fe36b rb8d1aeb 4 4 * 5 5 */ 6 7 #include <cstring> 6 8 7 9 #include "atom.hpp" … … 405 407 input.open(line.c_str()); 406 408 if (input == NULL) { 407 eLog() << Verbose(0) << endl << "Unable to open " << line << ", is the directory correct?" << endl; 408 performCriticalExit(); 409 Log() << Verbose(1) << endl << "Unable to open " << line << ", is the directory correct?" << endl; 409 410 return false; 410 411 } … … 743 744 /** Dissects given \a *mol into connected subgraphs and inserts them as new molecules but with old atoms into \a this. 744 745 * \param *out output stream for debugging 745 * \param * mol molecule with atoms to dissect746 * \param *periode periodentafel 746 747 * \param *configuration config with BondGraph 747 748 */ 748 void MoleculeListClass::DissectMoleculeIntoConnectedSubgraphs(molecule * const mol, config * const configuration) 749 { 749 void MoleculeListClass::DissectMoleculeIntoConnectedSubgraphs(const periodentafel * const periode, config * const configuration) 750 { 751 molecule *mol = new molecule(periode); 752 atom *Walker = NULL; 753 atom *Advancer = NULL; 754 bond *Binder = NULL; 755 bond *Stepper = NULL; 756 // 0. gather all atoms into single molecule 757 for (MoleculeList::iterator MolRunner = ListOfMolecules.begin(); !ListOfMolecules.empty(); MolRunner = ListOfMolecules.begin()) { 758 // shift all atoms to new molecule 759 Advancer = (*MolRunner)->start->next; 760 while (Advancer != (*MolRunner)->end) { 761 Walker = Advancer; 762 Advancer = Advancer->next; 763 Log() << Verbose(3) << "Re-linking " << *Walker << "..." << endl; 764 unlink(Walker); 765 Walker->father = Walker; 766 mol->AddAtom(Walker); // counting starts at 1 767 } 768 // remove all bonds 769 Stepper = (*MolRunner)->first->next; 770 while (Stepper != (*MolRunner)->last) { 771 Binder = Stepper; 772 Stepper = Stepper->next; 773 delete(Binder); 774 } 775 // remove the molecule 776 delete(*MolRunner); 777 ListOfMolecules.erase(MolRunner); 778 } 779 750 780 // 1. dissect the molecule into connected subgraphs 751 781 configuration->BG->ConstructBondGraph(mol); … … 763 793 // 4a. create array of molecules to fill 764 794 const int MolCount = Subgraphs->next->Count(); 795 char number[MAXSTRINGSIZE]; 765 796 molecule **molecules = Malloc<molecule *>(MolCount, "config::Load() - **molecules"); 766 797 for (int i=0;i<MolCount;i++) { 767 798 molecules[i] = (molecule*) new molecule(mol->elemente); 768 799 molecules[i]->ActiveFlag = true; 800 strncpy(molecules[i]->name, mol->name, MAXSTRINGSIZE); 801 if (MolCount > 1) { 802 sprintf(number, "-%d", i+1); 803 strncat(molecules[i]->name, number, MAXSTRINGSIZE - strlen(mol->name) - 1); 804 } 805 cout << "MolName is " << molecules[i]->name << endl; 769 806 insert(molecules[i]); 770 807 } … … 774 811 int *MolMap = Calloc<int>(mol->AtomCount, "config::Load() - *MolMap"); 775 812 MoleculeLeafClass *MolecularWalker = Subgraphs; 776 atom *Walker = NULL;813 Walker = NULL; 777 814 while (MolecularWalker->next != NULL) { 778 815 MolecularWalker = MolecularWalker->next; … … 803 840 } 804 841 } 805 // 4d. we don't need to redo bonds, as they are connected subgraphs and still maintain edtheir ListOfBonds, but we have to remove them from first..last list806 bond *Binder = mol->first;842 // 4d. we don't need to redo bonds, as they are connected subgraphs and still maintain their ListOfBonds, but we have to remove them from first..last list 843 Binder = mol->first; 807 844 while (mol->first->next != mol->last) { 808 845 Binder = mol->first->next; -
TabularUnified src/parser.cpp ¶
r9fe36b rb8d1aeb 6 6 7 7 // ======================================= INCLUDES ========================================== 8 9 #include <cstring> 8 10 9 11 #include "helpers.hpp" … … 156 158 157 159 input.open(name, ios::in); 158 //Log() << Verbose( 0) << "Opening " << name << " ... " << input << endl;160 //Log() << Verbose(1) << "Opening " << name << " ... " << input << endl; 159 161 if (input == NULL) { 160 eLog() << Verbose( 0) << endl << "Unable to open " << name << ", is the directory correct?" << endl;161 performCriticalExit();162 eLog() << Verbose(1) << endl << "Unable to open " << name << ", is the directory correct?" << endl; 163 //performCriticalExit(); 162 164 return false; 163 165 } … … 179 181 } 180 182 //Log() << Verbose(0) << line.str() << endl; 181 //Log() << Verbose( 0) << "ColumnCounter[" << MatrixNr << "]: " << ColumnCounter[MatrixNr] << "." << endl;183 //Log() << Verbose(1) << "ColumnCounter[" << MatrixNr << "]: " << ColumnCounter[MatrixNr] << "." << endl; 182 184 if (ColumnCounter[MatrixNr] == 0) { 183 185 eLog() << Verbose(0) << "ColumnCounter[" << MatrixNr << "]: " << ColumnCounter[MatrixNr] << " from file " << name << ", this is probably an error!" << endl; … … 195 197 } 196 198 } 197 //Log() << Verbose( 0) << "RowCounter[" << MatrixNr << "]: " << RowCounter[MatrixNr] << " from file " << name << "." << endl;199 //Log() << Verbose(1) << "RowCounter[" << MatrixNr << "]: " << RowCounter[MatrixNr] << " from file " << name << "." << endl; 198 200 if (RowCounter[MatrixNr] == 0) { 199 201 eLog() << Verbose(0) << "RowCounter[" << MatrixNr << "]: " << RowCounter[MatrixNr] << " from file " << name << ", this is probably an error!" << endl; … … 218 220 input.getline(filename, 1023); 219 221 stringstream lines(filename); 220 //Log() << Verbose( 0) << "Matrix at level " << j << ":";// << filename << endl;222 //Log() << Verbose(2) << "Matrix at level " << j << ":";// << filename << endl; 221 223 for(int k=skipcolumns;k--;) 222 224 lines >> filename; 223 225 for(int k=0;(k<ColumnCounter[MatrixNr]) && (!lines.eof());k++) { 224 226 lines >> Matrix[MatrixNr][j][k]; 225 //Log() << Verbose( 0) << " " << setprecision(2) << Matrix[MatrixNr][j][k];;227 //Log() << Verbose(1) << " " << setprecision(2) << Matrix[MatrixNr][j][k] << endl; 226 228 } 227 //Log() << Verbose(0) << endl;228 229 Matrix[MatrixNr][ RowCounter[MatrixNr] ] = Malloc<double>(ColumnCounter[MatrixNr], "MatrixContainer::ParseMatrix: *Matrix[RowCounter[MatrixNr]][]"); 229 230 for(int j=ColumnCounter[MatrixNr];j--;) -
TabularUnified src/periodentafel.cpp ¶
r9fe36b rb8d1aeb 9 9 #include <iomanip> 10 10 #include <fstream> 11 #include <cstring> 11 12 12 13 #include "element.hpp" -
TabularUnified src/tesselation.cpp ¶
r9fe36b rb8d1aeb 9 9 10 10 #include "helpers.hpp" 11 #include "info.hpp" 11 12 #include "linkedcell.hpp" 12 13 #include "log.hpp" … … 22 23 /** Constructor of BoundaryPointSet. 23 24 */ 24 BoundaryPointSet::BoundaryPointSet() 25 { 26 LinesCount = 0; 27 Nr = -1; 28 value = 0.; 25 BoundaryPointSet::BoundaryPointSet() : 26 LinesCount(0), 27 value(0.), 28 Nr(-1) 29 { 30 Info FunctionInfo(__func__); 31 Log() << Verbose(1) << "Adding noname." << endl; 29 32 }; 30 33 … … 32 35 * \param *Walker TesselPoint this boundary point represents 33 36 */ 34 BoundaryPointSet::BoundaryPointSet(TesselPoint * Walker) 35 { 36 node = Walker; 37 LinesCount = 0; 38 Nr = Walker->nr; 39 value = 0.; 37 BoundaryPointSet::BoundaryPointSet(TesselPoint * const Walker) : 38 LinesCount(0), 39 node(Walker), 40 value(0.), 41 Nr(Walker->nr) 42 { 43 Info FunctionInfo(__func__); 44 Log() << Verbose(1) << "Adding Node " << *Walker << endl; 40 45 }; 41 46 … … 46 51 BoundaryPointSet::~BoundaryPointSet() 47 52 { 48 //Log() << Verbose(5) << "Erasing point nr. " << Nr << "." << endl; 53 Info FunctionInfo(__func__); 54 //Log() << Verbose(0) << "Erasing point nr. " << Nr << "." << endl; 49 55 if (!lines.empty()) 50 56 eLog() << Verbose(2) << "Memory Leak! I " << *this << " am still connected to some lines." << endl; … … 55 61 * \param *line line to add 56 62 */ 57 void BoundaryPointSet::AddLine(class BoundaryLineSet *line) 58 { 59 Log() << Verbose(6) << "Adding " << *this << " to line " << *line << "." 63 void BoundaryPointSet::AddLine(BoundaryLineSet * const line) 64 { 65 Info FunctionInfo(__func__); 66 Log() << Verbose(1) << "Adding " << *this << " to line " << *line << "." 60 67 << endl; 61 68 if (line->endpoints[0] == this) … … 85 92 /** Constructor of BoundaryLineSet. 86 93 */ 87 BoundaryLineSet::BoundaryLineSet() 88 { 94 BoundaryLineSet::BoundaryLineSet() : 95 Nr(-1) 96 { 97 Info FunctionInfo(__func__); 89 98 for (int i = 0; i < 2; i++) 90 99 endpoints[i] = NULL; 91 Nr = -1;92 100 }; 93 101 … … 97 105 * \param number number of the list 98 106 */ 99 BoundaryLineSet::BoundaryLineSet(class BoundaryPointSet *Point[2], const int number) 100 { 107 BoundaryLineSet::BoundaryLineSet(BoundaryPointSet * const Point[2], const int number) 108 { 109 Info FunctionInfo(__func__); 101 110 // set number 102 111 Nr = number; … … 106 115 Point[0]->AddLine(this); //Taken out, to check whether we can avoid unwanted double adding. 107 116 Point[1]->AddLine(this); // 117 // set skipped to false 118 skipped = false; 108 119 // clear triangles list 109 Log() << Verbose(5) << "New Line with endpoints " << *this << "." << endl; 120 Log() << Verbose(0) << "New Line with endpoints " << *this << "." << endl; 121 }; 122 123 /** Constructor of BoundaryLineSet with two endpoints. 124 * Adds line automatically to each endpoints' LineMap 125 * \param *Point1 first boundary point 126 * \param *Point2 second boundary point 127 * \param number number of the list 128 */ 129 BoundaryLineSet::BoundaryLineSet(BoundaryPointSet * const Point1, BoundaryPointSet * const Point2, const int number) 130 { 131 Info FunctionInfo(__func__); 132 // set number 133 Nr = number; 134 // set endpoints in ascending order 135 SetEndpointsOrdered(endpoints, Point1, Point2); 136 // add this line to the hash maps of both endpoints 137 Point1->AddLine(this); //Taken out, to check whether we can avoid unwanted double adding. 138 Point2->AddLine(this); // 139 // set skipped to false 140 skipped = false; 141 // clear triangles list 142 Log() << Verbose(0) << "New Line with endpoints " << *this << "." << endl; 110 143 }; 111 144 … … 116 149 BoundaryLineSet::~BoundaryLineSet() 117 150 { 151 Info FunctionInfo(__func__); 118 152 int Numbers[2]; 119 153 … … 134 168 for (LineMap::iterator Runner = erasor.first; Runner != erasor.second; Runner++) 135 169 if ((*Runner).second == this) { 136 //Log() << Verbose( 5) << "Removing Line Nr. " << Nr << " in boundary point " << *endpoints[i] << "." << endl;170 //Log() << Verbose(0) << "Removing Line Nr. " << Nr << " in boundary point " << *endpoints[i] << "." << endl; 137 171 endpoints[i]->lines.erase(Runner); 138 172 break; … … 140 174 } else { // there's just a single line left 141 175 if (endpoints[i]->lines.erase(Nr)) { 142 //Log() << Verbose( 5) << "Removing Line Nr. " << Nr << " in boundary point " << *endpoints[i] << "." << endl;176 //Log() << Verbose(0) << "Removing Line Nr. " << Nr << " in boundary point " << *endpoints[i] << "." << endl; 143 177 } 144 178 } 145 179 if (endpoints[i]->lines.empty()) { 146 //Log() << Verbose( 5) << *endpoints[i] << " has no more lines it's attached to, erasing." << endl;180 //Log() << Verbose(0) << *endpoints[i] << " has no more lines it's attached to, erasing." << endl; 147 181 if (endpoints[i] != NULL) { 148 182 delete(endpoints[i]); … … 159 193 * \param *triangle to add 160 194 */ 161 void BoundaryLineSet::AddTriangle(class BoundaryTriangleSet *triangle) 162 { 163 Log() << Verbose(6) << "Add " << triangle->Nr << " to line " << *this << "." << endl; 195 void BoundaryLineSet::AddTriangle(BoundaryTriangleSet * const triangle) 196 { 197 Info FunctionInfo(__func__); 198 Log() << Verbose(0) << "Add " << triangle->Nr << " to line " << *this << "." << endl; 164 199 triangles.insert(TrianglePair(triangle->Nr, triangle)); 165 200 }; … … 169 204 * \return true - common endpoint present, false - not connected 170 205 */ 171 bool BoundaryLineSet::IsConnectedTo(class BoundaryLineSet *line) 172 { 206 bool BoundaryLineSet::IsConnectedTo(const BoundaryLineSet * const line) const 207 { 208 Info FunctionInfo(__func__); 173 209 if ((endpoints[0] == line->endpoints[0]) || (endpoints[1] == line->endpoints[0]) || (endpoints[0] == line->endpoints[1]) || (endpoints[1] == line->endpoints[1])) 174 210 return true; … … 183 219 * \return true - triangles are convex, false - concave or less than two triangles connected 184 220 */ 185 bool BoundaryLineSet::CheckConvexityCriterion() 186 { 221 bool BoundaryLineSet::CheckConvexityCriterion() const 222 { 223 Info FunctionInfo(__func__); 187 224 Vector BaseLineCenter, BaseLineNormal, BaseLine, helper[2], NormalCheck; 188 225 // get the two triangles 189 226 if (triangles.size() != 2) { 190 eLog() << Verbose( 1) << "Baseline " << *this << " is connected to less than two triangles, Tesselation incomplete!" << endl;227 eLog() << Verbose(0) << "Baseline " << *this << " is connected to less than two triangles, Tesselation incomplete!" << endl; 191 228 return true; 192 229 } 193 230 // check normal vectors 194 231 // have a normal vector on the base line pointing outwards 195 //Log() << Verbose( 3) << "INFO: " << *this << " has vectors at " << *(endpoints[0]->node->node) << " and at " << *(endpoints[1]->node->node) << "." << endl;232 //Log() << Verbose(0) << "INFO: " << *this << " has vectors at " << *(endpoints[0]->node->node) << " and at " << *(endpoints[1]->node->node) << "." << endl; 196 233 BaseLineCenter.CopyVector(endpoints[0]->node->node); 197 234 BaseLineCenter.AddVector(endpoints[1]->node->node); … … 199 236 BaseLine.CopyVector(endpoints[0]->node->node); 200 237 BaseLine.SubtractVector(endpoints[1]->node->node); 201 //Log() << Verbose( 3) << "INFO: Baseline is " << BaseLine << " and its center is at " << BaseLineCenter << "." << endl;238 //Log() << Verbose(0) << "INFO: Baseline is " << BaseLine << " and its center is at " << BaseLineCenter << "." << endl; 202 239 203 240 BaseLineNormal.Zero(); … … 206 243 int i=0; 207 244 class BoundaryPointSet *node = NULL; 208 for(TriangleMap:: iterator runner = triangles.begin(); runner != triangles.end(); runner++) {209 //Log() << Verbose( 3) << "INFO: NormalVector of " << *(runner->second) << " is " << runner->second->NormalVector << "." << endl;245 for(TriangleMap::const_iterator runner = triangles.begin(); runner != triangles.end(); runner++) { 246 //Log() << Verbose(0) << "INFO: NormalVector of " << *(runner->second) << " is " << runner->second->NormalVector << "." << endl; 210 247 NormalCheck.AddVector(&runner->second->NormalVector); 211 248 NormalCheck.Scale(sign); … … 214 251 BaseLineNormal.CopyVector(&runner->second->NormalVector); // yes, copy second on top of first 215 252 else { 216 Log() << Verbose(1) << "CRITICAL: Triangle " << *runner->second << " has zero normal vector!" << endl; 217 exit(255); 253 eLog() << Verbose(0) << "Triangle " << *runner->second << " has zero normal vector!" << endl; 218 254 } 219 255 node = runner->second->GetThirdEndpoint(this); 220 256 if (node != NULL) { 221 //Log() << Verbose( 3) << "INFO: Third node for triangle " << *(runner->second) << " is " << *node << " at " << *(node->node->node) << "." << endl;257 //Log() << Verbose(0) << "INFO: Third node for triangle " << *(runner->second) << " is " << *node << " at " << *(node->node->node) << "." << endl; 222 258 helper[i].CopyVector(node->node->node); 223 259 helper[i].SubtractVector(&BaseLineCenter); 224 260 helper[i].MakeNormalVector(&BaseLine); // we want to compare the triangle's heights' angles! 225 //Log() << Verbose( 4) << "INFO: Height vector with respect to baseline is " << helper[i] << "." << endl;261 //Log() << Verbose(0) << "INFO: Height vector with respect to baseline is " << helper[i] << "." << endl; 226 262 i++; 227 263 } else { 228 //eLog() << Verbose(1) << "I cannot find third node in triangle, something's wrong." << endl;264 eLog() << Verbose(1) << "I cannot find third node in triangle, something's wrong." << endl; 229 265 return true; 230 266 } 231 267 } 232 //Log() << Verbose( 3) << "INFO: BaselineNormal is " << BaseLineNormal << "." << endl;268 //Log() << Verbose(0) << "INFO: BaselineNormal is " << BaseLineNormal << "." << endl; 233 269 if (NormalCheck.NormSquared() < MYEPSILON) { 234 Log() << Verbose( 3) << "ACCEPT: Normalvectors of both triangles are the same: convex." << endl;270 Log() << Verbose(0) << "ACCEPT: Normalvectors of both triangles are the same: convex." << endl; 235 271 return true; 236 272 } … … 238 274 double angle = GetAngle(helper[0], helper[1], BaseLineNormal); 239 275 if ((angle - M_PI) > -MYEPSILON) { 240 Log() << Verbose( 3) << "ACCEPT: Angle is greater than pi: convex." << endl;276 Log() << Verbose(0) << "ACCEPT: Angle is greater than pi: convex." << endl; 241 277 return true; 242 278 } else { 243 Log() << Verbose( 3) << "REJECT: Angle is less than pi: concave." << endl;279 Log() << Verbose(0) << "REJECT: Angle is less than pi: concave." << endl; 244 280 return false; 245 281 } … … 250 286 * \return true - point is of the line, false - is not 251 287 */ 252 bool BoundaryLineSet::ContainsBoundaryPoint(class BoundaryPointSet *point) 253 { 288 bool BoundaryLineSet::ContainsBoundaryPoint(const BoundaryPointSet * const point) const 289 { 290 Info FunctionInfo(__func__); 254 291 for(int i=0;i<2;i++) 255 292 if (point == endpoints[i]) … … 262 299 * \return NULL - if endpoint not contained in BoundaryLineSet, or pointer to BoundaryPointSet otherwise 263 300 */ 264 class BoundaryPointSet *BoundaryLineSet::GetOtherEndpoint(class BoundaryPointSet *point) 265 { 301 class BoundaryPointSet *BoundaryLineSet::GetOtherEndpoint(const BoundaryPointSet * const point) const 302 { 303 Info FunctionInfo(__func__); 266 304 if (endpoints[0] == point) 267 305 return endpoints[1]; … … 286 324 /** Constructor for BoundaryTriangleSet. 287 325 */ 288 BoundaryTriangleSet::BoundaryTriangleSet() 289 { 326 BoundaryTriangleSet::BoundaryTriangleSet() : 327 Nr(-1) 328 { 329 Info FunctionInfo(__func__); 290 330 for (int i = 0; i < 3; i++) 291 331 { … … 293 333 lines[i] = NULL; 294 334 } 295 Nr = -1;296 335 }; 297 336 … … 300 339 * \param number number of triangle 301 340 */ 302 BoundaryTriangleSet::BoundaryTriangleSet(class BoundaryLineSet *line[3], int number) 303 { 341 BoundaryTriangleSet::BoundaryTriangleSet(class BoundaryLineSet * const line[3], const int number) : 342 Nr(number) 343 { 344 Info FunctionInfo(__func__); 304 345 // set number 305 Nr = number;306 346 // set lines 307 Log() << Verbose(5) << "New triangle " << Nr << ":" << endl; 308 for (int i = 0; i < 3; i++) 309 { 310 lines[i] = line[i]; 311 lines[i]->AddTriangle(this); 312 } 347 for (int i = 0; i < 3; i++) { 348 lines[i] = line[i]; 349 lines[i]->AddTriangle(this); 350 } 313 351 // get ascending order of endpoints 314 map<int, class BoundaryPointSet *>OrderMap;352 PointMap OrderMap; 315 353 for (int i = 0; i < 3; i++) 316 354 // for all three lines 317 for (int j = 0; j < 2; j++) 318 { // for both endpoints 319 OrderMap.insert(pair<int, class BoundaryPointSet *> ( 320 line[i]->endpoints[j]->Nr, line[i]->endpoints[j])); 321 // and we don't care whether insertion fails 322 } 355 for (int j = 0; j < 2; j++) { // for both endpoints 356 OrderMap.insert(pair<int, class BoundaryPointSet *> ( 357 line[i]->endpoints[j]->Nr, line[i]->endpoints[j])); 358 // and we don't care whether insertion fails 359 } 323 360 // set endpoints 324 361 int Counter = 0; 325 Log() << Verbose(6) << " with end points "; 326 for (map<int, class BoundaryPointSet *>::iterator runner = OrderMap.begin(); runner 327 != OrderMap.end(); runner++) 328 { 329 endpoints[Counter] = runner->second; 330 Log() << Verbose(0) << " " << *endpoints[Counter]; 331 Counter++; 332 } 333 if (Counter < 3) 334 { 335 eLog() << Verbose(0) << "ERROR! We have a triangle with only two distinct endpoints!" << endl; 336 performCriticalExit(); 337 } 338 Log() << Verbose(0) << "." << endl; 362 Log() << Verbose(0) << "New triangle " << Nr << " with end points: " << endl; 363 for (PointMap::iterator runner = OrderMap.begin(); runner != OrderMap.end(); runner++) { 364 endpoints[Counter] = runner->second; 365 Log() << Verbose(0) << " " << *endpoints[Counter] << endl; 366 Counter++; 367 } 368 if (Counter < 3) { 369 eLog() << Verbose(0) << "We have a triangle with only two distinct endpoints!" << endl; 370 performCriticalExit(); 371 } 339 372 }; 340 373 … … 345 378 BoundaryTriangleSet::~BoundaryTriangleSet() 346 379 { 380 Info FunctionInfo(__func__); 347 381 for (int i = 0; i < 3; i++) { 348 382 if (lines[i] != NULL) { 349 383 if (lines[i]->triangles.erase(Nr)) { 350 //Log() << Verbose( 5) << "Triangle Nr." << Nr << " erased in line " << *lines[i] << "." << endl;384 //Log() << Verbose(0) << "Triangle Nr." << Nr << " erased in line " << *lines[i] << "." << endl; 351 385 } 352 386 if (lines[i]->triangles.empty()) { 353 //Log() << Verbose( 5) << *lines[i] << " is no more attached to any triangle, erasing." << endl;387 //Log() << Verbose(0) << *lines[i] << " is no more attached to any triangle, erasing." << endl; 354 388 delete (lines[i]); 355 389 lines[i] = NULL; … … 357 391 } 358 392 } 359 //Log() << Verbose( 5) << "Erasing triangle Nr." << Nr << " itself." << endl;393 //Log() << Verbose(0) << "Erasing triangle Nr." << Nr << " itself." << endl; 360 394 }; 361 395 … … 364 398 * \param &OtherVector direction vector to make normal vector unique. 365 399 */ 366 void BoundaryTriangleSet::GetNormalVector(Vector &OtherVector) 367 { 400 void BoundaryTriangleSet::GetNormalVector(const Vector &OtherVector) 401 { 402 Info FunctionInfo(__func__); 368 403 // get normal vector 369 404 NormalVector.MakeNormalVector(endpoints[0]->node->node, endpoints[1]->node->node, endpoints[2]->node->node); … … 372 407 if (NormalVector.ScalarProduct(&OtherVector) > 0.) 373 408 NormalVector.Scale(-1.); 374 }; 375 376 /** Finds the point on the triangle \a *BTS the line defined by \a *MolCenter and \a *x crosses through. 409 Log() << Verbose(1) << "Normal Vector is " << NormalVector << "." << endl; 410 }; 411 412 /** Finds the point on the triangle \a *BTS through which the line defined by \a *MolCenter and \a *x crosses. 377 413 * We call Vector::GetIntersectionWithPlane() to receive the intersection point with the plane 378 * Th is we test if it's really on the plane and whether it's inside the triangle on the plane or not.414 * Thus we test if it's really on the plane and whether it's inside the triangle on the plane or not. 379 415 * The latter is done as follows: We calculate the cross point of one of the triangle's baseline with the line 380 416 * given by the intersection and the third basepoint. Then, we check whether it's on the baseline (i.e. between … … 386 422 * \return true - \a *Intersection contains intersection on plane defined by triangle, false - zero vector if outside of triangle. 387 423 */ 388 bool BoundaryTriangleSet::GetIntersectionInsideTriangle(Vector *MolCenter, Vector *x, Vector *Intersection) 389 { 424 bool BoundaryTriangleSet::GetIntersectionInsideTriangle(const Vector * const MolCenter, const Vector * const x, Vector * const Intersection) const 425 { 426 Info FunctionInfo(__func__); 390 427 Vector CrossPoint; 391 428 Vector helper; 392 429 393 430 if (!Intersection->GetIntersectionWithPlane(&NormalVector, endpoints[0]->node->node, MolCenter, x)) { 394 Log() << Verbose(1) << "Alas! Intersection with plane failed - at least numerically - the intersection is not on the plane!" << endl;431 eLog() << Verbose(1) << "Alas! Intersection with plane failed - at least numerically - the intersection is not on the plane!" << endl; 395 432 return false; 396 433 } 397 434 435 Log() << Verbose(1) << "INFO: Triangle is " << *this << "." << endl; 436 Log() << Verbose(1) << "INFO: Line is from " << *MolCenter << " to " << *x << "." << endl; 437 Log() << Verbose(1) << "INFO: Intersection is " << *Intersection << "." << endl; 438 439 if (Intersection->DistanceSquared(endpoints[0]->node->node) < MYEPSILON) { 440 Log() << Verbose(1) << "Intersection coindices with first endpoint." << endl; 441 return true; 442 } else if (Intersection->DistanceSquared(endpoints[1]->node->node) < MYEPSILON) { 443 Log() << Verbose(1) << "Intersection coindices with second endpoint." << endl; 444 return true; 445 } else if (Intersection->DistanceSquared(endpoints[2]->node->node) < MYEPSILON) { 446 Log() << Verbose(1) << "Intersection coindices with third endpoint." << endl; 447 return true; 448 } 398 449 // Calculate cross point between one baseline and the line from the third endpoint to intersection 399 450 int i=0; … … 402 453 helper.CopyVector(endpoints[(i+1)%3]->node->node); 403 454 helper.SubtractVector(endpoints[i%3]->node->node); 455 CrossPoint.SubtractVector(endpoints[i%3]->node->node); // cross point was returned as absolute vector 456 const double s = CrossPoint.ScalarProduct(&helper)/helper.NormSquared(); 457 Log() << Verbose(1) << "INFO: Factor s is " << s << "." << endl; 458 if ((s < -MYEPSILON) || ((s-1.) > MYEPSILON)) { 459 Log() << Verbose(1) << "INFO: Crosspoint " << CrossPoint << "outside of triangle." << endl; 460 i=4; 461 break; 462 } 463 i++; 404 464 } else 405 i++;406 if (i>2)407 465 break; 408 } while ( CrossPoint.NormSquared() < MYEPSILON);466 } while (i<3); 409 467 if (i==3) { 410 eLog() << Verbose(1) << "Could not find any cross points, something's utterly wrong here!" << endl; 411 exit(255); 412 } 413 CrossPoint.SubtractVector(endpoints[i%3]->node->node); // cross point was returned as absolute vector 414 415 // check whether intersection is inside or not by comparing length of intersection and length of cross point 416 if ((CrossPoint.NormSquared() - helper.NormSquared()) < MYEPSILON) { // inside 468 Log() << Verbose(1) << "INFO: Crosspoint " << CrossPoint << " inside of triangle." << endl; 417 469 return true; 418 } else { // outside!419 Intersection->Zero();470 } else { 471 Log() << Verbose(1) << "INFO: Crosspoint " << CrossPoint << " outside of triangle." << endl; 420 472 return false; 421 473 } 474 }; 475 476 /** Finds the point on the triangle \a *BTS through which the line defined by \a *MolCenter and \a *x crosses. 477 * We call Vector::GetIntersectionWithPlane() to receive the intersection point with the plane 478 * Thus we test if it's really on the plane and whether it's inside the triangle on the plane or not. 479 * The latter is done as follows: We calculate the cross point of one of the triangle's baseline with the line 480 * given by the intersection and the third basepoint. Then, we check whether it's on the baseline (i.e. between 481 * the first two basepoints) or not. 482 * \param *x point 483 * \param *ClosestPoint desired closest point inside triangle to \a *x, is absolute vector 484 * \return Distance squared between \a *x and closest point inside triangle 485 */ 486 double BoundaryTriangleSet::GetClosestPointInsideTriangle(const Vector * const x, Vector * const ClosestPoint) const 487 { 488 Info FunctionInfo(__func__); 489 Vector Direction; 490 491 // 1. get intersection with plane 492 Log() << Verbose(1) << "INFO: Looking for closest point of triangle " << *this << " to " << *x << "." << endl; 493 GetCenter(&Direction); 494 if (!ClosestPoint->GetIntersectionWithPlane(&NormalVector, endpoints[0]->node->node, x, &Direction)) { 495 ClosestPoint->CopyVector(x); 496 } 497 498 // 2. Calculate in plane part of line (x, intersection) 499 Vector InPlane; 500 InPlane.CopyVector(x); 501 InPlane.SubtractVector(ClosestPoint); // points from plane intersection to straight-down point 502 InPlane.ProjectOntoPlane(&NormalVector); 503 InPlane.AddVector(ClosestPoint); 504 505 Log() << Verbose(2) << "INFO: Triangle is " << *this << "." << endl; 506 Log() << Verbose(2) << "INFO: Line is from " << Direction << " to " << *x << "." << endl; 507 Log() << Verbose(2) << "INFO: In-plane part is " << InPlane << "." << endl; 508 509 // Calculate cross point between one baseline and the desired point such that distance is shortest 510 double ShortestDistance = -1.; 511 bool InsideFlag = false; 512 Vector CrossDirection[3]; 513 Vector CrossPoint[3]; 514 Vector helper; 515 for (int i=0;i<3;i++) { 516 // treat direction of line as normal of a (cut)plane and the desired point x as the plane offset, the intersect line with point 517 Direction.CopyVector(endpoints[(i+1)%3]->node->node); 518 Direction.SubtractVector(endpoints[i%3]->node->node); 519 // calculate intersection, line can never be parallel to Direction (is the same vector as PlaneNormal); 520 CrossPoint[i].GetIntersectionWithPlane(&Direction, &InPlane, endpoints[i%3]->node->node, endpoints[(i+1)%3]->node->node); 521 CrossDirection[i].CopyVector(&CrossPoint[i]); 522 CrossDirection[i].SubtractVector(&InPlane); 523 CrossPoint[i].SubtractVector(endpoints[i%3]->node->node); // cross point was returned as absolute vector 524 const double s = CrossPoint[i].ScalarProduct(&Direction)/Direction.NormSquared(); 525 Log() << Verbose(2) << "INFO: Factor s is " << s << "." << endl; 526 if ((s >= -MYEPSILON) && ((s-1.) <= MYEPSILON)) { 527 CrossPoint[i].AddVector(endpoints[i%3]->node->node); // make cross point absolute again 528 Log() << Verbose(2) << "INFO: Crosspoint is " << CrossPoint[i] << ", intersecting BoundaryLine between " << *endpoints[i%3]->node->node << " and " << *endpoints[(i+1)%3]->node->node << "." << endl; 529 const double distance = CrossPoint[i].DistanceSquared(x); 530 if ((ShortestDistance < 0.) || (ShortestDistance > distance)) { 531 ShortestDistance = distance; 532 ClosestPoint->CopyVector(&CrossPoint[i]); 533 } 534 } else 535 CrossPoint[i].Zero(); 536 } 537 InsideFlag = true; 538 for (int i=0;i<3;i++) { 539 const double sign = CrossDirection[i].ScalarProduct(&CrossDirection[(i+1)%3]); 540 const double othersign = CrossDirection[i].ScalarProduct(&CrossDirection[(i+2)%3]);; 541 if ((sign > -MYEPSILON) && (othersign > -MYEPSILON)) // have different sign 542 InsideFlag = false; 543 } 544 if (InsideFlag) { 545 ClosestPoint->CopyVector(&InPlane); 546 ShortestDistance = InPlane.DistanceSquared(x); 547 } else { // also check endnodes 548 for (int i=0;i<3;i++) { 549 const double distance = x->DistanceSquared(endpoints[i]->node->node); 550 if ((ShortestDistance < 0.) || (ShortestDistance > distance)) { 551 ShortestDistance = distance; 552 ClosestPoint->CopyVector(endpoints[i]->node->node); 553 } 554 } 555 } 556 Log() << Verbose(1) << "INFO: Closest Point is " << *ClosestPoint << " with shortest squared distance is " << ShortestDistance << "." << endl; 557 return ShortestDistance; 422 558 }; 423 559 … … 426 562 * \return true - line is of the triangle, false - is not 427 563 */ 428 bool BoundaryTriangleSet::ContainsBoundaryLine(class BoundaryLineSet *line) 429 { 564 bool BoundaryTriangleSet::ContainsBoundaryLine(const BoundaryLineSet * const line) const 565 { 566 Info FunctionInfo(__func__); 430 567 for(int i=0;i<3;i++) 431 568 if (line == lines[i]) … … 438 575 * \return true - point is of the triangle, false - is not 439 576 */ 440 bool BoundaryTriangleSet::ContainsBoundaryPoint(class BoundaryPointSet *point) 441 { 577 bool BoundaryTriangleSet::ContainsBoundaryPoint(const BoundaryPointSet * const point) const 578 { 579 Info FunctionInfo(__func__); 442 580 for(int i=0;i<3;i++) 443 581 if (point == endpoints[i]) … … 450 588 * \return true - point is of the triangle, false - is not 451 589 */ 452 bool BoundaryTriangleSet::ContainsBoundaryPoint(class TesselPoint *point) 453 { 590 bool BoundaryTriangleSet::ContainsBoundaryPoint(const TesselPoint * const point) const 591 { 592 Info FunctionInfo(__func__); 454 593 for(int i=0;i<3;i++) 455 594 if (point == endpoints[i]->node) … … 462 601 * \return true - is the very triangle, false - is not 463 602 */ 464 bool BoundaryTriangleSet::IsPresentTupel(class BoundaryPointSet *Points[3]) 465 { 603 bool BoundaryTriangleSet::IsPresentTupel(const BoundaryPointSet * const Points[3]) const 604 { 605 Info FunctionInfo(__func__); 606 Log() << Verbose(1) << "INFO: Checking " << Points[0] << "," << Points[1] << "," << Points[2] << " against " << endpoints[0] << "," << endpoints[1] << "," << endpoints[2] << "." << endl; 466 607 return (((endpoints[0] == Points[0]) 467 608 || (endpoints[0] == Points[1]) … … 483 624 * \return true - is the very triangle, false - is not 484 625 */ 485 bool BoundaryTriangleSet::IsPresentTupel(class BoundaryTriangleSet *T) 486 { 626 bool BoundaryTriangleSet::IsPresentTupel(const BoundaryTriangleSet * const T) const 627 { 628 Info FunctionInfo(__func__); 487 629 return (((endpoints[0] == T->endpoints[0]) 488 630 || (endpoints[0] == T->endpoints[1]) … … 504 646 * \return pointer third endpoint or NULL if line does not belong to triangle. 505 647 */ 506 class BoundaryPointSet *BoundaryTriangleSet::GetThirdEndpoint(class BoundaryLineSet *line) 507 { 648 class BoundaryPointSet *BoundaryTriangleSet::GetThirdEndpoint(const BoundaryLineSet * const line) const 649 { 650 Info FunctionInfo(__func__); 508 651 // sanity check 509 652 if (!ContainsBoundaryLine(line)) … … 520 663 * \param *center central point on return. 521 664 */ 522 void BoundaryTriangleSet::GetCenter(Vector *center) 523 { 665 void BoundaryTriangleSet::GetCenter(Vector * const center) const 666 { 667 Info FunctionInfo(__func__); 524 668 center->Zero(); 525 669 for(int i=0;i<3;i++) 526 670 center->AddVector(endpoints[i]->node->node); 527 671 center->Scale(1./3.); 672 Log() << Verbose(1) << "INFO: Center is at " << *center << "." << endl; 528 673 } 529 674 … … 534 679 ostream &operator <<(ostream &ost, const BoundaryTriangleSet &a) 535 680 { 536 ost << "[" << a.Nr << "|" << a.endpoints[0]->node->Name << " at " << *a.endpoints[0]->node->node << "," 537 << a.endpoints[1]->node->Name << " at " << *a.endpoints[1]->node->node << "," << a.endpoints[2]->node->Name << " at " << *a.endpoints[2]->node->node << "]"; 681 ost << "[" << a.Nr << "|" << a.endpoints[0]->node->Name << "," << a.endpoints[1]->node->Name << "," << a.endpoints[2]->node->Name << "]"; 682 // ost << "[" << a.Nr << "|" << a.endpoints[0]->node->Name << " at " << *a.endpoints[0]->node->node << "," 683 // << a.endpoints[1]->node->Name << " at " << *a.endpoints[1]->node->node << "," << a.endpoints[2]->node->Name << " at " << *a.endpoints[2]->node->node << "]"; 538 684 return ost; 539 685 }; 540 686 687 // ======================================== Polygons on Boundary ================================= 688 689 /** Constructor for BoundaryPolygonSet. 690 */ 691 BoundaryPolygonSet::BoundaryPolygonSet() : 692 Nr(-1) 693 { 694 Info FunctionInfo(__func__); 695 }; 696 697 /** Destructor of BoundaryPolygonSet. 698 * Just clears endpoints. 699 * \note When removing triangles from a class Tesselation, use RemoveTesselationTriangle() 700 */ 701 BoundaryPolygonSet::~BoundaryPolygonSet() 702 { 703 Info FunctionInfo(__func__); 704 endpoints.clear(); 705 Log() << Verbose(1) << "Erasing polygon Nr." << Nr << " itself." << endl; 706 }; 707 708 /** Calculates the normal vector for this triangle. 709 * Is made unique by comparison with \a OtherVector to point in the other direction. 710 * \param &OtherVector direction vector to make normal vector unique. 711 * \return allocated vector in normal direction 712 */ 713 Vector * BoundaryPolygonSet::GetNormalVector(const Vector &OtherVector) const 714 { 715 Info FunctionInfo(__func__); 716 // get normal vector 717 Vector TemporaryNormal; 718 Vector *TotalNormal = new Vector; 719 PointSet::const_iterator Runner[3]; 720 for (int i=0;i<3; i++) { 721 Runner[i] = endpoints.begin(); 722 for (int j = 0; j<i; j++) { // go as much further 723 Runner[i]++; 724 if (Runner[i] == endpoints.end()) { 725 eLog() << Verbose(0) << "There are less than three endpoints in the polygon!" << endl; 726 performCriticalExit(); 727 } 728 } 729 } 730 TotalNormal->Zero(); 731 int counter=0; 732 for (; Runner[2] != endpoints.end(); ) { 733 TemporaryNormal.MakeNormalVector((*Runner[0])->node->node, (*Runner[1])->node->node, (*Runner[2])->node->node); 734 for (int i=0;i<3;i++) // increase each of them 735 Runner[i]++; 736 TotalNormal->AddVector(&TemporaryNormal); 737 } 738 TotalNormal->Scale(1./(double)counter); 739 740 // make it always point inward (any offset vector onto plane projected onto normal vector suffices) 741 if (TotalNormal->ScalarProduct(&OtherVector) > 0.) 742 TotalNormal->Scale(-1.); 743 Log() << Verbose(1) << "Normal Vector is " << *TotalNormal << "." << endl; 744 745 return TotalNormal; 746 }; 747 748 /** Calculates the center point of the triangle. 749 * Is third of the sum of all endpoints. 750 * \param *center central point on return. 751 */ 752 void BoundaryPolygonSet::GetCenter(Vector * const center) const 753 { 754 Info FunctionInfo(__func__); 755 center->Zero(); 756 int counter = 0; 757 for(PointSet::const_iterator Runner = endpoints.begin(); Runner != endpoints.end(); Runner++) { 758 center->AddVector((*Runner)->node->node); 759 counter++; 760 } 761 center->Scale(1./(double)counter); 762 Log() << Verbose(1) << "Center is at " << *center << "." << endl; 763 } 764 765 /** Checks whether the polygons contains all three endpoints of the triangle. 766 * \param *triangle triangle to test 767 * \return true - triangle is contained polygon, false - is not 768 */ 769 bool BoundaryPolygonSet::ContainsBoundaryTriangle(const BoundaryTriangleSet * const triangle) const 770 { 771 Info FunctionInfo(__func__); 772 return ContainsPresentTupel(triangle->endpoints, 3); 773 }; 774 775 /** Checks whether the polygons contains both endpoints of the line. 776 * \param *line line to test 777 * \return true - line is of the triangle, false - is not 778 */ 779 bool BoundaryPolygonSet::ContainsBoundaryLine(const BoundaryLineSet * const line) const 780 { 781 Info FunctionInfo(__func__); 782 return ContainsPresentTupel(line->endpoints, 2); 783 }; 784 785 /** Checks whether point is any of the three endpoints this triangle contains. 786 * \param *point point to test 787 * \return true - point is of the triangle, false - is not 788 */ 789 bool BoundaryPolygonSet::ContainsBoundaryPoint(const BoundaryPointSet * const point) const 790 { 791 Info FunctionInfo(__func__); 792 for(PointSet::const_iterator Runner = endpoints.begin(); Runner != endpoints.end(); Runner++) { 793 Log() << Verbose(0) << "Checking against " << **Runner << endl; 794 if (point == (*Runner)) { 795 Log() << Verbose(0) << " Contained." << endl; 796 return true; 797 } 798 } 799 Log() << Verbose(0) << " Not contained." << endl; 800 return false; 801 }; 802 803 /** Checks whether point is any of the three endpoints this triangle contains. 804 * \param *point TesselPoint to test 805 * \return true - point is of the triangle, false - is not 806 */ 807 bool BoundaryPolygonSet::ContainsBoundaryPoint(const TesselPoint * const point) const 808 { 809 Info FunctionInfo(__func__); 810 for(PointSet::const_iterator Runner = endpoints.begin(); Runner != endpoints.end(); Runner++) 811 if (point == (*Runner)->node) { 812 Log() << Verbose(0) << " Contained." << endl; 813 return true; 814 } 815 Log() << Verbose(0) << " Not contained." << endl; 816 return false; 817 }; 818 819 /** Checks whether given array of \a *Points coincide with polygons's endpoints. 820 * \param **Points pointer to an array of BoundaryPointSet 821 * \param dim dimension of array 822 * \return true - set of points is contained in polygon, false - is not 823 */ 824 bool BoundaryPolygonSet::ContainsPresentTupel(const BoundaryPointSet * const * Points, const int dim) const 825 { 826 Info FunctionInfo(__func__); 827 int counter = 0; 828 Log() << Verbose(1) << "Polygon is " << *this << endl; 829 for(int i=0;i<dim;i++) { 830 Log() << Verbose(1) << " Testing endpoint " << *Points[i] << endl; 831 if (ContainsBoundaryPoint(Points[i])) { 832 counter++; 833 } 834 } 835 836 if (counter == dim) 837 return true; 838 else 839 return false; 840 }; 841 842 /** Checks whether given PointList coincide with polygons's endpoints. 843 * \param &endpoints PointList 844 * \return true - set of points is contained in polygon, false - is not 845 */ 846 bool BoundaryPolygonSet::ContainsPresentTupel(const PointSet &endpoints) const 847 { 848 Info FunctionInfo(__func__); 849 size_t counter = 0; 850 Log() << Verbose(1) << "Polygon is " << *this << endl; 851 for(PointSet::const_iterator Runner = endpoints.begin(); Runner != endpoints.end(); Runner++) { 852 Log() << Verbose(1) << " Testing endpoint " << **Runner << endl; 853 if (ContainsBoundaryPoint(*Runner)) 854 counter++; 855 } 856 857 if (counter == endpoints.size()) 858 return true; 859 else 860 return false; 861 }; 862 863 /** Checks whether given set of \a *Points coincide with polygons's endpoints. 864 * \param *P pointer to BoundaryPolygonSet 865 * \return true - is the very triangle, false - is not 866 */ 867 bool BoundaryPolygonSet::ContainsPresentTupel(const BoundaryPolygonSet * const P) const 868 { 869 return ContainsPresentTupel((const PointSet)P->endpoints); 870 }; 871 872 /** Gathers all the endpoints' triangles in a unique set. 873 * \return set of all triangles 874 */ 875 TriangleSet * BoundaryPolygonSet::GetAllContainedTrianglesFromEndpoints() const 876 { 877 Info FunctionInfo(__func__); 878 pair <TriangleSet::iterator, bool> Tester; 879 TriangleSet *triangles = new TriangleSet; 880 881 for(PointSet::const_iterator Runner = endpoints.begin(); Runner != endpoints.end(); Runner++) 882 for(LineMap::const_iterator Walker = (*Runner)->lines.begin(); Walker != (*Runner)->lines.end(); Walker++) 883 for(TriangleMap::const_iterator Sprinter = (Walker->second)->triangles.begin(); Sprinter != (Walker->second)->triangles.end(); Sprinter++) { 884 //Log() << Verbose(0) << " Testing triangle " << *(Sprinter->second) << endl; 885 if (ContainsBoundaryTriangle(Sprinter->second)) { 886 Tester = triangles->insert(Sprinter->second); 887 if (Tester.second) 888 Log() << Verbose(0) << "Adding triangle " << *(Sprinter->second) << endl; 889 } 890 } 891 892 Log() << Verbose(1) << "The Polygon of " << endpoints.size() << " endpoints has " << triangles->size() << " unique triangles in total." << endl; 893 return triangles; 894 }; 895 896 /** Fills the endpoints of this polygon from the triangles attached to \a *line. 897 * \param *line lines with triangles attached 898 * \return true - polygon contains endpoints, false - line was NULL 899 */ 900 bool BoundaryPolygonSet::FillPolygonFromTrianglesOfLine(const BoundaryLineSet * const line) 901 { 902 Info FunctionInfo(__func__); 903 pair <PointSet::iterator, bool> Tester; 904 if (line == NULL) 905 return false; 906 Log() << Verbose(1) << "Filling polygon from line " << *line << endl; 907 for(TriangleMap::const_iterator Runner = line->triangles.begin(); Runner != line->triangles.end(); Runner++) { 908 for (int i=0;i<3;i++) { 909 Tester = endpoints.insert((Runner->second)->endpoints[i]); 910 if (Tester.second) 911 Log() << Verbose(1) << " Inserting endpoint " << *((Runner->second)->endpoints[i]) << endl; 912 } 913 } 914 915 return true; 916 }; 917 918 /** output operator for BoundaryPolygonSet. 919 * \param &ost output stream 920 * \param &a boundary polygon 921 */ 922 ostream &operator <<(ostream &ost, const BoundaryPolygonSet &a) 923 { 924 ost << "[" << a.Nr << "|"; 925 for(PointSet::const_iterator Runner = a.endpoints.begin(); Runner != a.endpoints.end();) { 926 ost << (*Runner)->node->Name; 927 Runner++; 928 if (Runner != a.endpoints.end()) 929 ost << ","; 930 } 931 ost<< "]"; 932 return ost; 933 }; 934 541 935 // =========================================================== class TESSELPOINT =========================================== 542 936 … … 545 939 TesselPoint::TesselPoint() 546 940 { 941 //Info FunctionInfo(__func__); 547 942 node = NULL; 548 943 nr = -1; … … 554 949 TesselPoint::~TesselPoint() 555 950 { 951 //Info FunctionInfo(__func__); 556 952 }; 557 953 … … 568 964 ostream & TesselPoint::operator << (ostream &ost) 569 965 { 570 ost << "[" << (Name) << "|" << this << "]"; 966 Info FunctionInfo(__func__); 967 ost << "[" << (nr) << "|" << this << "]"; 571 968 return ost; 572 969 }; … … 579 976 PointCloud::PointCloud() 580 977 { 581 978 //Info FunctionInfo(__func__); 582 979 }; 583 980 … … 586 983 PointCloud::~PointCloud() 587 984 { 588 985 //Info FunctionInfo(__func__); 589 986 }; 590 987 … … 593 990 /** Constructor of class CandidateForTesselation. 594 991 */ 595 CandidateForTesselation::CandidateForTesselation(TesselPoint *candidate, BoundaryLineSet* line, Vector OptCandidateCenter, Vector OtherOptCandidateCenter) { 596 point = candidate; 597 BaseLine = line; 992 CandidateForTesselation::CandidateForTesselation (BoundaryLineSet* line) : 993 BaseLine(line), 994 ShortestAngle(2.*M_PI), 995 OtherShortestAngle(2.*M_PI) 996 { 997 Info FunctionInfo(__func__); 998 }; 999 1000 1001 /** Constructor of class CandidateForTesselation. 1002 */ 1003 CandidateForTesselation::CandidateForTesselation (TesselPoint *candidate, BoundaryLineSet* line, Vector OptCandidateCenter, Vector OtherOptCandidateCenter) : 1004 BaseLine(line), 1005 ShortestAngle(2.*M_PI), 1006 OtherShortestAngle(2.*M_PI) 1007 { 1008 Info FunctionInfo(__func__); 598 1009 OptCenter.CopyVector(&OptCandidateCenter); 599 1010 OtherOptCenter.CopyVector(&OtherOptCandidateCenter); … … 603 1014 */ 604 1015 CandidateForTesselation::~CandidateForTesselation() { 605 point = NULL;606 1016 BaseLine = NULL; 607 1017 }; 608 1018 1019 /** output operator for CandidateForTesselation. 1020 * \param &ost output stream 1021 * \param &a boundary line 1022 */ 1023 ostream & operator <<(ostream &ost, const CandidateForTesselation &a) 1024 { 1025 ost << "[" << a.BaseLine->Nr << "|" << a.BaseLine->endpoints[0]->node->Name << "," << a.BaseLine->endpoints[1]->node->Name << "] with "; 1026 if (a.pointlist.empty()) 1027 ost << "no candidate."; 1028 else { 1029 ost << "candidate"; 1030 if (a.pointlist.size() != 1) 1031 ost << "s "; 1032 else 1033 ost << " "; 1034 for (TesselPointList::const_iterator Runner = a.pointlist.begin(); Runner != a.pointlist.end(); Runner++) 1035 ost << *(*Runner) << " "; 1036 ost << " at angle " << (a.ShortestAngle)<< "."; 1037 } 1038 1039 return ost; 1040 }; 1041 1042 609 1043 // =========================================================== class TESSELATION =========================================== 610 1044 611 1045 /** Constructor of class Tesselation. 612 1046 */ 613 Tesselation::Tesselation() 614 { 615 PointsOnBoundaryCount = 0; 616 LinesOnBoundaryCount = 0; 617 TrianglesOnBoundaryCount = 0; 618 InternalPointer = PointsOnBoundary.begin(); 619 LastTriangle = NULL; 620 TriangleFilesWritten = 0; 1047 Tesselation::Tesselation() : 1048 PointsOnBoundaryCount(0), 1049 LinesOnBoundaryCount(0), 1050 TrianglesOnBoundaryCount(0), 1051 LastTriangle(NULL), 1052 TriangleFilesWritten(0), 1053 InternalPointer(PointsOnBoundary.begin()) 1054 { 1055 Info FunctionInfo(__func__); 621 1056 } 622 1057 ; … … 627 1062 Tesselation::~Tesselation() 628 1063 { 629 Log() << Verbose(1) << "Free'ing TesselStruct ... " << endl; 1064 Info FunctionInfo(__func__); 1065 Log() << Verbose(0) << "Free'ing TesselStruct ... " << endl; 630 1066 for (TriangleMap::iterator runner = TrianglesOnBoundary.begin(); runner != TrianglesOnBoundary.end(); runner++) { 631 1067 if (runner->second != NULL) { … … 635 1071 eLog() << Verbose(1) << "The triangle " << runner->first << " has already been free'd." << endl; 636 1072 } 637 Log() << Verbose( 1) << "This envelope was written to file " << TriangleFilesWritten << " times(s)." << endl;1073 Log() << Verbose(0) << "This envelope was written to file " << TriangleFilesWritten << " times(s)." << endl; 638 1074 } 639 1075 ; … … 644 1080 Vector * Tesselation::GetCenter(ofstream *out) const 645 1081 { 1082 Info FunctionInfo(__func__); 646 1083 Vector *Center = new Vector(0.,0.,0.); 647 1084 int num=0; … … 659 1096 TesselPoint * Tesselation::GetPoint() const 660 1097 { 1098 Info FunctionInfo(__func__); 661 1099 return (InternalPointer->second->node); 662 1100 }; … … 667 1105 TesselPoint * Tesselation::GetTerminalPoint() const 668 1106 { 1107 Info FunctionInfo(__func__); 669 1108 PointMap::const_iterator Runner = PointsOnBoundary.end(); 670 1109 Runner--; … … 677 1116 void Tesselation::GoToNext() const 678 1117 { 1118 Info FunctionInfo(__func__); 679 1119 if (InternalPointer != PointsOnBoundary.end()) 680 1120 InternalPointer++; … … 686 1126 void Tesselation::GoToPrevious() const 687 1127 { 1128 Info FunctionInfo(__func__); 688 1129 if (InternalPointer != PointsOnBoundary.begin()) 689 1130 InternalPointer--; … … 695 1136 void Tesselation::GoToFirst() const 696 1137 { 1138 Info FunctionInfo(__func__); 697 1139 InternalPointer = PointsOnBoundary.begin(); 698 1140 }; … … 703 1145 void Tesselation::GoToLast() const 704 1146 { 1147 Info FunctionInfo(__func__); 705 1148 InternalPointer = PointsOnBoundary.end(); 706 1149 InternalPointer--; … … 712 1155 bool Tesselation::IsEmpty() const 713 1156 { 1157 Info FunctionInfo(__func__); 714 1158 return (PointsOnBoundary.empty()); 715 1159 }; … … 720 1164 bool Tesselation::IsEnd() const 721 1165 { 1166 Info FunctionInfo(__func__); 722 1167 return (InternalPointer == PointsOnBoundary.end()); 723 1168 }; … … 729 1174 * \param PointsOnBoundary set of boundary points defining the convex envelope of the cluster 730 1175 */ 731 void 732 Tesselation::GuessStartingTriangle() 733 { 1176 void Tesselation::GuessStartingTriangle() 1177 { 1178 Info FunctionInfo(__func__); 734 1179 // 4b. create a starting triangle 735 1180 // 4b1. create all distances … … 778 1223 baseline->second.first->second->node->node, 779 1224 baseline->second.second->second->node->node); 780 Log() << Verbose(2) << "Plane vector of candidate triangle is "; 781 PlaneVector.Output(); 782 Log() << Verbose(0) << endl; 1225 Log() << Verbose(2) << "Plane vector of candidate triangle is " << PlaneVector << endl; 783 1226 // 4. loop over all points 784 1227 double sign = 0.; … … 796 1239 if (fabs(distance) < 1e-4) // we need to have a small epsilon around 0 which is still ok 797 1240 continue; 798 Log() << Verbose(3) << "Projection of " << checker->second->node->Name 799 << " yields distance of " << distance << "." << endl; 1241 Log() << Verbose(2) << "Projection of " << checker->second->node->Name << " yields distance of " << distance << "." << endl; 800 1242 tmp = distance / fabs(distance); 801 1243 // 4b. Any have different sign to than before? (i.e. would lie outside convex hull with this starting triangle) … … 850 1292 if (checker == PointsOnBoundary.end()) 851 1293 { 852 Log() << Verbose( 0) << "Looks like we have a candidate!" << endl;1294 Log() << Verbose(2) << "Looks like we have a candidate!" << endl; 853 1295 break; 854 1296 } … … 880 1322 else 881 1323 { 882 Log() << Verbose(1) << "No starting triangle found." << endl; 883 exit(255); 1324 eLog() << Verbose(0) << "No starting triangle found." << endl; 884 1325 } 885 1326 } … … 901 1342 void Tesselation::TesselateOnBoundary(const PointCloud * const cloud) 902 1343 { 1344 Info FunctionInfo(__func__); 903 1345 bool flag; 904 1346 PointMap::iterator winner; … … 919 1361 // get peak point with respect to this base line's only triangle 920 1362 BTS = baseline->second->triangles.begin()->second; // there is only one triangle so far 921 Log() << Verbose( 2) << "Current baseline is between " << *(baseline->second) << "." << endl;1363 Log() << Verbose(0) << "Current baseline is between " << *(baseline->second) << "." << endl; 922 1364 for (int i = 0; i < 3; i++) 923 1365 if ((BTS->endpoints[i] != baseline->second->endpoints[0]) && (BTS->endpoints[i] != baseline->second->endpoints[1])) 924 1366 peak = BTS->endpoints[i]; 925 Log() << Verbose( 3) << " and has peak " << *peak << "." << endl;1367 Log() << Verbose(1) << " and has peak " << *peak << "." << endl; 926 1368 927 1369 // prepare some auxiliary vectors … … 938 1380 CenterVector.AddVector(BTS->endpoints[i]->node->node); 939 1381 CenterVector.Scale(1. / 3.); 940 Log() << Verbose( 4) << "CenterVector of base triangle is " << CenterVector << endl;1382 Log() << Verbose(2) << "CenterVector of base triangle is " << CenterVector << endl; 941 1383 942 1384 // normal vector of triangle … … 945 1387 BTS->GetNormalVector(NormalVector); 946 1388 NormalVector.CopyVector(&BTS->NormalVector); 947 Log() << Verbose( 4) << "NormalVector of base triangle is " << NormalVector << endl;1389 Log() << Verbose(2) << "NormalVector of base triangle is " << NormalVector << endl; 948 1390 949 1391 // vector in propagation direction (out of triangle) … … 952 1394 TempVector.CopyVector(&CenterVector); 953 1395 TempVector.SubtractVector(baseline->second->endpoints[0]->node->node); // TempVector is vector on triangle plane pointing from one baseline egde towards center! 954 //Log() << Verbose( 2) << "Projection of propagation onto temp: " << PropagationVector.Projection(&TempVector) << "." << endl;1396 //Log() << Verbose(0) << "Projection of propagation onto temp: " << PropagationVector.Projection(&TempVector) << "." << endl; 955 1397 if (PropagationVector.ScalarProduct(&TempVector) > 0) // make sure normal propagation vector points outward from baseline 956 1398 PropagationVector.Scale(-1.); 957 Log() << Verbose( 4) << "PropagationVector of base triangle is " << PropagationVector << endl;1399 Log() << Verbose(2) << "PropagationVector of base triangle is " << PropagationVector << endl; 958 1400 winner = PointsOnBoundary.end(); 959 1401 … … 961 1403 for (PointMap::iterator target = PointsOnBoundary.begin(); target != PointsOnBoundary.end(); target++) { 962 1404 if ((target->second != baseline->second->endpoints[0]) && (target->second != baseline->second->endpoints[1])) { // don't take the same endpoints 963 Log() << Verbose( 3) << "Target point is " << *(target->second) << ":" << endl;1405 Log() << Verbose(1) << "Target point is " << *(target->second) << ":" << endl; 964 1406 965 1407 // first check direction, so that triangles don't intersect … … 968 1410 VirtualNormalVector.ProjectOntoPlane(&NormalVector); 969 1411 TempAngle = VirtualNormalVector.Angle(&PropagationVector); 970 Log() << Verbose( 4) << "VirtualNormalVector is " << VirtualNormalVector << " and PropagationVector is " << PropagationVector << "." << endl;1412 Log() << Verbose(2) << "VirtualNormalVector is " << VirtualNormalVector << " and PropagationVector is " << PropagationVector << "." << endl; 971 1413 if (TempAngle > (M_PI/2.)) { // no bends bigger than Pi/2 (90 degrees) 972 Log() << Verbose( 4) << "Angle on triangle plane between propagation direction and base line to " << *(target->second) << " is " << TempAngle << ", bad direction!" << endl;1414 Log() << Verbose(2) << "Angle on triangle plane between propagation direction and base line to " << *(target->second) << " is " << TempAngle << ", bad direction!" << endl; 973 1415 continue; 974 1416 } else 975 Log() << Verbose( 4) << "Angle on triangle plane between propagation direction and base line to " << *(target->second) << " is " << TempAngle << ", good direction!" << endl;1417 Log() << Verbose(2) << "Angle on triangle plane between propagation direction and base line to " << *(target->second) << " is " << TempAngle << ", good direction!" << endl; 976 1418 977 1419 // check first and second endpoint (if any connecting line goes to target has at least not more than 1 triangle) … … 979 1421 LineChecker[1] = baseline->second->endpoints[1]->lines.find(target->first); 980 1422 if (((LineChecker[0] != baseline->second->endpoints[0]->lines.end()) && (LineChecker[0]->second->triangles.size() == 2))) { 981 Log() << Verbose( 4) << *(baseline->second->endpoints[0]) << " has line " << *(LineChecker[0]->second) << " to " << *(target->second) << " as endpoint with " << LineChecker[0]->second->triangles.size() << " triangles." << endl;1423 Log() << Verbose(2) << *(baseline->second->endpoints[0]) << " has line " << *(LineChecker[0]->second) << " to " << *(target->second) << " as endpoint with " << LineChecker[0]->second->triangles.size() << " triangles." << endl; 982 1424 continue; 983 1425 } 984 1426 if (((LineChecker[1] != baseline->second->endpoints[1]->lines.end()) && (LineChecker[1]->second->triangles.size() == 2))) { 985 Log() << Verbose( 4) << *(baseline->second->endpoints[1]) << " has line " << *(LineChecker[1]->second) << " to " << *(target->second) << " as endpoint with " << LineChecker[1]->second->triangles.size() << " triangles." << endl;1427 Log() << Verbose(2) << *(baseline->second->endpoints[1]) << " has line " << *(LineChecker[1]->second) << " to " << *(target->second) << " as endpoint with " << LineChecker[1]->second->triangles.size() << " triangles." << endl; 986 1428 continue; 987 1429 } … … 1000 1442 helper.ProjectOntoPlane(&TempVector); 1001 1443 if (fabs(helper.NormSquared()) < MYEPSILON) { 1002 Log() << Verbose( 4) << "Chosen set of vectors is linear dependent." << endl;1444 Log() << Verbose(2) << "Chosen set of vectors is linear dependent." << endl; 1003 1445 continue; 1004 1446 } … … 1017 1459 // calculate angle 1018 1460 TempAngle = NormalVector.Angle(&VirtualNormalVector); 1019 Log() << Verbose( 4) << "NormalVector is " << VirtualNormalVector << " and the angle is " << TempAngle << "." << endl;1461 Log() << Verbose(2) << "NormalVector is " << VirtualNormalVector << " and the angle is " << TempAngle << "." << endl; 1020 1462 if ((SmallestAngle - TempAngle) > MYEPSILON) { // set to new possible winner 1021 1463 SmallestAngle = TempAngle; 1022 1464 winner = target; 1023 Log() << Verbose( 4) << "New winner " << *winner->second->node << " due to smaller angle between normal vectors." << endl;1465 Log() << Verbose(2) << "New winner " << *winner->second->node << " due to smaller angle between normal vectors." << endl; 1024 1466 } else if (fabs(SmallestAngle - TempAngle) < MYEPSILON) { // check the angle to propagation, both possible targets are in one plane! (their normals have same angle) 1025 1467 // hence, check the angles to some normal direction from our base line but in this common plane of both targets... … … 1039 1481 SmallestAngle = TempAngle; 1040 1482 winner = target; 1041 Log() << Verbose( 4) << "New winner " << *winner->second->node << " due to smaller angle " << TempAngle << " to propagation direction." << endl;1483 Log() << Verbose(2) << "New winner " << *winner->second->node << " due to smaller angle " << TempAngle << " to propagation direction." << endl; 1042 1484 } else 1043 Log() << Verbose( 4) << "Keeping old winner " << *winner->second->node << " due to smaller angle to propagation direction." << endl;1485 Log() << Verbose(2) << "Keeping old winner " << *winner->second->node << " due to smaller angle to propagation direction." << endl; 1044 1486 } else 1045 Log() << Verbose( 4) << "Keeping old winner " << *winner->second->node << " due to smaller angle between normal vectors." << endl;1487 Log() << Verbose(2) << "Keeping old winner " << *winner->second->node << " due to smaller angle between normal vectors." << endl; 1046 1488 } 1047 1489 } // end of loop over all boundary points … … 1049 1491 // 5b. The point of the above whose triangle has the greatest angle with the triangle the current line belongs to (it only belongs to one, remember!): New triangle 1050 1492 if (winner != PointsOnBoundary.end()) { 1051 Log() << Verbose( 2) << "Winning target point is " << *(winner->second) << " with angle " << SmallestAngle << "." << endl;1493 Log() << Verbose(0) << "Winning target point is " << *(winner->second) << " with angle " << SmallestAngle << "." << endl; 1052 1494 // create the lins of not yet present 1053 1495 BLS[0] = baseline->second; … … 1079 1521 TrianglesOnBoundaryCount++; 1080 1522 } else { 1081 Log() << Verbose(1) << "I could not determine a winner for this baseline " << *(baseline->second) << "." << endl;1523 eLog() << Verbose(2) << "I could not determine a winner for this baseline " << *(baseline->second) << "." << endl; 1082 1524 } 1083 1525 1084 1526 // 5d. If the set of lines is not yet empty, go to 5. and continue 1085 1527 } else 1086 Log() << Verbose( 2) << "Baseline candidate " << *(baseline->second) << " has a triangle count of " << baseline->second->triangles.size() << "." << endl;1528 Log() << Verbose(0) << "Baseline candidate " << *(baseline->second) << " has a triangle count of " << baseline->second->triangles.size() << "." << endl; 1087 1529 } while (flag); 1088 1530 … … 1099 1541 bool Tesselation::InsertStraddlingPoints(const PointCloud *cloud, const LinkedCell *LC) 1100 1542 { 1543 Info FunctionInfo(__func__); 1101 1544 Vector Intersection, Normal; 1102 1545 TesselPoint *Walker = NULL; 1103 1546 Vector *Center = cloud->GetCenter(); 1104 list<BoundaryTriangleSet*>*triangles = NULL;1547 TriangleList *triangles = NULL; 1105 1548 bool AddFlag = false; 1106 1549 LinkedCell *BoundaryPoints = NULL; 1107 1108 Log() << Verbose(1) << "Begin of InsertStraddlingPoints" << endl;1109 1550 1110 1551 cloud->GoToFirst(); … … 1117 1558 } 1118 1559 Walker = cloud->GetPoint(); 1119 Log() << Verbose( 2) << "Current point is " << *Walker << "." << endl;1560 Log() << Verbose(0) << "Current point is " << *Walker << "." << endl; 1120 1561 // get the next triangle 1121 triangles = FindClosestTrianglesTo Point(Walker->node, BoundaryPoints);1562 triangles = FindClosestTrianglesToVector(Walker->node, BoundaryPoints); 1122 1563 BTS = triangles->front(); 1123 1564 if ((triangles == NULL) || (BTS->ContainsBoundaryPoint(Walker))) { 1124 Log() << Verbose( 2) << "No triangles found, probably a tesselation point itself." << endl;1565 Log() << Verbose(0) << "No triangles found, probably a tesselation point itself." << endl; 1125 1566 cloud->GoToNext(); 1126 1567 continue; 1127 1568 } else { 1128 1569 } 1129 Log() << Verbose( 2) << "Closest triangle is " << *BTS << "." << endl;1570 Log() << Verbose(0) << "Closest triangle is " << *BTS << "." << endl; 1130 1571 // get the intersection point 1131 1572 if (BTS->GetIntersectionInsideTriangle(Center, Walker->node, &Intersection)) { 1132 Log() << Verbose( 2) << "We have an intersection at " << Intersection << "." << endl;1573 Log() << Verbose(0) << "We have an intersection at " << Intersection << "." << endl; 1133 1574 // we have the intersection, check whether in- or outside of boundary 1134 1575 if ((Center->DistanceSquared(Walker->node) - Center->DistanceSquared(&Intersection)) < -MYEPSILON) { 1135 1576 // inside, next! 1136 Log() << Verbose( 2) << *Walker << " is inside wrt triangle " << *BTS << "." << endl;1577 Log() << Verbose(0) << *Walker << " is inside wrt triangle " << *BTS << "." << endl; 1137 1578 } else { 1138 1579 // outside! 1139 Log() << Verbose( 2) << *Walker << " is outside wrt triangle " << *BTS << "." << endl;1580 Log() << Verbose(0) << *Walker << " is outside wrt triangle " << *BTS << "." << endl; 1140 1581 class BoundaryLineSet *OldLines[3], *NewLines[3]; 1141 1582 class BoundaryPointSet *OldPoints[3], *NewPoint; … … 1147 1588 Normal.CopyVector(&BTS->NormalVector); 1148 1589 // add Walker to boundary points 1149 Log() << Verbose( 2) << "Adding " << *Walker << " to BoundaryPoints." << endl;1590 Log() << Verbose(0) << "Adding " << *Walker << " to BoundaryPoints." << endl; 1150 1591 AddFlag = true; 1151 1592 if (AddBoundaryPoint(Walker,0)) … … 1154 1595 continue; 1155 1596 // remove triangle 1156 Log() << Verbose( 2) << "Erasing triangle " << *BTS << "." << endl;1597 Log() << Verbose(0) << "Erasing triangle " << *BTS << "." << endl; 1157 1598 TrianglesOnBoundary.erase(BTS->Nr); 1158 1599 delete(BTS); … … 1162 1603 BPS[1] = OldPoints[i]; 1163 1604 NewLines[i] = new class BoundaryLineSet(BPS, LinesOnBoundaryCount); 1164 Log() << Verbose( 3) << "Creating new line " << *NewLines[i] << "." << endl;1605 Log() << Verbose(1) << "Creating new line " << *NewLines[i] << "." << endl; 1165 1606 LinesOnBoundary.insert(LinePair(LinesOnBoundaryCount, NewLines[i])); // no need for check for unique insertion as BPS[0] is definitely a new one 1166 1607 LinesOnBoundaryCount++; … … 1173 1614 if (NewLines[j]->IsConnectedTo(BLS[0])) { 1174 1615 if (n>2) { 1175 Log() << Verbose(1) << BLS[0] << " connects to all of the new lines?!" << endl;1616 eLog() << Verbose(2) << BLS[0] << " connects to all of the new lines?!" << endl; 1176 1617 return false; 1177 1618 } else … … 1184 1625 BTS->GetNormalVector(Normal); 1185 1626 Normal.Scale(-1.); 1186 Log() << Verbose( 2) << "Created new triangle " << *BTS << "." << endl;1627 Log() << Verbose(0) << "Created new triangle " << *BTS << "." << endl; 1187 1628 TrianglesOnBoundary.insert(TrianglePair(TrianglesOnBoundaryCount, BTS)); 1188 1629 TrianglesOnBoundaryCount++; … … 1198 1639 // exit 1199 1640 delete(Center); 1200 Log() << Verbose(1) << "End of InsertStraddlingPoints" << endl;1201 1641 return true; 1202 1642 }; … … 1209 1649 bool Tesselation::AddBoundaryPoint(TesselPoint * Walker, const int n) 1210 1650 { 1651 Info FunctionInfo(__func__); 1211 1652 PointTestPair InsertUnique; 1212 1653 BPS[n] = new class BoundaryPointSet(Walker); … … 1230 1671 void Tesselation::AddTesselationPoint(TesselPoint* Candidate, const int n) 1231 1672 { 1673 Info FunctionInfo(__func__); 1232 1674 PointTestPair InsertUnique; 1233 1675 TPS[n] = new class BoundaryPointSet(Candidate); … … 1237 1679 } else { 1238 1680 delete TPS[n]; 1239 Log() << Verbose( 4) << "Node " << *((InsertUnique.first)->second->node) << " is already present in PointsOnBoundary." << endl;1681 Log() << Verbose(0) << "Node " << *((InsertUnique.first)->second->node) << " is already present in PointsOnBoundary." << endl; 1240 1682 TPS[n] = (InsertUnique.first)->second; 1241 1683 } … … 1250 1692 void Tesselation::SetTesselationPoint(TesselPoint* Candidate, const int n) const 1251 1693 { 1694 Info FunctionInfo(__func__); 1252 1695 PointMap::const_iterator FindPoint = PointsOnBoundary.find(Candidate->nr); 1253 1696 if (FindPoint != PointsOnBoundary.end()) … … 1267 1710 bool insertNewLine = true; 1268 1711 1269 if (a->lines.find(b->node->nr) != a->lines.end()) { 1270 LineMap::iterator FindLine = a->lines.find(b->node->nr); 1712 LineMap::iterator FindLine = a->lines.find(b->node->nr); 1713 if (FindLine != a->lines.end()) { 1714 Log() << Verbose(1) << "INFO: There is at least one line between " << *a << " and " << *b << ": " << *(FindLine->second) << "." << endl; 1715 1271 1716 pair<LineMap::iterator,LineMap::iterator> FindPair; 1272 1717 FindPair = a->lines.equal_range(b->node->nr); 1273 Log() << Verbose(5) << "INFO: There is at least one line between " << *a << " and " << *b << ": " << *(FindLine->second) << "." << endl;1274 1718 1275 1719 for (FindLine = FindPair.first; FindLine != FindPair.second; FindLine++) { … … 1277 1721 if (FindLine->second->triangles.size() < 2) { 1278 1722 insertNewLine = false; 1279 Log() << Verbose( 4) << "Using existing line " << *FindLine->second << endl;1723 Log() << Verbose(0) << "Using existing line " << *FindLine->second << endl; 1280 1724 1281 1725 BPS[0] = FindLine->second->endpoints[0]; 1282 1726 BPS[1] = FindLine->second->endpoints[1]; 1283 1727 BLS[n] = FindLine->second; 1728 1729 // remove existing line from OpenLines 1730 CandidateMap::iterator CandidateLine = OpenLines.find(BLS[n]); 1731 if (CandidateLine != OpenLines.end()) { 1732 Log() << Verbose(1) << " Removing line from OpenLines." << endl; 1733 delete(CandidateLine->second); 1734 OpenLines.erase(CandidateLine); 1735 } else { 1736 eLog() << Verbose(1) << "Line exists and is attached to less than two triangles, but not in OpenLines!" << endl; 1737 } 1284 1738 1285 1739 break; … … 1304 1758 void Tesselation::AlwaysAddTesselationTriangleLine(class BoundaryPointSet *a, class BoundaryPointSet *b, const int n) 1305 1759 { 1306 Log() << Verbose(4) << "Adding line [" << LinesOnBoundaryCount << "|" << *(a->node) << " and " << *(b->node) << "." << endl; 1760 Info FunctionInfo(__func__); 1761 Log() << Verbose(0) << "Adding open line [" << LinesOnBoundaryCount << "|" << *(a->node) << " and " << *(b->node) << "." << endl; 1307 1762 BPS[0] = a; 1308 1763 BPS[1] = b; … … 1312 1767 // increase counter 1313 1768 LinesOnBoundaryCount++; 1769 // also add to open lines 1770 CandidateForTesselation *CFT = new CandidateForTesselation(BLS[n]); 1771 OpenLines.insert(pair< BoundaryLineSet *, CandidateForTesselation *> (BLS[n], CFT)); 1314 1772 }; 1315 1773 … … 1319 1777 void Tesselation::AddTesselationTriangle() 1320 1778 { 1779 Info FunctionInfo(__func__); 1321 1780 Log() << Verbose(1) << "Adding triangle to global TrianglesOnBoundary map." << endl; 1322 1781 … … 1337 1796 void Tesselation::AddTesselationTriangle(const int nr) 1338 1797 { 1339 Log() << Verbose(1) << "Adding triangle to global TrianglesOnBoundary map." << endl; 1798 Info FunctionInfo(__func__); 1799 Log() << Verbose(0) << "Adding triangle to global TrianglesOnBoundary map." << endl; 1340 1800 1341 1801 // add triangle to global map … … 1355 1815 void Tesselation::RemoveTesselationTriangle(class BoundaryTriangleSet *triangle) 1356 1816 { 1817 Info FunctionInfo(__func__); 1357 1818 if (triangle == NULL) 1358 1819 return; 1359 1820 for (int i = 0; i < 3; i++) { 1360 1821 if (triangle->lines[i] != NULL) { 1361 Log() << Verbose( 5) << "Removing triangle Nr." << triangle->Nr << " in line " << *triangle->lines[i] << "." << endl;1822 Log() << Verbose(0) << "Removing triangle Nr." << triangle->Nr << " in line " << *triangle->lines[i] << "." << endl; 1362 1823 triangle->lines[i]->triangles.erase(triangle->Nr); 1363 1824 if (triangle->lines[i]->triangles.empty()) { 1364 Log() << Verbose( 5) << *triangle->lines[i] << " is no more attached to any triangle, erasing." << endl;1825 Log() << Verbose(0) << *triangle->lines[i] << " is no more attached to any triangle, erasing." << endl; 1365 1826 RemoveTesselationLine(triangle->lines[i]); 1366 1827 } else { 1367 Log() << Verbose(5) << *triangle->lines[i] << " is still attached to another triangle: "; 1828 Log() << Verbose(0) << *triangle->lines[i] << " is still attached to another triangle: "; 1829 OpenLines.insert(pair< BoundaryLineSet *, CandidateForTesselation *> (triangle->lines[i], NULL)); 1368 1830 for(TriangleMap::iterator TriangleRunner = triangle->lines[i]->triangles.begin(); TriangleRunner != triangle->lines[i]->triangles.end(); TriangleRunner++) 1369 1831 Log() << Verbose(0) << "[" << (TriangleRunner->second)->Nr << "|" << *((TriangleRunner->second)->endpoints[0]) << ", " << *((TriangleRunner->second)->endpoints[1]) << ", " << *((TriangleRunner->second)->endpoints[2]) << "] \t"; 1370 1832 Log() << Verbose(0) << endl; 1371 1833 // for (int j=0;j<2;j++) { 1372 // Log() << Verbose( 5) << "Lines of endpoint " << *(triangle->lines[i]->endpoints[j]) << ": ";1834 // Log() << Verbose(0) << "Lines of endpoint " << *(triangle->lines[i]->endpoints[j]) << ": "; 1373 1835 // for(LineMap::iterator LineRunner = triangle->lines[i]->endpoints[j]->lines.begin(); LineRunner != triangle->lines[i]->endpoints[j]->lines.end(); LineRunner++) 1374 1836 // Log() << Verbose(0) << "[" << *(LineRunner->second) << "] \t"; … … 1382 1844 1383 1845 if (TrianglesOnBoundary.erase(triangle->Nr)) 1384 Log() << Verbose( 5) << "Removing triangle Nr. " << triangle->Nr << "." << endl;1846 Log() << Verbose(0) << "Removing triangle Nr. " << triangle->Nr << "." << endl; 1385 1847 delete(triangle); 1386 1848 }; … … 1392 1854 void Tesselation::RemoveTesselationLine(class BoundaryLineSet *line) 1393 1855 { 1856 Info FunctionInfo(__func__); 1394 1857 int Numbers[2]; 1395 1858 … … 1412 1875 for (LineMap::iterator Runner = erasor.first; Runner != erasor.second; Runner++) 1413 1876 if ((*Runner).second == line) { 1414 Log() << Verbose( 5) << "Removing Line Nr. " << line->Nr << " in boundary point " << *line->endpoints[i] << "." << endl;1877 Log() << Verbose(0) << "Removing Line Nr. " << line->Nr << " in boundary point " << *line->endpoints[i] << "." << endl; 1415 1878 line->endpoints[i]->lines.erase(Runner); 1416 1879 break; … … 1418 1881 } else { // there's just a single line left 1419 1882 if (line->endpoints[i]->lines.erase(line->Nr)) 1420 Log() << Verbose( 5) << "Removing Line Nr. " << line->Nr << " in boundary point " << *line->endpoints[i] << "." << endl;1883 Log() << Verbose(0) << "Removing Line Nr. " << line->Nr << " in boundary point " << *line->endpoints[i] << "." << endl; 1421 1884 } 1422 1885 if (line->endpoints[i]->lines.empty()) { 1423 Log() << Verbose( 5) << *line->endpoints[i] << " has no more lines it's attached to, erasing." << endl;1886 Log() << Verbose(0) << *line->endpoints[i] << " has no more lines it's attached to, erasing." << endl; 1424 1887 RemoveTesselationPoint(line->endpoints[i]); 1425 1888 } else { 1426 Log() << Verbose( 5) << *line->endpoints[i] << " has still lines it's attached to: ";1889 Log() << Verbose(0) << *line->endpoints[i] << " has still lines it's attached to: "; 1427 1890 for(LineMap::iterator LineRunner = line->endpoints[i]->lines.begin(); LineRunner != line->endpoints[i]->lines.end(); LineRunner++) 1428 1891 Log() << Verbose(0) << "[" << *(LineRunner->second) << "] \t"; … … 1437 1900 1438 1901 if (LinesOnBoundary.erase(line->Nr)) 1439 Log() << Verbose( 5) << "Removing line Nr. " << line->Nr << "." << endl;1902 Log() << Verbose(0) << "Removing line Nr. " << line->Nr << "." << endl; 1440 1903 delete(line); 1441 1904 }; … … 1448 1911 void Tesselation::RemoveTesselationPoint(class BoundaryPointSet *point) 1449 1912 { 1913 Info FunctionInfo(__func__); 1450 1914 if (point == NULL) 1451 1915 return; 1452 1916 if (PointsOnBoundary.erase(point->Nr)) 1453 Log() << Verbose( 5) << "Removing point Nr. " << point->Nr << "." << endl;1917 Log() << Verbose(0) << "Removing point Nr. " << point->Nr << "." << endl; 1454 1918 delete(point); 1455 1919 }; … … 1466 1930 int Tesselation::CheckPresenceOfTriangle(TesselPoint *Candidates[3]) const 1467 1931 { 1932 Info FunctionInfo(__func__); 1468 1933 int adjacentTriangleCount = 0; 1469 1934 class BoundaryPointSet *Points[3]; 1470 1935 1471 Log() << Verbose(2) << "Begin of CheckPresenceOfTriangle" << endl;1472 1936 // builds a triangle point set (Points) of the end points 1473 1937 for (int i = 0; i < 3; i++) { … … 1488 1952 for (; (FindLine != Points[i]->lines.end()) && (FindLine->first == Points[j]->node->nr); FindLine++) { 1489 1953 TriangleMap *triangles = &FindLine->second->triangles; 1490 Log() << Verbose( 3) << "Current line is " << FindLine->first << ": " << *(FindLine->second) << " with triangles " << triangles << "." << endl;1954 Log() << Verbose(1) << "Current line is " << FindLine->first << ": " << *(FindLine->second) << " with triangles " << triangles << "." << endl; 1491 1955 for (TriangleMap::const_iterator FindTriangle = triangles->begin(); FindTriangle != triangles->end(); FindTriangle++) { 1492 1956 if (FindTriangle->second->IsPresentTupel(Points)) { … … 1494 1958 } 1495 1959 } 1496 Log() << Verbose( 3) << "end." << endl;1960 Log() << Verbose(1) << "end." << endl; 1497 1961 } 1498 1962 // Only one of the triangle lines must be considered for the triangle count. 1499 //Log() << Verbose( 2) << "Found " << adjacentTriangleCount << " adjacent triangles for the point set." << endl;1963 //Log() << Verbose(0) << "Found " << adjacentTriangleCount << " adjacent triangles for the point set." << endl; 1500 1964 //return adjacentTriangleCount; 1501 1965 } … … 1504 1968 } 1505 1969 1506 Log() << Verbose(2) << "Found " << adjacentTriangleCount << " adjacent triangles for the point set." << endl; 1507 Log() << Verbose(2) << "End of CheckPresenceOfTriangle" << endl; 1970 Log() << Verbose(0) << "Found " << adjacentTriangleCount << " adjacent triangles for the point set." << endl; 1508 1971 return adjacentTriangleCount; 1509 1972 }; … … 1519 1982 class BoundaryTriangleSet * Tesselation::GetPresentTriangle(TesselPoint *Candidates[3]) 1520 1983 { 1984 Info FunctionInfo(__func__); 1521 1985 class BoundaryTriangleSet *triangle = NULL; 1522 1986 class BoundaryPointSet *Points[3]; … … 1548 2012 } 1549 2013 // Only one of the triangle lines must be considered for the triangle count. 1550 //Log() << Verbose( 2) << "Found " << adjacentTriangleCount << " adjacent triangles for the point set." << endl;2014 //Log() << Verbose(0) << "Found " << adjacentTriangleCount << " adjacent triangles for the point set." << endl; 1551 2015 //return adjacentTriangleCount; 1552 2016 } … … 1569 2033 void Tesselation::FindStartingTriangle(const double RADIUS, const LinkedCell *LC) 1570 2034 { 1571 Log() << Verbose(1) << "Begin of FindStartingTriangle\n";2035 Info FunctionInfo(__func__); 1572 2036 int i = 0; 1573 TesselPoint* FirstPoint = NULL;1574 TesselPoint* SecondPoint = NULL;1575 2037 TesselPoint* MaxPoint[NDIM]; 2038 TesselPoint* Temporary; 1576 2039 double maxCoordinate[NDIM]; 1577 Vector Oben;2040 BoundaryLineSet BaseLine; 1578 2041 Vector helper; 1579 2042 Vector Chord; 1580 2043 Vector SearchDirection; 1581 1582 Oben.Zero(); 2044 Vector CircleCenter; // center of the circle, i.e. of the band of sphere's centers 2045 Vector CirclePlaneNormal; // normal vector defining the plane this circle lives in 2046 Vector SphereCenter; 2047 Vector NormalVector; 2048 2049 NormalVector.Zero(); 1583 2050 1584 2051 for (i = 0; i < 3; i++) { … … 1593 2060 for (LC->n[(i+2)%NDIM]=0;LC->n[(i+2)%NDIM]<LC->N[(i+2)%NDIM];LC->n[(i+2)%NDIM]++) { 1594 2061 const LinkedNodes *List = LC->GetCurrentCell(); 1595 //Log() << Verbose( 2) << "Current cell is " << LC->n[0] << ", " << LC->n[1] << ", " << LC->n[2] << " with No. " << LC->index << "." << endl;2062 //Log() << Verbose(1) << "Current cell is " << LC->n[0] << ", " << LC->n[1] << ", " << LC->n[2] << " with No. " << LC->index << "." << endl; 1596 2063 if (List != NULL) { 1597 2064 for (LinkedNodes::const_iterator Runner = List->begin();Runner != List->end();Runner++) { 1598 2065 if ((*Runner)->node->x[i] > maxCoordinate[i]) { 1599 Log() << Verbose( 2) << "New maximal for axis " << i << " node is " << *(*Runner) << " at " << *(*Runner)->node << "." << endl;2066 Log() << Verbose(1) << "New maximal for axis " << i << " node is " << *(*Runner) << " at " << *(*Runner)->node << "." << endl; 1600 2067 maxCoordinate[i] = (*Runner)->node->x[i]; 1601 2068 MaxPoint[i] = (*Runner); … … 1608 2075 } 1609 2076 1610 Log() << Verbose( 2) << "Found maximum coordinates: ";2077 Log() << Verbose(1) << "Found maximum coordinates: "; 1611 2078 for (int i=0;i<NDIM;i++) 1612 2079 Log() << Verbose(0) << i << ": " << *MaxPoint[i] << "\t"; … … 1614 2081 1615 2082 BTS = NULL; 1616 CandidateList *OptCandidates = new CandidateList();1617 2083 for (int k=0;k<NDIM;k++) { 1618 Oben.Zero();1619 Oben.x[k] = 1.;1620 FirstPoint = MaxPoint[k];1621 Log() << Verbose( 1) << "Coordinates of start node at " << *FirstPoint->node << "." << endl;2084 NormalVector.Zero(); 2085 NormalVector.x[k] = 1.; 2086 BaseLine.endpoints[0] = new BoundaryPointSet(MaxPoint[k]); 2087 Log() << Verbose(0) << "Coordinates of start node at " << *BaseLine.endpoints[0]->node << "." << endl; 1622 2088 1623 2089 double ShortestAngle; 1624 TesselPoint* OptCandidate = NULL;1625 2090 ShortestAngle = 999999.; // This will contain the angle, which will be always positive (when looking for second point), when looking for third point this will be the quadrant. 1626 2091 1627 FindSecondPointForTesselation(FirstPoint, Oben, OptCandidate, &ShortestAngle, RADIUS, LC); // we give same point as next candidate as its bonds are looked into in find_second_... 1628 SecondPoint = OptCandidate; 1629 if (SecondPoint == NULL) // have we found a second point? 2092 FindSecondPointForTesselation(BaseLine.endpoints[0]->node, NormalVector, Temporary, &ShortestAngle, RADIUS, LC); // we give same point as next candidate as its bonds are looked into in find_second_... 2093 if (Temporary == NULL) // have we found a second point? 1630 2094 continue; 1631 1632 helper.CopyVector(FirstPoint->node); 1633 helper.SubtractVector(SecondPoint->node); 1634 helper.Normalize(); 1635 Oben.ProjectOntoPlane(&helper); 1636 Oben.Normalize(); 1637 helper.VectorProduct(&Oben); 2095 BaseLine.endpoints[1] = new BoundaryPointSet(Temporary); 2096 2097 // construct center of circle 2098 CircleCenter.CopyVector(BaseLine.endpoints[0]->node->node); 2099 CircleCenter.AddVector(BaseLine.endpoints[1]->node->node); 2100 CircleCenter.Scale(0.5); 2101 2102 // construct normal vector of circle 2103 CirclePlaneNormal.CopyVector(BaseLine.endpoints[0]->node->node); 2104 CirclePlaneNormal.SubtractVector(BaseLine.endpoints[1]->node->node); 2105 2106 double radius = CirclePlaneNormal.NormSquared(); 2107 double CircleRadius = sqrt(RADIUS*RADIUS - radius/4.); 2108 2109 NormalVector.ProjectOntoPlane(&CirclePlaneNormal); 2110 NormalVector.Normalize(); 1638 2111 ShortestAngle = 2.*M_PI; // This will indicate the quadrant. 1639 2112 1640 Chord.CopyVector(FirstPoint->node); // bring into calling function 1641 Chord.SubtractVector(SecondPoint->node); 1642 double radius = Chord.ScalarProduct(&Chord); 1643 double CircleRadius = sqrt(RADIUS*RADIUS - radius/4.); 1644 helper.CopyVector(&Oben); 1645 helper.Scale(CircleRadius); 1646 // Now, oben and helper are two orthonormalized vectors in the plane defined by Chord (not normalized) 2113 SphereCenter.CopyVector(&NormalVector); 2114 SphereCenter.Scale(CircleRadius); 2115 SphereCenter.AddVector(&CircleCenter); 2116 // Now, NormalVector and SphereCenter are two orthonormalized vectors in the plane defined by CirclePlaneNormal (not normalized) 1647 2117 1648 2118 // look in one direction of baseline for initial candidate 1649 SearchDirection.MakeNormalVector(&C hord, &Oben); // whether we look "left" first or "right" first is not important ...2119 SearchDirection.MakeNormalVector(&CirclePlaneNormal, &NormalVector); // whether we look "left" first or "right" first is not important ... 1650 2120 1651 2121 // adding point 1 and point 2 and add the line between them 1652 Log() << Verbose(1) << "Coordinates of start node at " << *FirstPoint->node << "." << endl; 1653 AddTesselationPoint(FirstPoint, 0); 1654 Log() << Verbose(1) << "Found second point is at " << *SecondPoint->node << ".\n"; 1655 AddTesselationPoint(SecondPoint, 1); 1656 AddTesselationLine(TPS[0], TPS[1], 0); 1657 1658 //Log() << Verbose(2) << "INFO: OldSphereCenter is at " << helper << ".\n"; 1659 FindThirdPointForTesselation(Oben, SearchDirection, helper, BLS[0], NULL, *&OptCandidates, &ShortestAngle, RADIUS, LC); 1660 Log() << Verbose(1) << "List of third Points is "; 1661 for (CandidateList::iterator it = OptCandidates->begin(); it != OptCandidates->end(); ++it) { 1662 Log() << Verbose(0) << " " << *(*it)->point; 1663 } 1664 Log() << Verbose(0) << endl; 1665 1666 for (CandidateList::iterator it = OptCandidates->begin(); it != OptCandidates->end(); ++it) { 1667 // add third triangle point 1668 AddTesselationPoint((*it)->point, 2); 1669 // add the second and third line 1670 AddTesselationLine(TPS[1], TPS[2], 1); 1671 AddTesselationLine(TPS[0], TPS[2], 2); 1672 // ... and triangles to the Maps of the Tesselation class 1673 BTS = new class BoundaryTriangleSet(BLS, TrianglesOnBoundaryCount); 1674 AddTesselationTriangle(); 1675 // ... and calculate its normal vector (with correct orientation) 1676 (*it)->OptCenter.Scale(-1.); 1677 Log() << Verbose(2) << "Anti-Oben is currently " << (*it)->OptCenter << "." << endl; 1678 BTS->GetNormalVector((*it)->OptCenter); // vector to compare with should point inwards 1679 Log() << Verbose(0) << "==> Found starting triangle consists of " << *FirstPoint << ", " << *SecondPoint << " and " 1680 << *(*it)->point << " with normal vector " << BTS->NormalVector << ".\n"; 1681 1682 // if we do not reach the end with the next step of iteration, we need to setup a new first line 1683 if (it != OptCandidates->end()--) { 1684 FirstPoint = (*it)->BaseLine->endpoints[0]->node; 1685 SecondPoint = (*it)->point; 1686 // adding point 1 and point 2 and the line between them 1687 AddTesselationPoint(FirstPoint, 0); 1688 AddTesselationPoint(SecondPoint, 1); 1689 AddTesselationLine(TPS[0], TPS[1], 0); 1690 } 1691 Log() << Verbose(2) << "Projection is " << BTS->NormalVector.ScalarProduct(&Oben) << "." << endl; 1692 } 2122 Log() << Verbose(0) << "Coordinates of start node at " << *BaseLine.endpoints[0]->node << "." << endl; 2123 Log() << Verbose(0) << "Found second point is at " << *BaseLine.endpoints[1]->node << ".\n"; 2124 2125 //Log() << Verbose(1) << "INFO: OldSphereCenter is at " << helper << ".\n"; 2126 CandidateForTesselation OptCandidates(&BaseLine); 2127 FindThirdPointForTesselation(NormalVector, SearchDirection, SphereCenter, OptCandidates, NULL, RADIUS, LC); 2128 Log() << Verbose(0) << "List of third Points is:" << endl; 2129 for (TesselPointList::iterator it = OptCandidates.pointlist.begin(); it != OptCandidates.pointlist.end(); it++) { 2130 Log() << Verbose(0) << " " << *(*it) << endl; 2131 } 2132 2133 BTS = NULL; 2134 AddCandidateTriangle(OptCandidates); 2135 // delete(BaseLine.endpoints[0]); 2136 // delete(BaseLine.endpoints[1]); 2137 1693 2138 if (BTS != NULL) // we have created one starting triangle 1694 2139 break; 1695 2140 else { 1696 2141 // remove all candidates from the list and then the list itself 1697 class CandidateForTesselation *remover = NULL; 1698 for (CandidateList::iterator it = OptCandidates->begin(); it != OptCandidates->end(); ++it) { 1699 remover = *it; 1700 delete(remover); 1701 } 1702 OptCandidates->clear(); 1703 } 1704 } 1705 1706 // remove all candidates from the list and then the list itself 1707 class CandidateForTesselation *remover = NULL; 1708 for (CandidateList::iterator it = OptCandidates->begin(); it != OptCandidates->end(); ++it) { 1709 remover = *it; 1710 delete(remover); 1711 } 1712 delete(OptCandidates); 1713 Log() << Verbose(1) << "End of FindStartingTriangle\n"; 2142 OptCandidates.pointlist.clear(); 2143 } 2144 } 1714 2145 }; 1715 2146 1716 2147 /** Checks for a given baseline and a third point candidate whether baselines of the found triangle don't have even better candidates. 1717 2148 * This is supposed to prevent early closing of the tesselation. 1718 * \param *BaseRay baseline, i.e. not \a *OptCandidate2149 * \param CandidateLine CandidateForTesselation with baseline and shortestangle , i.e. not \a *OptCandidate 1719 2150 * \param *ThirdNode third point in triangle, not in BoundaryLineSet::endpoints 1720 * \param ShortestAngle path length on this circle band for the current \a *ThirdNode1721 2151 * \param RADIUS radius of sphere 1722 2152 * \param *LC LinkedCell structure 1723 2153 * \return true - there is a better candidate (smaller angle than \a ShortestAngle), false - no better TesselPoint candidate found 1724 2154 */ 1725 bool Tesselation::HasOtherBaselineBetterCandidate(const BoundaryLineSet * const BaseRay, const TesselPoint * const ThirdNode, double ShortestAngle, double RADIUS, const LinkedCell * const LC) const 1726 { 1727 bool result = false; 1728 Vector CircleCenter; 1729 Vector CirclePlaneNormal; 1730 Vector OldSphereCenter; 1731 Vector SearchDirection; 1732 Vector helper; 1733 TesselPoint *OtherOptCandidate = NULL; 1734 double OtherShortestAngle = 2.*M_PI; // This will indicate the quadrant. 1735 double radius, CircleRadius; 1736 BoundaryLineSet *Line = NULL; 1737 BoundaryTriangleSet *T = NULL; 1738 1739 Log() << Verbose(1) << "Begin of HasOtherBaselineBetterCandidate" << endl; 1740 1741 // check both other lines 1742 PointMap::const_iterator FindPoint = PointsOnBoundary.find(ThirdNode->nr); 1743 if (FindPoint != PointsOnBoundary.end()) { 1744 for (int i=0;i<2;i++) { 1745 LineMap::const_iterator FindLine = (FindPoint->second)->lines.find(BaseRay->endpoints[0]->node->nr); 1746 if (FindLine != (FindPoint->second)->lines.end()) { 1747 Line = FindLine->second; 1748 Log() << Verbose(1) << "Found line " << *Line << "." << endl; 1749 if (Line->triangles.size() == 1) { 1750 T = Line->triangles.begin()->second; 1751 // construct center of circle 1752 CircleCenter.CopyVector(Line->endpoints[0]->node->node); 1753 CircleCenter.AddVector(Line->endpoints[1]->node->node); 1754 CircleCenter.Scale(0.5); 1755 1756 // construct normal vector of circle 1757 CirclePlaneNormal.CopyVector(Line->endpoints[0]->node->node); 1758 CirclePlaneNormal.SubtractVector(Line->endpoints[1]->node->node); 1759 1760 // calculate squared radius of circle 1761 radius = CirclePlaneNormal.ScalarProduct(&CirclePlaneNormal); 1762 if (radius/4. < RADIUS*RADIUS) { 1763 CircleRadius = RADIUS*RADIUS - radius/4.; 1764 CirclePlaneNormal.Normalize(); 1765 //Log() << Verbose(2) << "INFO: CircleCenter is at " << CircleCenter << ", CirclePlaneNormal is " << CirclePlaneNormal << " with circle radius " << sqrt(CircleRadius) << "." << endl; 1766 1767 // construct old center 1768 GetCenterofCircumcircle(&OldSphereCenter, *T->endpoints[0]->node->node, *T->endpoints[1]->node->node, *T->endpoints[2]->node->node); 1769 helper.CopyVector(&T->NormalVector); // normal vector ensures that this is correct center of the two possible ones 1770 radius = Line->endpoints[0]->node->node->DistanceSquared(&OldSphereCenter); 1771 helper.Scale(sqrt(RADIUS*RADIUS - radius)); 1772 OldSphereCenter.AddVector(&helper); 1773 OldSphereCenter.SubtractVector(&CircleCenter); 1774 //Log() << Verbose(2) << "INFO: OldSphereCenter is at " << OldSphereCenter << "." << endl; 1775 1776 // construct SearchDirection 1777 SearchDirection.MakeNormalVector(&T->NormalVector, &CirclePlaneNormal); 1778 helper.CopyVector(Line->endpoints[0]->node->node); 1779 helper.SubtractVector(ThirdNode->node); 1780 if (helper.ScalarProduct(&SearchDirection) < -HULLEPSILON)// ohoh, SearchDirection points inwards! 1781 SearchDirection.Scale(-1.); 1782 SearchDirection.ProjectOntoPlane(&OldSphereCenter); 1783 SearchDirection.Normalize(); 1784 Log() << Verbose(2) << "INFO: SearchDirection is " << SearchDirection << "." << endl; 1785 if (fabs(OldSphereCenter.ScalarProduct(&SearchDirection)) > HULLEPSILON) { 1786 // rotated the wrong way! 1787 eLog() << Verbose(1) << "SearchDirection and RelativeOldSphereCenter are still not orthogonal!" << endl; 1788 } 1789 1790 // add third point 1791 CandidateList *OptCandidates = new CandidateList(); 1792 FindThirdPointForTesselation(T->NormalVector, SearchDirection, OldSphereCenter, Line, ThirdNode, OptCandidates, &OtherShortestAngle, RADIUS, LC); 1793 for (CandidateList::iterator it = OptCandidates->begin(); it != OptCandidates->end(); ++it) { 1794 if (((*it)->point == BaseRay->endpoints[0]->node) || ((*it)->point == BaseRay->endpoints[1]->node)) // skip if it's the same triangle than suggested 1795 continue; 1796 Log() << Verbose(1) << " Third point candidate is " << *(*it)->point 1797 << " with circumsphere's center at " << (*it)->OptCenter << "." << endl; 1798 Log() << Verbose(1) << " Baseline is " << *BaseRay << endl; 1799 1800 // check whether all edges of the new triangle still have space for one more triangle (i.e. TriangleCount <2) 1801 TesselPoint *PointCandidates[3]; 1802 PointCandidates[0] = (*it)->point; 1803 PointCandidates[1] = BaseRay->endpoints[0]->node; 1804 PointCandidates[2] = BaseRay->endpoints[1]->node; 1805 bool check=false; 1806 int existentTrianglesCount = CheckPresenceOfTriangle(PointCandidates); 1807 // If there is no triangle, add it regularly. 1808 if (existentTrianglesCount == 0) { 1809 SetTesselationPoint((*it)->point, 0); 1810 SetTesselationPoint(BaseRay->endpoints[0]->node, 1); 1811 SetTesselationPoint(BaseRay->endpoints[1]->node, 2); 1812 1813 if (CheckLineCriteriaForDegeneratedTriangle((const BoundaryPointSet ** const )TPS)) { 1814 OtherOptCandidate = (*it)->point; 1815 check = true; 1816 } 1817 } else if ((existentTrianglesCount >= 1) && (existentTrianglesCount <= 3)) { // If there is a planar region within the structure, we need this triangle a second time. 1818 SetTesselationPoint((*it)->point, 0); 1819 SetTesselationPoint(BaseRay->endpoints[0]->node, 1); 1820 SetTesselationPoint(BaseRay->endpoints[1]->node, 2); 1821 1822 // We demand that at most one new degenerate line is created and that this line also already exists (which has to be the case due to existentTrianglesCount == 1) 1823 // i.e. at least one of the three lines must be present with TriangleCount <= 1 1824 if (CheckLineCriteriaForDegeneratedTriangle((const BoundaryPointSet ** const)TPS)) { 1825 OtherOptCandidate = (*it)->point; 1826 check = true; 1827 } 1828 } 1829 1830 if (check) { 1831 if (ShortestAngle > OtherShortestAngle) { 1832 Log() << Verbose(1) << "There is a better candidate than " << *ThirdNode << " with " << ShortestAngle << " from baseline " << *Line << ": " << *OtherOptCandidate << " with " << OtherShortestAngle << "." << endl; 1833 result = true; 1834 break; 1835 } 1836 } 1837 } 1838 delete(OptCandidates); 1839 if (result) 1840 break; 1841 } else { 1842 Log() << Verbose(1) << "Circumcircle for base line " << *Line << " and base triangle " << T << " is too big!" << endl; 1843 } 1844 } else { 1845 eLog() << Verbose(2) << "Baseline is connected to two triangles already?" << endl; 1846 } 1847 } else { 1848 Log() << Verbose(2) << "No present baseline between " << BaseRay->endpoints[0] << " and candidate " << *ThirdNode << "." << endl; 1849 } 1850 } 1851 } else { 1852 eLog() << Verbose(1) << "Could not find the TesselPoint " << *ThirdNode << "." << endl; 1853 } 1854 1855 Log() << Verbose(1) << "End of HasOtherBaselineBetterCandidate" << endl; 1856 1857 return result; 1858 }; 2155 //bool Tesselation::HasOtherBaselineBetterCandidate(CandidateForTesselation &CandidateLine, const TesselPoint * const ThirdNode, double RADIUS, const LinkedCell * const LC) const 2156 //{ 2157 // Info FunctionInfo(__func__); 2158 // bool result = false; 2159 // Vector CircleCenter; 2160 // Vector CirclePlaneNormal; 2161 // Vector OldSphereCenter; 2162 // Vector SearchDirection; 2163 // Vector helper; 2164 // TesselPoint *OtherOptCandidate = NULL; 2165 // double OtherShortestAngle = 2.*M_PI; // This will indicate the quadrant. 2166 // double radius, CircleRadius; 2167 // BoundaryLineSet *Line = NULL; 2168 // BoundaryTriangleSet *T = NULL; 2169 // 2170 // // check both other lines 2171 // PointMap::const_iterator FindPoint = PointsOnBoundary.find(ThirdNode->nr); 2172 // if (FindPoint != PointsOnBoundary.end()) { 2173 // for (int i=0;i<2;i++) { 2174 // LineMap::const_iterator FindLine = (FindPoint->second)->lines.find(BaseRay->endpoints[0]->node->nr); 2175 // if (FindLine != (FindPoint->second)->lines.end()) { 2176 // Line = FindLine->second; 2177 // Log() << Verbose(0) << "Found line " << *Line << "." << endl; 2178 // if (Line->triangles.size() == 1) { 2179 // T = Line->triangles.begin()->second; 2180 // // construct center of circle 2181 // CircleCenter.CopyVector(Line->endpoints[0]->node->node); 2182 // CircleCenter.AddVector(Line->endpoints[1]->node->node); 2183 // CircleCenter.Scale(0.5); 2184 // 2185 // // construct normal vector of circle 2186 // CirclePlaneNormal.CopyVector(Line->endpoints[0]->node->node); 2187 // CirclePlaneNormal.SubtractVector(Line->endpoints[1]->node->node); 2188 // 2189 // // calculate squared radius of circle 2190 // radius = CirclePlaneNormal.ScalarProduct(&CirclePlaneNormal); 2191 // if (radius/4. < RADIUS*RADIUS) { 2192 // CircleRadius = RADIUS*RADIUS - radius/4.; 2193 // CirclePlaneNormal.Normalize(); 2194 // //Log() << Verbose(1) << "INFO: CircleCenter is at " << CircleCenter << ", CirclePlaneNormal is " << CirclePlaneNormal << " with circle radius " << sqrt(CircleRadius) << "." << endl; 2195 // 2196 // // construct old center 2197 // GetCenterofCircumcircle(&OldSphereCenter, *T->endpoints[0]->node->node, *T->endpoints[1]->node->node, *T->endpoints[2]->node->node); 2198 // helper.CopyVector(&T->NormalVector); // normal vector ensures that this is correct center of the two possible ones 2199 // radius = Line->endpoints[0]->node->node->DistanceSquared(&OldSphereCenter); 2200 // helper.Scale(sqrt(RADIUS*RADIUS - radius)); 2201 // OldSphereCenter.AddVector(&helper); 2202 // OldSphereCenter.SubtractVector(&CircleCenter); 2203 // //Log() << Verbose(1) << "INFO: OldSphereCenter is at " << OldSphereCenter << "." << endl; 2204 // 2205 // // construct SearchDirection 2206 // SearchDirection.MakeNormalVector(&T->NormalVector, &CirclePlaneNormal); 2207 // helper.CopyVector(Line->endpoints[0]->node->node); 2208 // helper.SubtractVector(ThirdNode->node); 2209 // if (helper.ScalarProduct(&SearchDirection) < -HULLEPSILON)// ohoh, SearchDirection points inwards! 2210 // SearchDirection.Scale(-1.); 2211 // SearchDirection.ProjectOntoPlane(&OldSphereCenter); 2212 // SearchDirection.Normalize(); 2213 // Log() << Verbose(1) << "INFO: SearchDirection is " << SearchDirection << "." << endl; 2214 // if (fabs(OldSphereCenter.ScalarProduct(&SearchDirection)) > HULLEPSILON) { 2215 // // rotated the wrong way! 2216 // eLog() << Verbose(1) << "SearchDirection and RelativeOldSphereCenter are still not orthogonal!" << endl; 2217 // } 2218 // 2219 // // add third point 2220 // FindThirdPointForTesselation(T->NormalVector, SearchDirection, OldSphereCenter, OptCandidates, ThirdNode, RADIUS, LC); 2221 // for (TesselPointList::iterator it = OptCandidates.pointlist.begin(); it != OptCandidates.pointlist.end(); ++it) { 2222 // if (((*it) == BaseRay->endpoints[0]->node) || ((*it) == BaseRay->endpoints[1]->node)) // skip if it's the same triangle than suggested 2223 // continue; 2224 // Log() << Verbose(0) << " Third point candidate is " << (*it) 2225 // << " with circumsphere's center at " << (*it)->OptCenter << "." << endl; 2226 // Log() << Verbose(0) << " Baseline is " << *BaseRay << endl; 2227 // 2228 // // check whether all edges of the new triangle still have space for one more triangle (i.e. TriangleCount <2) 2229 // TesselPoint *PointCandidates[3]; 2230 // PointCandidates[0] = (*it); 2231 // PointCandidates[1] = BaseRay->endpoints[0]->node; 2232 // PointCandidates[2] = BaseRay->endpoints[1]->node; 2233 // bool check=false; 2234 // int existentTrianglesCount = CheckPresenceOfTriangle(PointCandidates); 2235 // // If there is no triangle, add it regularly. 2236 // if (existentTrianglesCount == 0) { 2237 // SetTesselationPoint((*it), 0); 2238 // SetTesselationPoint(BaseRay->endpoints[0]->node, 1); 2239 // SetTesselationPoint(BaseRay->endpoints[1]->node, 2); 2240 // 2241 // if (CheckLineCriteriaForDegeneratedTriangle((const BoundaryPointSet ** const )TPS)) { 2242 // OtherOptCandidate = (*it); 2243 // check = true; 2244 // } 2245 // } else if ((existentTrianglesCount >= 1) && (existentTrianglesCount <= 3)) { // If there is a planar region within the structure, we need this triangle a second time. 2246 // SetTesselationPoint((*it), 0); 2247 // SetTesselationPoint(BaseRay->endpoints[0]->node, 1); 2248 // SetTesselationPoint(BaseRay->endpoints[1]->node, 2); 2249 // 2250 // // We demand that at most one new degenerate line is created and that this line also already exists (which has to be the case due to existentTrianglesCount == 1) 2251 // // i.e. at least one of the three lines must be present with TriangleCount <= 1 2252 // if (CheckLineCriteriaForDegeneratedTriangle((const BoundaryPointSet ** const)TPS)) { 2253 // OtherOptCandidate = (*it); 2254 // check = true; 2255 // } 2256 // } 2257 // 2258 // if (check) { 2259 // if (ShortestAngle > OtherShortestAngle) { 2260 // Log() << Verbose(0) << "There is a better candidate than " << *ThirdNode << " with " << ShortestAngle << " from baseline " << *Line << ": " << *OtherOptCandidate << " with " << OtherShortestAngle << "." << endl; 2261 // result = true; 2262 // break; 2263 // } 2264 // } 2265 // } 2266 // delete(OptCandidates); 2267 // if (result) 2268 // break; 2269 // } else { 2270 // Log() << Verbose(0) << "Circumcircle for base line " << *Line << " and base triangle " << T << " is too big!" << endl; 2271 // } 2272 // } else { 2273 // eLog() << Verbose(2) << "Baseline is connected to two triangles already?" << endl; 2274 // } 2275 // } else { 2276 // Log() << Verbose(1) << "No present baseline between " << BaseRay->endpoints[0] << " and candidate " << *ThirdNode << "." << endl; 2277 // } 2278 // } 2279 // } else { 2280 // eLog() << Verbose(1) << "Could not find the TesselPoint " << *ThirdNode << "." << endl; 2281 // } 2282 // 2283 // return result; 2284 //}; 1859 2285 1860 2286 /** This function finds a triangle to a line, adjacent to an existing one. 1861 2287 * @param out output stream for debugging 1862 * @param Line currentbaseline to search from2288 * @param CandidateLine current cadndiate baseline to search from 1863 2289 * @param T current triangle which \a Line is edge of 1864 2290 * @param RADIUS radius of the rolling ball … … 1866 2292 * @param *LC LinkedCell structure with neighbouring points 1867 2293 */ 1868 bool Tesselation::FindNextSuitableTriangle( BoundaryLineSet &Line, BoundaryTriangleSet &T, const double& RADIUS, const LinkedCell *LC)1869 { 1870 Log() << Verbose(0) << "Begin of FindNextSuitableTriangle\n";2294 bool Tesselation::FindNextSuitableTriangle(CandidateForTesselation &CandidateLine, BoundaryTriangleSet &T, const double& RADIUS, const LinkedCell *LC) 2295 { 2296 Info FunctionInfo(__func__); 1871 2297 bool result = true; 1872 CandidateList *OptCandidates = new CandidateList();1873 2298 1874 2299 Vector CircleCenter; 1875 2300 Vector CirclePlaneNormal; 1876 Vector OldSphereCenter;2301 Vector RelativeSphereCenter; 1877 2302 Vector SearchDirection; 1878 2303 Vector helper; 1879 2304 TesselPoint *ThirdNode = NULL; 1880 2305 LineMap::iterator testline; 1881 double ShortestAngle = 2.*M_PI; // This will indicate the quadrant.1882 2306 double radius, CircleRadius; 1883 2307 1884 Log() << Verbose(1) << "Current baseline is " << Line << " of triangle " << T << "." << endl;1885 2308 for (int i=0;i<3;i++) 1886 if ((T.endpoints[i]->node != Line.endpoints[0]->node) && (T.endpoints[i]->node != Line.endpoints[1]->node))2309 if ((T.endpoints[i]->node != CandidateLine.BaseLine->endpoints[0]->node) && (T.endpoints[i]->node != CandidateLine.BaseLine->endpoints[1]->node)) { 1887 2310 ThirdNode = T.endpoints[i]->node; 2311 break; 2312 } 2313 Log() << Verbose(0) << "Current baseline is " << *CandidateLine.BaseLine << " with ThirdNode " << *ThirdNode << " of triangle " << T << "." << endl; 1888 2314 1889 2315 // construct center of circle 1890 CircleCenter.CopyVector( Line.endpoints[0]->node->node);1891 CircleCenter.AddVector( Line.endpoints[1]->node->node);2316 CircleCenter.CopyVector(CandidateLine.BaseLine->endpoints[0]->node->node); 2317 CircleCenter.AddVector(CandidateLine.BaseLine->endpoints[1]->node->node); 1892 2318 CircleCenter.Scale(0.5); 1893 2319 1894 2320 // construct normal vector of circle 1895 CirclePlaneNormal.CopyVector( Line.endpoints[0]->node->node);1896 CirclePlaneNormal.SubtractVector( Line.endpoints[1]->node->node);2321 CirclePlaneNormal.CopyVector(CandidateLine.BaseLine->endpoints[0]->node->node); 2322 CirclePlaneNormal.SubtractVector(CandidateLine.BaseLine->endpoints[1]->node->node); 1897 2323 1898 2324 // calculate squared radius of circle 1899 2325 radius = CirclePlaneNormal.ScalarProduct(&CirclePlaneNormal); 1900 2326 if (radius/4. < RADIUS*RADIUS) { 2327 // construct relative sphere center with now known CircleCenter 2328 RelativeSphereCenter.CopyVector(&T.SphereCenter); 2329 RelativeSphereCenter.SubtractVector(&CircleCenter); 2330 1901 2331 CircleRadius = RADIUS*RADIUS - radius/4.; 1902 2332 CirclePlaneNormal.Normalize(); 1903 //Log() << Verbose(2) << "INFO: CircleCenter is at " << CircleCenter << ", CirclePlaneNormal is " << CirclePlaneNormal << " with circle radius " << sqrt(CircleRadius) << "." << endl; 1904 1905 // construct old center 1906 GetCenterofCircumcircle(&OldSphereCenter, *T.endpoints[0]->node->node, *T.endpoints[1]->node->node, *T.endpoints[2]->node->node); 1907 helper.CopyVector(&T.NormalVector); // normal vector ensures that this is correct center of the two possible ones 1908 radius = Line.endpoints[0]->node->node->DistanceSquared(&OldSphereCenter); 1909 helper.Scale(sqrt(RADIUS*RADIUS - radius)); 1910 OldSphereCenter.AddVector(&helper); 1911 OldSphereCenter.SubtractVector(&CircleCenter); 1912 //Log() << Verbose(2) << "INFO: OldSphereCenter is at " << OldSphereCenter << "." << endl; 1913 1914 // construct SearchDirection 1915 SearchDirection.MakeNormalVector(&T.NormalVector, &CirclePlaneNormal); 1916 helper.CopyVector(Line.endpoints[0]->node->node); 2333 Log() << Verbose(1) << "INFO: CircleCenter is at " << CircleCenter << ", CirclePlaneNormal is " << CirclePlaneNormal << " with circle radius " << sqrt(CircleRadius) << "." << endl; 2334 2335 Log() << Verbose(1) << "INFO: OldSphereCenter is at " << T.SphereCenter << "." << endl; 2336 2337 // construct SearchDirection and an "outward pointer" 2338 SearchDirection.MakeNormalVector(&RelativeSphereCenter, &CirclePlaneNormal); 2339 helper.CopyVector(&CircleCenter); 1917 2340 helper.SubtractVector(ThirdNode->node); 1918 2341 if (helper.ScalarProduct(&SearchDirection) < -HULLEPSILON)// ohoh, SearchDirection points inwards! 1919 2342 SearchDirection.Scale(-1.); 1920 SearchDirection.ProjectOntoPlane(&OldSphereCenter); 1921 SearchDirection.Normalize(); 1922 Log() << Verbose(2) << "INFO: SearchDirection is " << SearchDirection << "." << endl; 1923 if (fabs(OldSphereCenter.ScalarProduct(&SearchDirection)) > HULLEPSILON) { 2343 Log() << Verbose(1) << "INFO: SearchDirection is " << SearchDirection << "." << endl; 2344 if (fabs(RelativeSphereCenter.ScalarProduct(&SearchDirection)) > HULLEPSILON) { 1924 2345 // rotated the wrong way! 1925 2346 eLog() << Verbose(1) << "SearchDirection and RelativeOldSphereCenter are still not orthogonal!" << endl; … … 1927 2348 1928 2349 // add third point 1929 FindThirdPointForTesselation(T.NormalVector, SearchDirection, OldSphereCenter, &Line, ThirdNode, OptCandidates, &ShortestAngle, RADIUS, LC);2350 FindThirdPointForTesselation(T.NormalVector, SearchDirection, T.SphereCenter, CandidateLine, ThirdNode, RADIUS, LC); 1930 2351 1931 2352 } else { 1932 Log() << Verbose( 1) << "Circumcircle for base line " <<Line << " and base triangle " << T << " is too big!" << endl;1933 } 1934 1935 if ( OptCandidates->begin() == OptCandidates->end()) {2353 Log() << Verbose(0) << "Circumcircle for base line " << *CandidateLine.BaseLine << " and base triangle " << T << " is too big!" << endl; 2354 } 2355 2356 if (CandidateLine.pointlist.empty()) { 1936 2357 eLog() << Verbose(2) << "Could not find a suitable candidate." << endl; 1937 2358 return false; 1938 2359 } 1939 Log() << Verbose(1) << "Third Points are "; 1940 for (CandidateList::iterator it = OptCandidates->begin(); it != OptCandidates->end(); ++it) { 1941 Log() << Verbose(1) << " " << *(*it)->point << endl; 1942 } 1943 1944 BoundaryLineSet *BaseRay = &Line; 1945 for (CandidateList::iterator it = OptCandidates->begin(); it != OptCandidates->end(); ++it) { 1946 Log() << Verbose(1) << " Third point candidate is " << *(*it)->point 1947 << " with circumsphere's center at " << (*it)->OptCenter << "." << endl; 1948 Log() << Verbose(1) << " Baseline is " << *BaseRay << endl; 1949 1950 // check whether all edges of the new triangle still have space for one more triangle (i.e. TriangleCount <2) 1951 TesselPoint *PointCandidates[3]; 1952 PointCandidates[0] = (*it)->point; 1953 PointCandidates[1] = BaseRay->endpoints[0]->node; 1954 PointCandidates[2] = BaseRay->endpoints[1]->node; 1955 int existentTrianglesCount = CheckPresenceOfTriangle(PointCandidates); 1956 1957 BTS = NULL; 1958 // check for present edges and whether we reach better candidates from them 1959 if (HasOtherBaselineBetterCandidate(BaseRay, (*it)->point, ShortestAngle, RADIUS, LC) ) { 1960 result = false; 1961 break; 1962 } else { 1963 // If there is no triangle, add it regularly. 1964 if (existentTrianglesCount == 0) { 1965 AddTesselationPoint((*it)->point, 0); 1966 AddTesselationPoint(BaseRay->endpoints[0]->node, 1); 1967 AddTesselationPoint(BaseRay->endpoints[1]->node, 2); 1968 1969 if (CheckLineCriteriaForDegeneratedTriangle((const BoundaryPointSet ** const )TPS)) { 1970 AddTesselationLine(TPS[0], TPS[1], 0); 1971 AddTesselationLine(TPS[0], TPS[2], 1); 1972 AddTesselationLine(TPS[1], TPS[2], 2); 1973 1974 BTS = new class BoundaryTriangleSet(BLS, TrianglesOnBoundaryCount); 1975 AddTesselationTriangle(); 1976 (*it)->OptCenter.Scale(-1.); 1977 BTS->GetNormalVector((*it)->OptCenter); 1978 (*it)->OptCenter.Scale(-1.); 1979 1980 Log() << Verbose(0) << "--> New triangle with " << *BTS << " and normal vector " << BTS->NormalVector 1981 << " for this triangle ... " << endl; 1982 //Log() << Verbose(1) << "We have "<< TrianglesOnBoundaryCount << " for line " << *BaseRay << "." << endl; 1983 } else { 1984 eLog() << Verbose(2) << "This triangle consisting of "; 1985 Log() << Verbose(0) << *(*it)->point << ", "; 1986 Log() << Verbose(0) << *BaseRay->endpoints[0]->node << " and "; 1987 Log() << Verbose(0) << *BaseRay->endpoints[1]->node << " "; 1988 Log() << Verbose(0) << "exists and is not added, as it does not seem helpful!" << endl; 1989 result = false; 1990 } 1991 } else if ((existentTrianglesCount >= 1) && (existentTrianglesCount <= 3)) { // If there is a planar region within the structure, we need this triangle a second time. 1992 AddTesselationPoint((*it)->point, 0); 1993 AddTesselationPoint(BaseRay->endpoints[0]->node, 1); 1994 AddTesselationPoint(BaseRay->endpoints[1]->node, 2); 1995 1996 // We demand that at most one new degenerate line is created and that this line also already exists (which has to be the case due to existentTrianglesCount == 1) 1997 // i.e. at least one of the three lines must be present with TriangleCount <= 1 1998 if (CheckLineCriteriaForDegeneratedTriangle((const BoundaryPointSet ** const)TPS)) { 1999 AddTesselationLine(TPS[0], TPS[1], 0); 2000 AddTesselationLine(TPS[0], TPS[2], 1); 2001 AddTesselationLine(TPS[1], TPS[2], 2); 2002 2003 BTS = new class BoundaryTriangleSet(BLS, TrianglesOnBoundaryCount); 2004 AddTesselationTriangle(); // add to global map 2005 2006 (*it)->OtherOptCenter.Scale(-1.); 2007 BTS->GetNormalVector((*it)->OtherOptCenter); 2008 (*it)->OtherOptCenter.Scale(-1.); 2009 2010 eLog() << Verbose(2) << "--> WARNING: Special new triangle with " << *BTS << " and normal vector " << BTS->NormalVector << " for this triangle ... " << endl; 2011 Log() << Verbose(1) << "We have "<< BaseRay->triangles.size() << " for line " << BaseRay << "." << endl; 2012 } else { 2013 eLog() << Verbose(2) << "This triangle consisting of " << *(*it)->point << ", " << *BaseRay->endpoints[0]->node << " and " << *BaseRay->endpoints[1]->node << " " << "exists and is not added, as it does not seem helpful!" << endl; 2014 result = false; 2015 } 2016 } else { 2017 Log() << Verbose(1) << "This triangle consisting of "; 2018 Log() << Verbose(0) << *(*it)->point << ", "; 2019 Log() << Verbose(0) << *BaseRay->endpoints[0]->node << " and "; 2020 Log() << Verbose(0) << *BaseRay->endpoints[1]->node << " "; 2021 Log() << Verbose(0) << "is invalid!" << endl; 2022 result = false; 2023 } 2024 } 2025 2026 // set baseline to new ray from ref point (here endpoints[0]->node) to current candidate (here (*it)->point)) 2027 BaseRay = BLS[0]; 2028 if ((BTS != NULL) && (BTS->NormalVector.NormSquared() < MYEPSILON)) { 2029 eLog() << Verbose(1) << "Triangle " << *BTS << " has zero normal vector!" << endl; 2030 exit(255); 2031 } 2032 2033 } 2034 2035 // remove all candidates from the list and then the list itself 2036 class CandidateForTesselation *remover = NULL; 2037 for (CandidateList::iterator it = OptCandidates->begin(); it != OptCandidates->end(); ++it) { 2038 remover = *it; 2039 delete(remover); 2040 } 2041 delete(OptCandidates); 2042 Log() << Verbose(0) << "End of FindNextSuitableTriangle\n"; 2360 Log() << Verbose(0) << "Third Points are: " << endl; 2361 for (TesselPointList::iterator it = CandidateLine.pointlist.begin(); it != CandidateLine.pointlist.end(); ++it) { 2362 Log() << Verbose(0) << " " << *(*it) << endl; 2363 } 2364 2365 return true; 2366 2367 // BoundaryLineSet *BaseRay = CandidateLine.BaseLine; 2368 // for (CandidateList::iterator it = OptCandidates->begin(); it != OptCandidates->end(); ++it) { 2369 // Log() << Verbose(0) << "Third point candidate is " << *(*it)->point 2370 // << " with circumsphere's center at " << (*it)->OptCenter << "." << endl; 2371 // Log() << Verbose(0) << "Baseline is " << *BaseRay << endl; 2372 // 2373 // // check whether all edges of the new triangle still have space for one more triangle (i.e. TriangleCount <2) 2374 // TesselPoint *PointCandidates[3]; 2375 // PointCandidates[0] = (*it)->point; 2376 // PointCandidates[1] = BaseRay->endpoints[0]->node; 2377 // PointCandidates[2] = BaseRay->endpoints[1]->node; 2378 // int existentTrianglesCount = CheckPresenceOfTriangle(PointCandidates); 2379 // 2380 // BTS = NULL; 2381 // // check for present edges and whether we reach better candidates from them 2382 // //if (HasOtherBaselineBetterCandidate(BaseRay, (*it)->point, ShortestAngle, RADIUS, LC) ) { 2383 // if (0) { 2384 // result = false; 2385 // break; 2386 // } else { 2387 // // If there is no triangle, add it regularly. 2388 // if (existentTrianglesCount == 0) { 2389 // AddTesselationPoint((*it)->point, 0); 2390 // AddTesselationPoint(BaseRay->endpoints[0]->node, 1); 2391 // AddTesselationPoint(BaseRay->endpoints[1]->node, 2); 2392 // 2393 // if (CheckLineCriteriaForDegeneratedTriangle((const BoundaryPointSet ** const )TPS)) { 2394 // CandidateLine.point = (*it)->point; 2395 // CandidateLine.OptCenter.CopyVector(&((*it)->OptCenter)); 2396 // CandidateLine.OtherOptCenter.CopyVector(&((*it)->OtherOptCenter)); 2397 // CandidateLine.ShortestAngle = ShortestAngle; 2398 // } else { 2399 //// eLog() << Verbose(1) << "This triangle consisting of "; 2400 //// Log() << Verbose(0) << *(*it)->point << ", "; 2401 //// Log() << Verbose(0) << *BaseRay->endpoints[0]->node << " and "; 2402 //// Log() << Verbose(0) << *BaseRay->endpoints[1]->node << " "; 2403 //// Log() << Verbose(0) << "exists and is not added, as it 0x80000000006fc150(does not seem helpful!" << endl; 2404 // result = false; 2405 // } 2406 // } else if ((existentTrianglesCount >= 1) && (existentTrianglesCount <= 3)) { // If there is a planar region within the structure, we need this triangle a second time. 2407 // AddTesselationPoint((*it)->point, 0); 2408 // AddTesselationPoint(BaseRay->endpoints[0]->node, 1); 2409 // AddTesselationPoint(BaseRay->endpoints[1]->node, 2); 2410 // 2411 // // We demand that at most one new degenerate line is created and that this line also already exists (which has to be the case due to existentTrianglesCount == 1) 2412 // // i.e. at least one of the three lines must be present with TriangleCount <= 1 2413 // if (CheckLineCriteriaForDegeneratedTriangle((const BoundaryPointSet ** const)TPS) || CandidateLine.BaseLine->skipped) { 2414 // CandidateLine.point = (*it)->point; 2415 // CandidateLine.OptCenter.CopyVector(&(*it)->OptCenter); 2416 // CandidateLine.OtherOptCenter.CopyVector(&(*it)->OtherOptCenter); 2417 // CandidateLine.ShortestAngle = ShortestAngle+2.*M_PI; 2418 // 2419 // } else { 2420 //// eLog() << Verbose(1) << "This triangle consisting of " << *(*it)->point << ", " << *BaseRay->endpoints[0]->node << " and " << *BaseRay->endpoints[1]->node << " " << "exists and is not added, as it does not seem helpful!" << endl; 2421 // result = false; 2422 // } 2423 // } else { 2424 //// Log() << Verbose(1) << "This triangle consisting of "; 2425 //// Log() << Verbose(0) << *(*it)->point << ", "; 2426 //// Log() << Verbose(0) << *BaseRay->endpoints[0]->node << " and "; 2427 //// Log() << Verbose(0) << *BaseRay->endpoints[1]->node << " "; 2428 //// Log() << Verbose(0) << "is invalid!" << endl; 2429 // result = false; 2430 // } 2431 // } 2432 // 2433 // // set baseline to new ray from ref point (here endpoints[0]->node) to current candidate (here (*it)->point)) 2434 // BaseRay = BLS[0]; 2435 // if ((BTS != NULL) && (BTS->NormalVector.NormSquared() < MYEPSILON)) { 2436 // eLog() << Verbose(1) << "Triangle " << *BTS << " has zero normal vector!" << endl; 2437 // exit(255); 2438 // } 2439 // 2440 // } 2441 // 2442 // // remove all candidates from the list and then the list itself 2443 // class CandidateForTesselation *remover = NULL; 2444 // for (CandidateList::iterator it = OptCandidates->begin(); it != OptCandidates->end(); ++it) { 2445 // remover = *it; 2446 // delete(remover); 2447 // } 2448 // delete(OptCandidates); 2043 2449 return result; 2450 }; 2451 2452 /** Adds the present line and candidate point from \a &CandidateLine to the Tesselation. 2453 * \param CandidateLine triangle to add 2454 * \NOTE we need the copy operator here as the original CandidateForTesselation is removed in AddTesselationLine() 2455 */ 2456 void Tesselation::AddCandidateTriangle(CandidateForTesselation CandidateLine) 2457 { 2458 Info FunctionInfo(__func__); 2459 Vector Center; 2460 TesselPoint * const TurningPoint = CandidateLine.BaseLine->endpoints[0]->node; 2461 2462 // fill the set of neighbours 2463 TesselPointSet SetOfNeighbours; 2464 SetOfNeighbours.insert(CandidateLine.BaseLine->endpoints[1]->node); 2465 for (TesselPointList::iterator Runner = CandidateLine.pointlist.begin(); Runner != CandidateLine.pointlist.end(); Runner++) 2466 SetOfNeighbours.insert(*Runner); 2467 TesselPointList *connectedClosestPoints = GetCircleOfSetOfPoints(&SetOfNeighbours, TurningPoint, CandidateLine.BaseLine->endpoints[1]->node->node); 2468 2469 // go through all angle-sorted candidates (in degenerate n-nodes case we may have to add multiple triangles) 2470 Log() << Verbose(0) << "List of Candidates for Turning Point: " << *TurningPoint << "." << endl; 2471 for (TesselPointList::iterator TesselRunner = connectedClosestPoints->begin(); TesselRunner != connectedClosestPoints->end(); ++TesselRunner) 2472 Log() << Verbose(0) << **TesselRunner << endl; 2473 TesselPointList::iterator Runner = connectedClosestPoints->begin(); 2474 TesselPointList::iterator Sprinter = Runner; 2475 Sprinter++; 2476 while(Sprinter != connectedClosestPoints->end()) { 2477 // add the points 2478 AddTesselationPoint(TurningPoint, 0); 2479 AddTesselationPoint((*Runner), 1); 2480 AddTesselationPoint((*Sprinter), 2); 2481 2482 // add the lines 2483 AddTesselationLine(TPS[0], TPS[1], 0); 2484 AddTesselationLine(TPS[0], TPS[2], 1); 2485 AddTesselationLine(TPS[1], TPS[2], 2); 2486 2487 // add the triangles 2488 BTS = new class BoundaryTriangleSet(BLS, TrianglesOnBoundaryCount); 2489 AddTesselationTriangle(); 2490 BTS->GetCenter(&Center); 2491 Center.SubtractVector(&CandidateLine.OptCenter); 2492 BTS->SphereCenter.CopyVector(&CandidateLine.OptCenter); 2493 BTS->GetNormalVector(Center); 2494 2495 Log() << Verbose(0) << "--> New triangle with " << *BTS << " and normal vector " << BTS->NormalVector << "." << endl; 2496 Runner = Sprinter; 2497 Sprinter++; 2498 Log() << Verbose(0) << "Current Runner is " << **Runner << "." << endl; 2499 if (Sprinter != connectedClosestPoints->end()) 2500 Log() << Verbose(0) << " There are still more triangles to add." << endl; 2501 } 2502 delete(connectedClosestPoints); 2044 2503 }; 2045 2504 … … 2053 2512 class BoundaryPointSet *Tesselation::IsConvexRectangle(class BoundaryLineSet *Base) 2054 2513 { 2514 Info FunctionInfo(__func__); 2055 2515 class BoundaryPointSet *Spot = NULL; 2056 2516 class BoundaryLineSet *OtherBase; … … 2064 2524 OtherBase = new class BoundaryLineSet(BPS,-1); 2065 2525 2066 Log() << Verbose( 3) << "INFO: Current base line is " << *Base << "." << endl;2067 Log() << Verbose( 3) << "INFO: Other base line is " << *OtherBase << "." << endl;2526 Log() << Verbose(1) << "INFO: Current base line is " << *Base << "." << endl; 2527 Log() << Verbose(1) << "INFO: Other base line is " << *OtherBase << "." << endl; 2068 2528 2069 2529 // get the closest point on each line to the other line … … 2085 2545 delete(ClosestPoint); 2086 2546 if ((distance[0] * distance[1]) > 0) { // have same sign? 2087 Log() << Verbose( 3) << "REJECT: Both SKPs have same sign: " << distance[0] << " and " << distance[1] << ". " << *Base << "' rectangle is concave." << endl;2547 Log() << Verbose(1) << "REJECT: Both SKPs have same sign: " << distance[0] << " and " << distance[1] << ". " << *Base << "' rectangle is concave." << endl; 2088 2548 if (distance[0] < distance[1]) { 2089 2549 Spot = Base->endpoints[0]; … … 2093 2553 return Spot; 2094 2554 } else { // different sign, i.e. we are in between 2095 Log() << Verbose( 3) << "ACCEPT: Rectangle of triangles of base line " << *Base << " is convex." << endl;2555 Log() << Verbose(0) << "ACCEPT: Rectangle of triangles of base line " << *Base << " is convex." << endl; 2096 2556 return NULL; 2097 2557 } … … 2101 2561 void Tesselation::PrintAllBoundaryPoints(ofstream *out) const 2102 2562 { 2563 Info FunctionInfo(__func__); 2103 2564 // print all lines 2104 Log() << Verbose( 1) << "Printing all boundary points for debugging:" << endl;2565 Log() << Verbose(0) << "Printing all boundary points for debugging:" << endl; 2105 2566 for (PointMap::const_iterator PointRunner = PointsOnBoundary.begin();PointRunner != PointsOnBoundary.end(); PointRunner++) 2106 Log() << Verbose( 2) << *(PointRunner->second) << endl;2567 Log() << Verbose(0) << *(PointRunner->second) << endl; 2107 2568 }; 2108 2569 2109 2570 void Tesselation::PrintAllBoundaryLines(ofstream *out) const 2110 2571 { 2572 Info FunctionInfo(__func__); 2111 2573 // print all lines 2112 Log() << Verbose( 1) << "Printing all boundary lines for debugging:" << endl;2574 Log() << Verbose(0) << "Printing all boundary lines for debugging:" << endl; 2113 2575 for (LineMap::const_iterator LineRunner = LinesOnBoundary.begin(); LineRunner != LinesOnBoundary.end(); LineRunner++) 2114 Log() << Verbose( 2) << *(LineRunner->second) << endl;2576 Log() << Verbose(0) << *(LineRunner->second) << endl; 2115 2577 }; 2116 2578 2117 2579 void Tesselation::PrintAllBoundaryTriangles(ofstream *out) const 2118 2580 { 2581 Info FunctionInfo(__func__); 2119 2582 // print all triangles 2120 Log() << Verbose( 1) << "Printing all boundary triangles for debugging:" << endl;2583 Log() << Verbose(0) << "Printing all boundary triangles for debugging:" << endl; 2121 2584 for (TriangleMap::const_iterator TriangleRunner = TrianglesOnBoundary.begin(); TriangleRunner != TrianglesOnBoundary.end(); TriangleRunner++) 2122 Log() << Verbose( 2) << *(TriangleRunner->second) << endl;2585 Log() << Verbose(0) << *(TriangleRunner->second) << endl; 2123 2586 }; 2124 2587 … … 2130 2593 double Tesselation::PickFarthestofTwoBaselines(class BoundaryLineSet *Base) 2131 2594 { 2595 Info FunctionInfo(__func__); 2132 2596 class BoundaryLineSet *OtherBase; 2133 2597 Vector *ClosestPoint[2]; … … 2141 2605 OtherBase = new class BoundaryLineSet(BPS,-1); 2142 2606 2143 Log() << Verbose( 3) << "INFO: Current base line is " << *Base << "." << endl;2144 Log() << Verbose( 3) << "INFO: Other base line is " << *OtherBase << "." << endl;2607 Log() << Verbose(0) << "INFO: Current base line is " << *Base << "." << endl; 2608 Log() << Verbose(0) << "INFO: Other base line is " << *OtherBase << "." << endl; 2145 2609 2146 2610 // get the closest point on each line to the other line … … 2162 2626 2163 2627 if (Distance.NormSquared() < MYEPSILON) { // check for intersection 2164 Log() << Verbose( 3) << "REJECT: Both lines have an intersection: Nothing to do." << endl;2628 Log() << Verbose(0) << "REJECT: Both lines have an intersection: Nothing to do." << endl; 2165 2629 return false; 2166 2630 } else { // check for sign against BaseLineNormal … … 2172 2636 } 2173 2637 for (TriangleMap::iterator runner = Base->triangles.begin(); runner != Base->triangles.end(); runner++) { 2174 Log() << Verbose( 4) << "INFO: Adding NormalVector " << runner->second->NormalVector << " of triangle " << *(runner->second) << "." << endl;2638 Log() << Verbose(1) << "INFO: Adding NormalVector " << runner->second->NormalVector << " of triangle " << *(runner->second) << "." << endl; 2175 2639 BaseLineNormal.AddVector(&(runner->second->NormalVector)); 2176 2640 } … … 2178 2642 2179 2643 if (Distance.ScalarProduct(&BaseLineNormal) > MYEPSILON) { // Distance points outwards, hence OtherBase higher than Base -> flip 2180 Log() << Verbose( 2) << "ACCEPT: Other base line would be higher: Flipping baseline." << endl;2644 Log() << Verbose(0) << "ACCEPT: Other base line would be higher: Flipping baseline." << endl; 2181 2645 // calculate volume summand as a general tetraeder 2182 2646 return volume; 2183 2647 } else { // Base higher than OtherBase -> do nothing 2184 Log() << Verbose( 2) << "REJECT: Base line is higher: Nothing to do." << endl;2648 Log() << Verbose(0) << "REJECT: Base line is higher: Nothing to do." << endl; 2185 2649 return 0.; 2186 2650 } … … 2197 2661 class BoundaryLineSet * Tesselation::FlipBaseline(class BoundaryLineSet *Base) 2198 2662 { 2663 Info FunctionInfo(__func__); 2199 2664 class BoundaryLineSet *OldLines[4], *NewLine; 2200 2665 class BoundaryPointSet *OldPoints[2]; … … 2203 2668 int i,m; 2204 2669 2205 Log() << Verbose(1) << "Begin of FlipBaseline" << endl;2206 2207 2670 // calculate NormalVector for later use 2208 2671 BaseLineNormal.Zero(); … … 2212 2675 } 2213 2676 for (TriangleMap::iterator runner = Base->triangles.begin(); runner != Base->triangles.end(); runner++) { 2214 Log() << Verbose( 4) << "INFO: Adding NormalVector " << runner->second->NormalVector << " of triangle " << *(runner->second) << "." << endl;2677 Log() << Verbose(1) << "INFO: Adding NormalVector " << runner->second->NormalVector << " of triangle " << *(runner->second) << "." << endl; 2215 2678 BaseLineNormal.AddVector(&(runner->second->NormalVector)); 2216 2679 } … … 2225 2688 i=0; 2226 2689 m=0; 2227 Log() << Verbose( 3) << "The four old lines are: ";2690 Log() << Verbose(0) << "The four old lines are: "; 2228 2691 for(TriangleMap::iterator runner = Base->triangles.begin(); runner != Base->triangles.end(); runner++) 2229 2692 for (int j=0;j<3;j++) // all of their endpoints and baselines … … 2233 2696 } 2234 2697 Log() << Verbose(0) << endl; 2235 Log() << Verbose( 3) << "The two old points are: ";2698 Log() << Verbose(0) << "The two old points are: "; 2236 2699 for(TriangleMap::iterator runner = Base->triangles.begin(); runner != Base->triangles.end(); runner++) 2237 2700 for (int j=0;j<3;j++) // all of their endpoints and baselines … … 2259 2722 2260 2723 // remove triangles and baseline removes itself 2261 Log() << Verbose( 3) << "INFO: Deleting baseline " << *Base << " from global list." << endl;2724 Log() << Verbose(0) << "INFO: Deleting baseline " << *Base << " from global list." << endl; 2262 2725 OldBaseLineNr = Base->Nr; 2263 2726 m=0; 2264 2727 for(TriangleMap::iterator runner = Base->triangles.begin(); runner != Base->triangles.end(); runner++) { 2265 Log() << Verbose( 3) << "INFO: Deleting triangle " << *(runner->second) << "." << endl;2728 Log() << Verbose(0) << "INFO: Deleting triangle " << *(runner->second) << "." << endl; 2266 2729 OldTriangleNrs[m++] = runner->second->Nr; 2267 2730 RemoveTesselationTriangle(runner->second); … … 2273 2736 NewLine = new class BoundaryLineSet(BPS, OldBaseLineNr); 2274 2737 LinesOnBoundary.insert(LinePair(OldBaseLineNr, NewLine)); // no need for check for unique insertion as NewLine is definitely a new one 2275 Log() << Verbose( 3) << "INFO: Created new baseline " << *NewLine << "." << endl;2738 Log() << Verbose(0) << "INFO: Created new baseline " << *NewLine << "." << endl; 2276 2739 2277 2740 // construct new triangles with flipped baseline … … 2288 2751 BTS->GetNormalVector(BaseLineNormal); 2289 2752 AddTesselationTriangle(OldTriangleNrs[0]); 2290 Log() << Verbose( 3) << "INFO: Created new triangle " << *BTS << "." << endl;2753 Log() << Verbose(0) << "INFO: Created new triangle " << *BTS << "." << endl; 2291 2754 2292 2755 BLS[0] = (i==2 ? OldLines[3] : OldLines[2]); … … 2296 2759 BTS->GetNormalVector(BaseLineNormal); 2297 2760 AddTesselationTriangle(OldTriangleNrs[1]); 2298 Log() << Verbose( 3) << "INFO: Created new triangle " << *BTS << "." << endl;2761 Log() << Verbose(0) << "INFO: Created new triangle " << *BTS << "." << endl; 2299 2762 } else { 2300 Log() << Verbose(1) << "The four old lines do not connect, something's utterly wrong here!" << endl;2763 eLog() << Verbose(0) << "The four old lines do not connect, something's utterly wrong here!" << endl; 2301 2764 return NULL; 2302 2765 } 2303 2766 2304 Log() << Verbose(1) << "End of FlipBaseline" << endl;2305 2767 return NewLine; 2306 2768 }; … … 2317 2779 void Tesselation::FindSecondPointForTesselation(TesselPoint* a, Vector Oben, TesselPoint*& OptCandidate, double Storage[3], double RADIUS, const LinkedCell *LC) 2318 2780 { 2319 Log() << Verbose(2) << "Begin of FindSecondPointForTesselation" << endl;2781 Info FunctionInfo(__func__); 2320 2782 Vector AngleCheck; 2321 2783 class TesselPoint* Candidate = NULL; … … 2338 2800 Nupper[i] = ((N[i]+1) < LC->N[i]) ? N[i]+1 : LC->N[i]-1; 2339 2801 } 2340 Log() << Verbose( 3) << "LC Intervals from [" << N[0] << "<->" << LC->N[0] << ", " << N[1] << "<->" << LC->N[1] << ", " << N[2] << "<->" << LC->N[2] << "] :"2802 Log() << Verbose(0) << "LC Intervals from [" << N[0] << "<->" << LC->N[0] << ", " << N[1] << "<->" << LC->N[1] << ", " << N[2] << "<->" << LC->N[2] << "] :" 2341 2803 << " [" << Nlower[0] << "," << Nupper[0] << "], " << " [" << Nlower[1] << "," << Nupper[1] << "], " << " [" << Nlower[2] << "," << Nupper[2] << "], " << endl; 2342 2804 … … 2345 2807 for (LC->n[2] = Nlower[2]; LC->n[2] <= Nupper[2]; LC->n[2]++) { 2346 2808 const LinkedNodes *List = LC->GetCurrentCell(); 2347 //Log() << Verbose( 2) << "Current cell is " << LC->n[0] << ", " << LC->n[1] << ", " << LC->n[2] << " with No. " << LC->index << "." << endl;2809 //Log() << Verbose(1) << "Current cell is " << LC->n[0] << ", " << LC->n[1] << ", " << LC->n[2] << " with No. " << LC->index << "." << endl; 2348 2810 if (List != NULL) { 2349 2811 for (LinkedNodes::const_iterator Runner = List->begin(); Runner != List->end(); Runner++) { … … 2376 2838 angle = AngleCheck.Angle(&Oben); 2377 2839 if (angle < Storage[0]) { 2378 //Log() << Verbose( 3) << "Old values of Storage: %lf %lf \n", Storage[0], Storage[1]);2379 Log() << Verbose( 3) << "Current candidate is " << *Candidate << ": Is a better candidate with distance " << norm << " and angle " << angle << " to oben " << Oben << ".\n";2840 //Log() << Verbose(1) << "Old values of Storage: %lf %lf \n", Storage[0], Storage[1]); 2841 Log() << Verbose(1) << "Current candidate is " << *Candidate << ": Is a better candidate with distance " << norm << " and angle " << angle << " to oben " << Oben << ".\n"; 2380 2842 OptCandidate = Candidate; 2381 2843 Storage[0] = angle; 2382 //Log() << Verbose( 3) << "Changing something in Storage: %lf %lf. \n", Storage[0], Storage[2]);2844 //Log() << Verbose(1) << "Changing something in Storage: %lf %lf. \n", Storage[0], Storage[2]); 2383 2845 } else { 2384 //Log() << Verbose( 3) << "Current candidate is " << *Candidate << ": Looses with angle " << angle << " to a better candidate " << *OptCandidate << endl;2846 //Log() << Verbose(1) << "Current candidate is " << *Candidate << ": Looses with angle " << angle << " to a better candidate " << *OptCandidate << endl; 2385 2847 } 2386 2848 } else { 2387 //Log() << Verbose( 3) << "Current candidate is " << *Candidate << ": Refused due to Radius " << norm << endl;2849 //Log() << Verbose(1) << "Current candidate is " << *Candidate << ": Refused due to Radius " << norm << endl; 2388 2850 } 2389 2851 } else { 2390 //Log() << Verbose( 3) << "Current candidate is " << *Candidate << ": Candidate is equal to first endpoint." << *a << "." << endl;2852 //Log() << Verbose(1) << "Current candidate is " << *Candidate << ": Candidate is equal to first endpoint." << *a << "." << endl; 2391 2853 } 2392 2854 } 2393 2855 } else { 2394 Log() << Verbose( 3) << "Linked cell list is empty." << endl;2856 Log() << Verbose(0) << "Linked cell list is empty." << endl; 2395 2857 } 2396 2858 } 2397 Log() << Verbose(2) << "End of FindSecondPointForTesselation" << endl;2398 2859 }; 2399 2860 … … 2424 2885 * @param SearchDirection general direction where to search for the next point, relative to center of BaseLine 2425 2886 * @param OldSphereCenter center of sphere for base triangle, relative to center of BaseLine, giving null angle for the parameter circle 2426 * @param BaseLine BoundaryLineSet with the current base line2887 * @param CandidateLine CandidateForTesselation with the current base line and list of candidates and ShortestAngle 2427 2888 * @param ThirdNode third point to avoid in search 2428 * @param candidates list of equally good candidates to return2429 * @param ShortestAngle the current path length on this circle band for the current OptCandidate2430 2889 * @param RADIUS radius of sphere 2431 2890 * @param *LC LinkedCell structure with neighbouring points 2432 2891 */ 2433 void Tesselation::FindThirdPointForTesselation(Vector &NormalVector, Vector &SearchDirection, Vector &OldSphereCenter, class BoundaryLineSet *BaseLine, const class TesselPoint * const ThirdNode, CandidateList* &candidates, double *ShortestAngle, const double RADIUS, const LinkedCell *LC) const 2434 { 2892 void Tesselation::FindThirdPointForTesselation(Vector &NormalVector, Vector &SearchDirection, Vector &OldSphereCenter, CandidateForTesselation &CandidateLine, const class TesselPoint * const ThirdNode, const double RADIUS, const LinkedCell *LC) const 2893 { 2894 Info FunctionInfo(__func__); 2435 2895 Vector CircleCenter; // center of the circle, i.e. of the band of sphere's centers 2436 2896 Vector CirclePlaneNormal; // normal vector defining the plane this circle lives in … … 2440 2900 Vector NewNormalVector; // normal vector of the Candidate's triangle 2441 2901 Vector helper, OptCandidateCenter, OtherOptCandidateCenter; 2902 Vector RelativeOldSphereCenter; 2903 Vector NewPlaneCenter; 2442 2904 double CircleRadius; // radius of this circle 2443 2905 double radius; 2906 double otherradius; 2444 2907 double alpha, Otheralpha; // angles (i.e. parameter for the circle). 2445 2908 int N[NDIM], Nlower[NDIM], Nupper[NDIM]; 2446 2909 TesselPoint *Candidate = NULL; 2447 CandidateForTesselation *optCandidate = NULL; 2448 2449 Log() << Verbose(1) << "Begin of FindThirdPointForTesselation" << endl; 2450 2451 Log() << Verbose(2) << "INFO: NormalVector of BaseTriangle is " << NormalVector << "." << endl; 2910 2911 Log() << Verbose(1) << "INFO: NormalVector of BaseTriangle is " << NormalVector << "." << endl; 2452 2912 2453 2913 // construct center of circle 2454 CircleCenter.CopyVector( BaseLine->endpoints[0]->node->node);2455 CircleCenter.AddVector( BaseLine->endpoints[1]->node->node);2914 CircleCenter.CopyVector(CandidateLine.BaseLine->endpoints[0]->node->node); 2915 CircleCenter.AddVector(CandidateLine.BaseLine->endpoints[1]->node->node); 2456 2916 CircleCenter.Scale(0.5); 2457 2917 2458 2918 // construct normal vector of circle 2459 CirclePlaneNormal.CopyVector(BaseLine->endpoints[0]->node->node); 2460 CirclePlaneNormal.SubtractVector(BaseLine->endpoints[1]->node->node); 2919 CirclePlaneNormal.CopyVector(CandidateLine.BaseLine->endpoints[0]->node->node); 2920 CirclePlaneNormal.SubtractVector(CandidateLine.BaseLine->endpoints[1]->node->node); 2921 2922 RelativeOldSphereCenter.CopyVector(&OldSphereCenter); 2923 RelativeOldSphereCenter.SubtractVector(&CircleCenter); 2461 2924 2462 2925 // calculate squared radius TesselPoint *ThirdNode,f circle 2463 radius = CirclePlaneNormal. ScalarProduct(&CirclePlaneNormal);2464 if (radius /4.< RADIUS*RADIUS) {2465 CircleRadius = RADIUS*RADIUS - radius /4.;2926 radius = CirclePlaneNormal.NormSquared()/4.; 2927 if (radius < RADIUS*RADIUS) { 2928 CircleRadius = RADIUS*RADIUS - radius; 2466 2929 CirclePlaneNormal.Normalize(); 2467 //Log() << Verbose(2) << "INFO: CircleCenter is at " << CircleCenter << ", CirclePlaneNormal is " << CirclePlaneNormal << " with circle radius " << sqrt(CircleRadius) << "." << endl;2930 Log() << Verbose(1) << "INFO: CircleCenter is at " << CircleCenter << ", CirclePlaneNormal is " << CirclePlaneNormal << " with circle radius " << sqrt(CircleRadius) << "." << endl; 2468 2931 2469 2932 // test whether old center is on the band's plane 2470 if (fabs( OldSphereCenter.ScalarProduct(&CirclePlaneNormal)) > HULLEPSILON) {2471 eLog() << Verbose(1) << "Something's very wrong here: OldSphereCenter is not on the band's plane as desired by " << fabs(OldSphereCenter.ScalarProduct(&CirclePlaneNormal)) << "!" << endl;2472 OldSphereCenter.ProjectOntoPlane(&CirclePlaneNormal);2473 } 2474 radius = OldSphereCenter.ScalarProduct(&OldSphereCenter);2933 if (fabs(RelativeOldSphereCenter.ScalarProduct(&CirclePlaneNormal)) > HULLEPSILON) { 2934 eLog() << Verbose(1) << "Something's very wrong here: RelativeOldSphereCenter is not on the band's plane as desired by " << fabs(RelativeOldSphereCenter.ScalarProduct(&CirclePlaneNormal)) << "!" << endl; 2935 RelativeOldSphereCenter.ProjectOntoPlane(&CirclePlaneNormal); 2936 } 2937 radius = RelativeOldSphereCenter.NormSquared(); 2475 2938 if (fabs(radius - CircleRadius) < HULLEPSILON) { 2476 //Log() << Verbose(2) << "INFO: OldSphereCenter is at " <<OldSphereCenter << "." << endl;2939 Log() << Verbose(1) << "INFO: RelativeOldSphereCenter is at " << RelativeOldSphereCenter << "." << endl; 2477 2940 2478 2941 // check SearchDirection 2479 //Log() << Verbose(2) << "INFO: SearchDirection is " << SearchDirection << "." << endl;2480 if (fabs( OldSphereCenter.ScalarProduct(&SearchDirection)) > HULLEPSILON) { // rotated the wrong way!2942 Log() << Verbose(1) << "INFO: SearchDirection is " << SearchDirection << "." << endl; 2943 if (fabs(RelativeOldSphereCenter.ScalarProduct(&SearchDirection)) > HULLEPSILON) { // rotated the wrong way! 2481 2944 eLog() << Verbose(1) << "SearchDirection and RelativeOldSphereCenter are not orthogonal!" << endl; 2482 2945 } … … 2486 2949 for(int i=0;i<NDIM;i++) // store indices of this cell 2487 2950 N[i] = LC->n[i]; 2488 //Log() << Verbose( 2) << "INFO: Center cell is " << N[0] << ", " << N[1] << ", " << N[2] << " with No. " << LC->index << "." << endl;2951 //Log() << Verbose(1) << "INFO: Center cell is " << N[0] << ", " << N[1] << ", " << N[2] << " with No. " << LC->index << "." << endl; 2489 2952 } else { 2490 2953 eLog() << Verbose(1) << "Vector " << CircleCenter << " is outside of LinkedCell's bounding box." << endl; … … 2492 2955 } 2493 2956 // then go through the current and all neighbouring cells and check the contained points for possible candidates 2494 //Log() << Verbose( 2) << "LC Intervals:";2957 //Log() << Verbose(1) << "LC Intervals:"; 2495 2958 for (int i=0;i<NDIM;i++) { 2496 2959 Nlower[i] = ((N[i]-1) >= 0) ? N[i]-1 : 0; … … 2503 2966 for (LC->n[2] = Nlower[2]; LC->n[2] <= Nupper[2]; LC->n[2]++) { 2504 2967 const LinkedNodes *List = LC->GetCurrentCell(); 2505 //Log() << Verbose( 2) << "Current cell is " << LC->n[0] << ", " << LC->n[1] << ", " << LC->n[2] << " with No. " << LC->index << "." << endl;2968 //Log() << Verbose(1) << "Current cell is " << LC->n[0] << ", " << LC->n[1] << ", " << LC->n[2] << " with No. " << LC->index << "." << endl; 2506 2969 if (List != NULL) { 2507 2970 for (LinkedNodes::const_iterator Runner = List->begin(); Runner != List->end(); Runner++) { … … 2509 2972 2510 2973 // check for three unique points 2511 //Log() << Verbose(2) << "INFO: Current Candidate is " << *Candidate << " at " << Candidate->node<< "." << endl;2512 if ((Candidate != BaseLine->endpoints[0]->node) && (Candidate !=BaseLine->endpoints[1]->node) ){2513 2514 // construct both new centers2515 GetCenterofCircumcircle(&New SphereCenter, *BaseLine->endpoints[0]->node->node, *BaseLine->endpoints[1]->node->node, *Candidate->node);2516 OtherNewSphereCenter.CopyVector(&NewSphereCenter);2517 2518 if ( (NewNormalVector.MakeNormalVector(BaseLine->endpoints[0]->node->node, BaseLine->endpoints[1]->node->node, Candidate->node))2519 && (fabs(NewNormalVector. ScalarProduct(&NewNormalVector)) > HULLEPSILON)2974 Log() << Verbose(2) << "INFO: Current Candidate is " << *Candidate << " for BaseLine " << *CandidateLine.BaseLine << " with OldSphereCenter " << OldSphereCenter << "." << endl; 2975 if ((Candidate != CandidateLine.BaseLine->endpoints[0]->node) && (Candidate != CandidateLine.BaseLine->endpoints[1]->node) ){ 2976 2977 // find center on the plane 2978 GetCenterofCircumcircle(&NewPlaneCenter, *CandidateLine.BaseLine->endpoints[0]->node->node, *CandidateLine.BaseLine->endpoints[1]->node->node, *Candidate->node); 2979 Log() << Verbose(1) << "INFO: NewPlaneCenter is " << NewPlaneCenter << "." << endl; 2980 2981 if (NewNormalVector.MakeNormalVector(CandidateLine.BaseLine->endpoints[0]->node->node, CandidateLine.BaseLine->endpoints[1]->node->node, Candidate->node) 2982 && (fabs(NewNormalVector.NormSquared()) > HULLEPSILON) 2520 2983 ) { 2521 helper.CopyVector(&NewNormalVector); 2522 //Log() << Verbose(2) << "INFO: NewNormalVector is " << NewNormalVector << "." << endl; 2523 radius = BaseLine->endpoints[0]->node->node->DistanceSquared(&NewSphereCenter); 2984 Log() << Verbose(1) << "INFO: NewNormalVector is " << NewNormalVector << "." << endl; 2985 radius = CandidateLine.BaseLine->endpoints[0]->node->node->DistanceSquared(&NewPlaneCenter); 2986 Log() << Verbose(1) << "INFO: CircleCenter is at " << CircleCenter << ", CirclePlaneNormal is " << CirclePlaneNormal << " with circle radius " << sqrt(CircleRadius) << "." << endl; 2987 Log() << Verbose(1) << "INFO: SearchDirection is " << SearchDirection << "." << endl; 2988 Log() << Verbose(1) << "INFO: Radius of CircumCenterCircle is " << radius << "." << endl; 2524 2989 if (radius < RADIUS*RADIUS) { 2990 otherradius = CandidateLine.BaseLine->endpoints[1]->node->node->DistanceSquared(&NewPlaneCenter); 2991 if (fabs(radius - otherradius) > HULLEPSILON) { 2992 eLog() << Verbose(1) << "Distance to center of circumcircle is not the same from each corner of the triangle: " << fabs(radius-otherradius) << endl; 2993 } 2994 // construct both new centers 2995 NewSphereCenter.CopyVector(&NewPlaneCenter); 2996 OtherNewSphereCenter.CopyVector(&NewPlaneCenter); 2997 helper.CopyVector(&NewNormalVector); 2525 2998 helper.Scale(sqrt(RADIUS*RADIUS - radius)); 2526 //Log() << Verbose(2) << "INFO: Distance of NewCircleCenter to NewSphereCenter is " << helper.Norm()<< " with sphere radius " << RADIUS << "." << endl;2999 Log() << Verbose(2) << "INFO: Distance of NewPlaneCenter " << NewPlaneCenter << " to either NewSphereCenter is " << helper.Norm() << " of vector " << helper << " with sphere radius " << RADIUS << "." << endl; 2527 3000 NewSphereCenter.AddVector(&helper); 2528 NewSphereCenter.SubtractVector(&CircleCenter); 2529 //Log() << Verbose(2) << "INFO: NewSphereCenter is at " << NewSphereCenter << "." << endl; 2530 3001 Log() << Verbose(2) << "INFO: NewSphereCenter is at " << NewSphereCenter << "." << endl; 2531 3002 // OtherNewSphereCenter is created by the same vector just in the other direction 2532 3003 helper.Scale(-1.); 2533 3004 OtherNewSphereCenter.AddVector(&helper); 2534 OtherNewSphereCenter.SubtractVector(&CircleCenter); 2535 //Log() << Verbose(2) << "INFO: OtherNewSphereCenter is at " << OtherNewSphereCenter << "." << endl; 3005 Log() << Verbose(2) << "INFO: OtherNewSphereCenter is at " << OtherNewSphereCenter << "." << endl; 2536 3006 2537 3007 alpha = GetPathLengthonCircumCircle(CircleCenter, CirclePlaneNormal, CircleRadius, NewSphereCenter, OldSphereCenter, NormalVector, SearchDirection); 2538 3008 Otheralpha = GetPathLengthonCircumCircle(CircleCenter, CirclePlaneNormal, CircleRadius, OtherNewSphereCenter, OldSphereCenter, NormalVector, SearchDirection); 2539 3009 alpha = min(alpha, Otheralpha); 3010 2540 3011 // if there is a better candidate, drop the current list and add the new candidate 2541 3012 // otherwise ignore the new candidate and keep the list 2542 if (*ShortestAngle > (alpha - HULLEPSILON)) { 2543 optCandidate = new CandidateForTesselation(Candidate, BaseLine, OptCandidateCenter, OtherOptCandidateCenter); 3013 if (CandidateLine.ShortestAngle > (alpha - HULLEPSILON)) { 2544 3014 if (fabs(alpha - Otheralpha) > MYEPSILON) { 2545 optCandidate->OptCenter.CopyVector(&NewSphereCenter);2546 optCandidate->OtherOptCenter.CopyVector(&OtherNewSphereCenter);3015 CandidateLine.OptCenter.CopyVector(&NewSphereCenter); 3016 CandidateLine.OtherOptCenter.CopyVector(&OtherNewSphereCenter); 2547 3017 } else { 2548 optCandidate->OptCenter.CopyVector(&OtherNewSphereCenter);2549 optCandidate->OtherOptCenter.CopyVector(&NewSphereCenter);3018 CandidateLine.OptCenter.CopyVector(&OtherNewSphereCenter); 3019 CandidateLine.OtherOptCenter.CopyVector(&NewSphereCenter); 2550 3020 } 2551 3021 // if there is an equal candidate, add it to the list without clearing the list 2552 if (( *ShortestAngle - HULLEPSILON) < alpha) {2553 candidates->push_back(optCandidate);2554 Log() << Verbose( 2) << "ACCEPT: We have found an equally good candidate: " << *(optCandidate->point) << " with "2555 << alpha << " and circumsphere's center at " << optCandidate->OptCenter << "." << endl;3022 if ((CandidateLine.ShortestAngle - HULLEPSILON) < alpha) { 3023 CandidateLine.pointlist.push_back(Candidate); 3024 Log() << Verbose(0) << "ACCEPT: We have found an equally good candidate: " << *(Candidate) << " with " 3025 << alpha << " and circumsphere's center at " << CandidateLine.OptCenter << "." << endl; 2556 3026 } else { 2557 3027 // remove all candidates from the list and then the list itself 2558 class CandidateForTesselation *remover = NULL; 2559 for (CandidateList::iterator it = candidates->begin(); it != candidates->end(); ++it) { 2560 remover = *it; 2561 delete(remover); 2562 } 2563 candidates->clear(); 2564 candidates->push_back(optCandidate); 2565 Log() << Verbose(2) << "ACCEPT: We have found a better candidate: " << *(optCandidate->point) << " with " 2566 << alpha << " and circumsphere's center at " << optCandidate->OptCenter << "." << endl; 3028 CandidateLine.pointlist.clear(); 3029 CandidateLine.pointlist.push_back(Candidate); 3030 Log() << Verbose(0) << "ACCEPT: We have found a better candidate: " << *(Candidate) << " with " 3031 << alpha << " and circumsphere's center at " << CandidateLine.OptCenter << "." << endl; 2567 3032 } 2568 *ShortestAngle = alpha;2569 //Log() << Verbose(2) << "INFO: There are " << candidates->size() << " candidates in the list now." << endl;3033 CandidateLine.ShortestAngle = alpha; 3034 Log() << Verbose(0) << "INFO: There are " << CandidateLine.pointlist.size() << " candidates in the list now." << endl; 2570 3035 } else { 2571 if (( optCandidate != NULL) && (optCandidate->point != NULL)) {2572 //Log() << Verbose(2) << "REJECT: Old candidate " << *(optCandidate->point) << " with " << *ShortestAngle << " is better than new one " << *Candidate << " with " << alpha << " ." << endl;3036 if ((Candidate != NULL) && (CandidateLine.pointlist.begin() != CandidateLine.pointlist.end())) { 3037 Log() << Verbose(1) << "REJECT: Old candidate " << *(Candidate) << " with " << CandidateLine.ShortestAngle << " is better than new one " << *Candidate << " with " << alpha << " ." << endl; 2573 3038 } else { 2574 //Log() << Verbose(2) << "REJECT: Candidate " << *Candidate << " with " << alpha << " was rejected." << endl;3039 Log() << Verbose(1) << "REJECT: Candidate " << *Candidate << " with " << alpha << " was rejected." << endl; 2575 3040 } 2576 3041 } 2577 2578 3042 } else { 2579 //Log() << Verbose(2) << "REJECT: NewSphereCenter " << NewSphereCenter << " for " << *Candidate << " is too far away: " << radius << "." << endl;3043 Log() << Verbose(1) << "REJECT: NewSphereCenter " << NewSphereCenter << " for " << *Candidate << " is too far away: " << radius << "." << endl; 2580 3044 } 2581 3045 } else { 2582 //Log() << Verbose(2) << "REJECT: Three points from " << *BaseLine << " and Candidate " << *Candidate << " are linear-dependent." << endl;3046 Log() << Verbose(1) << "REJECT: Three points from " << *CandidateLine.BaseLine << " and Candidate " << *Candidate << " are linear-dependent." << endl; 2583 3047 } 2584 3048 } else { 2585 3049 if (ThirdNode != NULL) { 2586 //Log() << Verbose(2) << "REJECT: Base triangle " << *BaseLine << " and " << *ThirdNode << " contains Candidate " << *Candidate << "." << endl;3050 Log() << Verbose(1) << "REJECT: Base triangle " << *CandidateLine.BaseLine << " and " << *ThirdNode << " contains Candidate " << *Candidate << "." << endl; 2587 3051 } else { 2588 //Log() << Verbose(2) << "REJECT: Base triangle " << *BaseLine << " contains Candidate " << *Candidate << "." << endl;3052 Log() << Verbose(1) << "REJECT: Base triangle " << *CandidateLine.BaseLine << " contains Candidate " << *Candidate << "." << endl; 2589 3053 } 2590 3054 } … … 2597 3061 } else { 2598 3062 if (ThirdNode != NULL) 2599 Log() << Verbose( 2) << "Circumcircle for base line " << *BaseLine << " and third node " << *ThirdNode << " is too big!" << endl;3063 Log() << Verbose(1) << "Circumcircle for base line " << *CandidateLine.BaseLine << " and third node " << *ThirdNode << " is too big!" << endl; 2600 3064 else 2601 Log() << Verbose(2) << "Circumcircle for base line " << *BaseLine << " is too big!" << endl; 2602 } 2603 2604 //Log() << Verbose(2) << "INFO: Sorting candidate list ..." << endl; 2605 if (candidates->size() > 1) { 2606 candidates->unique(); 2607 candidates->sort(SortCandidates); 2608 } 2609 2610 Log() << Verbose(1) << "End of FindThirdPointForTesselation" << endl; 3065 Log() << Verbose(1) << "Circumcircle for base line " << *CandidateLine.BaseLine << " is too big!" << endl; 3066 } 3067 3068 Log() << Verbose(1) << "INFO: Sorting candidate list ..." << endl; 3069 if (CandidateLine.pointlist.size() > 1) { 3070 CandidateLine.pointlist.unique(); 3071 CandidateLine.pointlist.sort(); //SortCandidates); 3072 } 2611 3073 }; 2612 3074 … … 2618 3080 class BoundaryPointSet *Tesselation::GetCommonEndpoint(const BoundaryLineSet * line1, const BoundaryLineSet * line2) const 2619 3081 { 3082 Info FunctionInfo(__func__); 2620 3083 const BoundaryLineSet * lines[2] = { line1, line2 }; 2621 3084 class BoundaryPointSet *node = NULL; 2622 map<int, class BoundaryPointSet *>OrderMap;2623 pair<map<int, class BoundaryPointSet *>::iterator, bool>OrderTest;3085 PointMap OrderMap; 3086 PointTestPair OrderTest; 2624 3087 for (int i = 0; i < 2; i++) 2625 3088 // for both lines … … 2631 3094 { // if insertion fails, we have common endpoint 2632 3095 node = OrderTest.first->second; 2633 Log() << Verbose( 5) << "Common endpoint of lines " << *line13096 Log() << Verbose(1) << "Common endpoint of lines " << *line1 2634 3097 << " and " << *line2 << " is: " << *node << "." << endl; 2635 3098 j = 2; … … 2641 3104 }; 2642 3105 3106 /** Finds the boundary points that are closest to a given Vector \a *x. 3107 * \param *out output stream for debugging 3108 * \param *x Vector to look from 3109 * \return map of BoundaryPointSet of closest points sorted by squared distance or NULL. 3110 */ 3111 DistanceToPointMap * Tesselation::FindClosestBoundaryPointsToVector(const Vector *x, const LinkedCell* LC) const 3112 { 3113 Info FunctionInfo(__func__); 3114 PointMap::const_iterator FindPoint; 3115 int N[NDIM], Nlower[NDIM], Nupper[NDIM]; 3116 3117 if (LinesOnBoundary.empty()) { 3118 eLog() << Verbose(1) << "There is no tesselation structure to compare the point with, please create one first." << endl; 3119 return NULL; 3120 } 3121 3122 // gather all points close to the desired one 3123 LC->SetIndexToVector(x); // ignore status as we calculate bounds below sensibly 3124 for(int i=0;i<NDIM;i++) // store indices of this cell 3125 N[i] = LC->n[i]; 3126 Log() << Verbose(1) << "INFO: Center cell is " << N[0] << ", " << N[1] << ", " << N[2] << " with No. " << LC->index << "." << endl; 3127 3128 DistanceToPointMap * points = new DistanceToPointMap; 3129 LC->GetNeighbourBounds(Nlower, Nupper); 3130 //Log() << Verbose(1) << endl; 3131 for (LC->n[0] = Nlower[0]; LC->n[0] <= Nupper[0]; LC->n[0]++) 3132 for (LC->n[1] = Nlower[1]; LC->n[1] <= Nupper[1]; LC->n[1]++) 3133 for (LC->n[2] = Nlower[2]; LC->n[2] <= Nupper[2]; LC->n[2]++) { 3134 const LinkedNodes *List = LC->GetCurrentCell(); 3135 //Log() << Verbose(1) << "The current cell " << LC->n[0] << "," << LC->n[1] << "," << LC->n[2] << endl; 3136 if (List != NULL) { 3137 for (LinkedNodes::const_iterator Runner = List->begin(); Runner != List->end(); Runner++) { 3138 FindPoint = PointsOnBoundary.find((*Runner)->nr); 3139 if (FindPoint != PointsOnBoundary.end()) { 3140 points->insert(DistanceToPointPair (FindPoint->second->node->node->DistanceSquared(x), FindPoint->second) ); 3141 Log() << Verbose(1) << "INFO: Putting " << *FindPoint->second << " into the list." << endl; 3142 } 3143 } 3144 } else { 3145 eLog() << Verbose(1) << "The current cell " << LC->n[0] << "," << LC->n[1] << "," << LC->n[2] << " is invalid!" << endl; 3146 } 3147 } 3148 3149 // check whether we found some points 3150 if (points->empty()) { 3151 eLog() << Verbose(1) << "There is no nearest point: too far away from the surface." << endl; 3152 delete(points); 3153 return NULL; 3154 } 3155 return points; 3156 }; 3157 3158 /** Finds the boundary line that is closest to a given Vector \a *x. 3159 * \param *out output stream for debugging 3160 * \param *x Vector to look from 3161 * \return closest BoundaryLineSet or NULL in degenerate case. 3162 */ 3163 BoundaryLineSet * Tesselation::FindClosestBoundaryLineToVector(const Vector *x, const LinkedCell* LC) const 3164 { 3165 Info FunctionInfo(__func__); 3166 3167 // get closest points 3168 DistanceToPointMap * points = FindClosestBoundaryPointsToVector(x,LC); 3169 if (points == NULL) { 3170 eLog() << Verbose(1) << "There is no nearest point: too far away from the surface." << endl; 3171 return NULL; 3172 } 3173 3174 // for each point, check its lines, remember closest 3175 Log() << Verbose(1) << "Finding closest BoundaryLine to " << *x << " ... " << endl; 3176 BoundaryLineSet *ClosestLine = NULL; 3177 double MinDistance = -1.; 3178 Vector helper; 3179 Vector Center; 3180 Vector BaseLine; 3181 for (DistanceToPointMap::iterator Runner = points->begin(); Runner != points->end(); Runner++) { 3182 for (LineMap::iterator LineRunner = Runner->second->lines.begin(); LineRunner != Runner->second->lines.end(); LineRunner++) { 3183 // calculate closest point on line to desired point 3184 helper.CopyVector((LineRunner->second)->endpoints[0]->node->node); 3185 helper.AddVector((LineRunner->second)->endpoints[1]->node->node); 3186 helper.Scale(0.5); 3187 Center.CopyVector(x); 3188 Center.SubtractVector(&helper); 3189 BaseLine.CopyVector((LineRunner->second)->endpoints[0]->node->node); 3190 BaseLine.SubtractVector((LineRunner->second)->endpoints[1]->node->node); 3191 Center.ProjectOntoPlane(&BaseLine); 3192 const double distance = Center.NormSquared(); 3193 if ((ClosestLine == NULL) || (distance < MinDistance)) { 3194 // additionally calculate intersection on line (whether it's on the line section or not) 3195 helper.CopyVector(x); 3196 helper.SubtractVector((LineRunner->second)->endpoints[0]->node->node); 3197 helper.SubtractVector(&Center); 3198 const double lengthA = helper.ScalarProduct(&BaseLine); 3199 helper.CopyVector(x); 3200 helper.SubtractVector((LineRunner->second)->endpoints[1]->node->node); 3201 helper.SubtractVector(&Center); 3202 const double lengthB = helper.ScalarProduct(&BaseLine); 3203 if (lengthB*lengthA < 0) { // if have different sign 3204 ClosestLine = LineRunner->second; 3205 MinDistance = distance; 3206 Log() << Verbose(1) << "ACCEPT: New closest line is " << *ClosestLine << " with projected distance " << MinDistance << "." << endl; 3207 } else { 3208 Log() << Verbose(1) << "REJECT: Intersection is outside of the line section: " << lengthA << " and " << lengthB << "." << endl; 3209 } 3210 } else { 3211 Log() << Verbose(1) << "REJECT: Point is too further away than present line: " << distance << " >> " << MinDistance << "." << endl; 3212 } 3213 } 3214 } 3215 delete(points); 3216 // check whether closest line is "too close" :), then it's inside 3217 if (ClosestLine == NULL) { 3218 Log() << Verbose(0) << "Is the only point, no one else is closeby." << endl; 3219 return NULL; 3220 } 3221 return ClosestLine; 3222 }; 3223 3224 2643 3225 /** Finds the triangle that is closest to a given Vector \a *x. 2644 3226 * \param *out output stream for debugging 2645 3227 * \param *x Vector to look from 2646 * \return list of BoundaryTriangleSet of nearest triangles or NULL in degenerate case.2647 */ 2648 list<BoundaryTriangleSet*> * Tesselation::FindClosestTrianglesToPoint(const Vector *x, const LinkedCell* LC) const2649 { 2650 TesselPoint *trianglePoints[3];2651 TesselPoint *SecondPoint = NULL; 2652 list<BoundaryTriangleSet*> *triangles = NULL; 2653 2654 if ( LinesOnBoundary.empty()) {2655 Log() << Verbose(0) << "Error: There is no tesselation structure to compare the point with, please create one first.";3228 * \return BoundaryTriangleSet of nearest triangle or NULL. 3229 */ 3230 TriangleList * Tesselation::FindClosestTrianglesToVector(const Vector *x, const LinkedCell* LC) const 3231 { 3232 Info FunctionInfo(__func__); 3233 3234 // get closest points 3235 DistanceToPointMap * points = FindClosestBoundaryPointsToVector(x,LC); 3236 if (points == NULL) { 3237 eLog() << Verbose(1) << "There is no nearest point: too far away from the surface." << endl; 2656 3238 return NULL; 2657 3239 } 2658 Log() << Verbose(1) << "Finding closest Tesselpoint to " << *x << " ... " << endl; 2659 trianglePoints[0] = FindClosestPoint(x, SecondPoint, LC); 2660 2661 // check whether closest point is "too close" :), then it's inside 2662 if (trianglePoints[0] == NULL) { 2663 Log() << Verbose(2) << "Is the only point, no one else is closeby." << endl; 3240 3241 // for each point, check its lines, remember closest 3242 Log() << Verbose(1) << "Finding closest BoundaryTriangle to " << *x << " ... " << endl; 3243 LineSet ClosestLines; 3244 double MinDistance = 1e+16; 3245 Vector BaseLineIntersection; 3246 Vector Center; 3247 Vector BaseLine; 3248 Vector BaseLineCenter; 3249 for (DistanceToPointMap::iterator Runner = points->begin(); Runner != points->end(); Runner++) { 3250 for (LineMap::iterator LineRunner = Runner->second->lines.begin(); LineRunner != Runner->second->lines.end(); LineRunner++) { 3251 3252 BaseLine.CopyVector((LineRunner->second)->endpoints[0]->node->node); 3253 BaseLine.SubtractVector((LineRunner->second)->endpoints[1]->node->node); 3254 const double lengthBase = BaseLine.NormSquared(); 3255 3256 BaseLineIntersection.CopyVector(x); 3257 BaseLineIntersection.SubtractVector((LineRunner->second)->endpoints[0]->node->node); 3258 const double lengthEndA = BaseLineIntersection.NormSquared(); 3259 3260 BaseLineIntersection.CopyVector(x); 3261 BaseLineIntersection.SubtractVector((LineRunner->second)->endpoints[1]->node->node); 3262 const double lengthEndB = BaseLineIntersection.NormSquared(); 3263 3264 if ((lengthEndA > lengthBase) || (lengthEndB > lengthBase) || ((lengthEndA < MYEPSILON) || (lengthEndB < MYEPSILON))) { // intersection would be outside, take closer endpoint 3265 const double lengthEnd = Min(lengthEndA, lengthEndB); 3266 if (lengthEnd - MinDistance < -MYEPSILON) { // new best line 3267 ClosestLines.clear(); 3268 ClosestLines.insert(LineRunner->second); 3269 MinDistance = lengthEnd; 3270 Log() << Verbose(1) << "ACCEPT: Line " << *LineRunner->second << " to endpoint " << *LineRunner->second->endpoints[0]->node << " is closer with " << lengthEnd << "." << endl; 3271 } else if (fabs(lengthEnd - MinDistance) < MYEPSILON) { // additional best candidate 3272 ClosestLines.insert(LineRunner->second); 3273 Log() << Verbose(1) << "ACCEPT: Line " << *LineRunner->second << " to endpoint " << *LineRunner->second->endpoints[1]->node << " is equally good with " << lengthEnd << "." << endl; 3274 } else { // line is worse 3275 Log() << Verbose(1) << "REJECT: Line " << *LineRunner->second << " to either endpoints is further away than present closest line candidate: " << lengthEndA << ", " << lengthEndB << ", and distance is longer than baseline:" << lengthBase << "." << endl; 3276 } 3277 } else { // intersection is closer, calculate 3278 // calculate closest point on line to desired point 3279 BaseLineIntersection.CopyVector(x); 3280 BaseLineIntersection.SubtractVector((LineRunner->second)->endpoints[1]->node->node); 3281 Center.CopyVector(&BaseLineIntersection); 3282 Center.ProjectOntoPlane(&BaseLine); 3283 BaseLineIntersection.SubtractVector(&Center); 3284 const double distance = BaseLineIntersection.NormSquared(); 3285 if (Center.NormSquared() > BaseLine.NormSquared()) { 3286 eLog() << Verbose(0) << "Algorithmic error: In second case we have intersection outside of baseline!" << endl; 3287 } 3288 if ((ClosestLines.empty()) || (distance < MinDistance)) { 3289 ClosestLines.insert(LineRunner->second); 3290 MinDistance = distance; 3291 Log() << Verbose(1) << "ACCEPT: Intersection in between endpoints, new closest line " << *LineRunner->second << " is " << *ClosestLines.begin() << " with projected distance " << MinDistance << "." << endl; 3292 } else { 3293 Log() << Verbose(2) << "REJECT: Point is further away from line " << *LineRunner->second << " than present closest line: " << distance << " >> " << MinDistance << "." << endl; 3294 } 3295 } 3296 } 3297 } 3298 delete(points); 3299 3300 // check whether closest line is "too close" :), then it's inside 3301 if (ClosestLines.empty()) { 3302 Log() << Verbose(0) << "Is the only point, no one else is closeby." << endl; 2664 3303 return NULL; 2665 3304 } 2666 if (trianglePoints[0]->node->DistanceSquared(x) < MYEPSILON) { 2667 Log() << Verbose(3) << "Point is right on a tesselation point, no nearest triangle." << endl; 2668 PointMap::const_iterator PointRunner = PointsOnBoundary.find(trianglePoints[0]->nr); 2669 triangles = new list<BoundaryTriangleSet*>; 2670 if (PointRunner != PointsOnBoundary.end()) { 2671 for(LineMap::iterator LineRunner = PointRunner->second->lines.begin(); LineRunner != PointRunner->second->lines.end(); LineRunner++) 2672 for(TriangleMap::iterator TriangleRunner = LineRunner->second->triangles.begin(); TriangleRunner != LineRunner->second->triangles.end(); TriangleRunner++) 2673 triangles->push_back(TriangleRunner->second); 2674 triangles->sort(); 2675 triangles->unique(); 2676 } else { 2677 PointRunner = PointsOnBoundary.find(SecondPoint->nr); 2678 trianglePoints[0] = SecondPoint; 2679 if (PointRunner != PointsOnBoundary.end()) { 2680 for(LineMap::iterator LineRunner = PointRunner->second->lines.begin(); LineRunner != PointRunner->second->lines.end(); LineRunner++) 2681 for(TriangleMap::iterator TriangleRunner = LineRunner->second->triangles.begin(); TriangleRunner != LineRunner->second->triangles.end(); TriangleRunner++) 2682 triangles->push_back(TriangleRunner->second); 2683 triangles->sort(); 2684 triangles->unique(); 2685 } else { 2686 eLog() << Verbose(1) << "I cannot find a boundary point to the tessel point " << *trianglePoints[0] << "." << endl; 2687 return NULL; 2688 } 2689 } 2690 } else { 2691 list<TesselPoint*> *connectedClosestPoints = GetCircleOfConnectedPoints(trianglePoints[0], x); 2692 if (connectedClosestPoints != NULL) { 2693 trianglePoints[1] = connectedClosestPoints->front(); 2694 trianglePoints[2] = connectedClosestPoints->back(); 2695 for (int i=0;i<3;i++) { 2696 if (trianglePoints[i] == NULL) { 2697 eLog() << Verbose(1) << "IsInnerPoint encounters serious error, point " << i << " not found." << endl; 2698 } 2699 //Log() << Verbose(2) << "List of triangle points:" << endl; 2700 //Log() << Verbose(3) << *trianglePoints[i] << endl; 2701 } 2702 2703 triangles = FindTriangles(trianglePoints); 2704 Log() << Verbose(2) << "List of possible triangles:" << endl; 2705 for(list<BoundaryTriangleSet*>::iterator Runner = triangles->begin(); Runner != triangles->end(); Runner++) 2706 Log() << Verbose(3) << **Runner << endl; 2707 2708 delete(connectedClosestPoints); 2709 } else { 2710 triangles = NULL; 2711 Log() << Verbose(1) << "There is no circle of connected points!" << endl; 2712 } 2713 } 2714 2715 if ((triangles == NULL) || (triangles->empty())) { 2716 eLog() << Verbose(1) << "There is no nearest triangle. Please check the tesselation structure."; 2717 delete(triangles); 2718 return NULL; 2719 } else 2720 return triangles; 3305 TriangleList * candidates = new TriangleList; 3306 for (LineSet::iterator LineRunner = ClosestLines.begin(); LineRunner != ClosestLines.end(); LineRunner++) 3307 for (TriangleMap::iterator Runner = (*LineRunner)->triangles.begin(); Runner != (*LineRunner)->triangles.end(); Runner++) { 3308 candidates->push_back(Runner->second); 3309 } 3310 return candidates; 2721 3311 }; 2722 3312 … … 2727 3317 * \return list of BoundaryTriangleSet of nearest triangles or NULL. 2728 3318 */ 2729 class BoundaryTriangleSet * Tesselation::FindClosestTriangleToPoint(const Vector *x, const LinkedCell* LC) const 2730 { 3319 class BoundaryTriangleSet * Tesselation::FindClosestTriangleToVector(const Vector *x, const LinkedCell* LC) const 3320 { 3321 Info FunctionInfo(__func__); 2731 3322 class BoundaryTriangleSet *result = NULL; 2732 list<BoundaryTriangleSet*> *triangles = FindClosestTrianglesToPoint(x, LC); 3323 TriangleList *triangles = FindClosestTrianglesToVector(x, LC); 3324 TriangleList candidates; 2733 3325 Vector Center; 2734 2735 if (triangles == NULL) 3326 Vector helper; 3327 3328 if ((triangles == NULL) || (triangles->empty())) 2736 3329 return NULL; 2737 3330 2738 if (triangles->size() == 1) { // there is no degenerate case 2739 result = triangles->front(); 2740 Log() << Verbose(2) << "Normal Vector of this triangle is " << result->NormalVector << "." << endl; 2741 } else { 2742 result = triangles->front(); 2743 result->GetCenter(&Center); 2744 Center.SubtractVector(x); 2745 Log() << Verbose(2) << "Normal Vector of this front side is " << result->NormalVector << "." << endl; 2746 if (Center.ScalarProduct(&result->NormalVector) < 0) { 2747 result = triangles->back(); 2748 Log() << Verbose(2) << "Normal Vector of this back side is " << result->NormalVector << "." << endl; 2749 if (Center.ScalarProduct(&result->NormalVector) < 0) { 2750 eLog() << Verbose(1) << "Front and back side yield NormalVector in wrong direction!" << endl; 2751 } 3331 // go through all and pick the one with the best alignment to x 3332 double MinAlignment = 2.*M_PI; 3333 for (TriangleList::iterator Runner = triangles->begin(); Runner != triangles->end(); Runner++) { 3334 (*Runner)->GetCenter(&Center); 3335 helper.CopyVector(x); 3336 helper.SubtractVector(&Center); 3337 const double Alignment = helper.Angle(&(*Runner)->NormalVector); 3338 if (Alignment < MinAlignment) { 3339 result = *Runner; 3340 MinAlignment = Alignment; 3341 Log() << Verbose(1) << "ACCEPT: Triangle " << *result << " is better aligned with " << MinAlignment << "." << endl; 3342 } else { 3343 Log() << Verbose(1) << "REJECT: Triangle " << *result << " is worse aligned with " << MinAlignment << "." << endl; 2752 3344 } 2753 3345 } 2754 3346 delete(triangles); 3347 2755 3348 return result; 2756 3349 }; 2757 3350 2758 /** Checks whether the provided Vector is within the tesselation structure. 3351 /** Checks whether the provided Vector is within the Tesselation structure. 3352 * Basically calls Tesselation::GetDistanceToSurface() and checks the sign of the return value. 3353 * @param point of which to check the position 3354 * @param *LC LinkedCell structure 3355 * 3356 * @return true if the point is inside the Tesselation structure, false otherwise 3357 */ 3358 bool Tesselation::IsInnerPoint(const Vector &Point, const LinkedCell* const LC) const 3359 { 3360 return (GetDistanceSquaredToSurface(Point, LC) < MYEPSILON); 3361 } 3362 3363 /** Returns the distance to the surface given by the tesselation. 3364 * Calls FindClosestTriangleToVector() and checks whether the resulting triangle's BoundaryTriangleSet#NormalVector points 3365 * towards or away from the given \a &Point. Additionally, we check whether it's normal to the normal vector, i.e. on the 3366 * closest triangle's plane. Then, we have to check whether \a Point is inside the triangle or not to determine whether it's 3367 * an inside or outside point. This is done by calling BoundaryTriangleSet::GetIntersectionInsideTriangle(). 3368 * In the end we additionally find the point on the triangle who was smallest distance to \a Point: 3369 * -# Separate distance from point to center in vector in NormalDirection and on the triangle plane. 3370 * -# Check whether vector on triangle plane points inside the triangle or crosses triangle bounds. 3371 * -# If inside, take it to calculate closest distance 3372 * -# If not, take intersection with BoundaryLine as distance 3373 * 3374 * @note distance is squared despite it still contains a sign to determine in-/outside! 2759 3375 * 2760 3376 * @param point of which to check the position 2761 3377 * @param *LC LinkedCell structure 2762 3378 * 2763 * @return true if the point is inside the tesselation structure, false otherwise2764 */ 2765 bool Tesselation::IsInnerPoint(const Vector &Point, const LinkedCell* const LC) const2766 { 2767 class BoundaryTriangleSet *result = FindClosestTriangleToPoint(&Point, LC);3379 * @return >0 if outside, ==0 if on surface, <0 if inside 3380 */ 3381 double Tesselation::GetDistanceSquaredToTriangle(const Vector &Point, const BoundaryTriangleSet* const triangle) const 3382 { 3383 Info FunctionInfo(__func__); 2768 3384 Vector Center; 2769 2770 if (result == NULL) {// is boundary point or only point in point cloud? 2771 Log() << Verbose(1) << Point << " is the only point in vicinity." << endl; 2772 return false; 2773 } 2774 2775 result->GetCenter(&Center); 2776 Log() << Verbose(3) << "INFO: Central point of the triangle is " << Center << "." << endl; 2777 Center.SubtractVector(&Point); 2778 Log() << Verbose(3) << "INFO: Vector from center to point to test is " << Center << "." << endl; 2779 if (Center.ScalarProduct(&result->NormalVector) > -MYEPSILON) { 2780 Log() << Verbose(1) << Point << " is an inner point." << endl; 2781 return true; 3385 Vector helper; 3386 Vector DistanceToCenter; 3387 Vector Intersection; 3388 double distance = 0.; 3389 3390 if (triangle == NULL) {// is boundary point or only point in point cloud? 3391 Log() << Verbose(1) << "No triangle given!" << endl; 3392 return -1.; 2782 3393 } else { 2783 Log() << Verbose(1) << Point << " is NOT an inner point." << endl; 2784 return false; 2785 } 2786 } 2787 2788 /** Checks whether the provided TesselPoint is within the tesselation structure. 2789 * 2790 * @param *Point of which to check the position 2791 * @param *LC Linked Cell structure 2792 * 2793 * @return true if the point is inside the tesselation structure, false otherwise 2794 */ 2795 bool Tesselation::IsInnerPoint(const TesselPoint * const Point, const LinkedCell* const LC) const 2796 { 2797 return IsInnerPoint(*(Point->node), LC); 2798 } 3394 Log() << Verbose(1) << "INFO: Closest triangle found is " << *triangle << " with normal vector " << triangle->NormalVector << "." << endl; 3395 } 3396 3397 triangle->GetCenter(&Center); 3398 Log() << Verbose(2) << "INFO: Central point of the triangle is " << Center << "." << endl; 3399 DistanceToCenter.CopyVector(&Center); 3400 DistanceToCenter.SubtractVector(&Point); 3401 Log() << Verbose(2) << "INFO: Vector from point to test to center is " << DistanceToCenter << "." << endl; 3402 3403 // check whether we are on boundary 3404 if (fabs(DistanceToCenter.ScalarProduct(&triangle->NormalVector)) < MYEPSILON) { 3405 // calculate whether inside of triangle 3406 DistanceToCenter.CopyVector(&Point); 3407 Center.CopyVector(&Point); 3408 Center.SubtractVector(&triangle->NormalVector); // points towards MolCenter 3409 DistanceToCenter.AddVector(&triangle->NormalVector); // points outside 3410 Log() << Verbose(1) << "INFO: Calling Intersection with " << Center << " and " << DistanceToCenter << "." << endl; 3411 if (triangle->GetIntersectionInsideTriangle(&Center, &DistanceToCenter, &Intersection)) { 3412 Log() << Verbose(1) << Point << " is inner point: sufficiently close to boundary, " << Intersection << "." << endl; 3413 return 0.; 3414 } else { 3415 Log() << Verbose(1) << Point << " is NOT an inner point: on triangle plane but outside of triangle bounds." << endl; 3416 return false; 3417 } 3418 } else { 3419 // calculate smallest distance 3420 distance = triangle->GetClosestPointInsideTriangle(&Point, &Intersection); 3421 Log() << Verbose(1) << "Closest point on triangle is " << Intersection << "." << endl; 3422 3423 // then check direction to boundary 3424 if (DistanceToCenter.ScalarProduct(&triangle->NormalVector) > MYEPSILON) { 3425 Log() << Verbose(1) << Point << " is an inner point, " << distance << " below surface." << endl; 3426 return -distance; 3427 } else { 3428 Log() << Verbose(1) << Point << " is NOT an inner point, " << distance << " above surface." << endl; 3429 return +distance; 3430 } 3431 } 3432 }; 3433 3434 /** Calculates distance to a tesselated surface. 3435 * Combines \sa FindClosestTrianglesToVector() and \sa GetDistanceSquaredToTriangle(). 3436 * \param &Point point to calculate distance from 3437 * \param *LC needed for finding closest points fast 3438 * \return distance squared to closest point on surface 3439 */ 3440 double Tesselation::GetDistanceSquaredToSurface(const Vector &Point, const LinkedCell* const LC) const 3441 { 3442 BoundaryTriangleSet *triangle = FindClosestTriangleToVector(&Point, LC); 3443 const double distance = GetDistanceSquaredToTriangle(Point, triangle); 3444 return Min(distance, LC->RADIUS); 3445 }; 2799 3446 2800 3447 /** Gets all points connected to the provided point by triangulation lines. … … 2804 3451 * @return set of the all points linked to the provided one 2805 3452 */ 2806 set<TesselPoint*> * Tesselation::GetAllConnectedPoints(const TesselPoint* const Point) const 2807 { 2808 set<TesselPoint*> *connectedPoints = new set<TesselPoint*>; 3453 TesselPointSet * Tesselation::GetAllConnectedPoints(const TesselPoint* const Point) const 3454 { 3455 Info FunctionInfo(__func__); 3456 TesselPointSet *connectedPoints = new TesselPointSet; 2809 3457 class BoundaryPointSet *ReferencePoint = NULL; 2810 3458 TesselPoint* current; 2811 3459 bool takePoint = false; 2812 2813 Log() << Verbose(3) << "Begin of GetAllConnectedPoints" << endl;2814 3460 2815 3461 // find the respective boundary point … … 2818 3464 ReferencePoint = PointRunner->second; 2819 3465 } else { 2820 Log() << Verbose(2) << "GetAllConnectedPoints() could not find the BoundaryPoint belonging to " << *Point << "." << endl;3466 eLog() << Verbose(2) << "GetAllConnectedPoints() could not find the BoundaryPoint belonging to " << *Point << "." << endl; 2821 3467 ReferencePoint = NULL; 2822 3468 } … … 2842 3488 2843 3489 if (takePoint) { 2844 Log() << Verbose( 5) << "INFO: Endpoint " << *current << " of line " << *(findLines->second) << " is enlisted." << endl;3490 Log() << Verbose(1) << "INFO: Endpoint " << *current << " of line " << *(findLines->second) << " is enlisted." << endl; 2845 3491 connectedPoints->insert(current); 2846 3492 } … … 2849 3495 } 2850 3496 2851 if (connectedPoints-> size() == 0) { // if have not found any points3497 if (connectedPoints->empty()) { // if have not found any points 2852 3498 eLog() << Verbose(1) << "We have not found any connected points to " << *Point<< "." << endl; 2853 3499 return NULL; 2854 3500 } 2855 3501 2856 Log() << Verbose(3) << "End of GetAllConnectedPoints" << endl;2857 3502 return connectedPoints; 2858 3503 }; … … 2866 3511 * 2867 3512 * @param *out output stream for debugging 3513 * @param *SetOfNeighbours all points for which the angle should be calculated 2868 3514 * @param *Point of which get all connected points 2869 3515 * @param *Reference Reference vector for zero angle or NULL for no preference 2870 3516 * @return list of the all points linked to the provided one 2871 3517 */ 2872 list<TesselPoint*> * Tesselation::GetCircleOfConnectedPoints(const TesselPoint* const Point, const Vector * const Reference) const 2873 { 3518 TesselPointList * Tesselation::GetCircleOfConnectedTriangles(TesselPointSet *SetOfNeighbours, const TesselPoint* const Point, const Vector * const Reference) const 3519 { 3520 Info FunctionInfo(__func__); 2874 3521 map<double, TesselPoint*> anglesOfPoints; 2875 set<TesselPoint*> *connectedPoints = GetAllConnectedPoints(Point); 2876 list<TesselPoint*> *connectedCircle = new list<TesselPoint*>; 3522 TesselPointList *connectedCircle = new TesselPointList; 3523 Vector PlaneNormal; 3524 Vector AngleZero; 3525 Vector OrthogonalVector; 3526 Vector helper; 3527 const TesselPoint * const TrianglePoints[3] = {Point, NULL, NULL}; 3528 TriangleList *triangles = NULL; 3529 3530 if (SetOfNeighbours == NULL) { 3531 eLog() << Verbose(2) << "Could not find any connected points!" << endl; 3532 delete(connectedCircle); 3533 return NULL; 3534 } 3535 3536 // calculate central point 3537 triangles = FindTriangles(TrianglePoints); 3538 if ((triangles != NULL) && (!triangles->empty())) { 3539 for (TriangleList::iterator Runner = triangles->begin(); Runner != triangles->end(); Runner++) 3540 PlaneNormal.AddVector(&(*Runner)->NormalVector); 3541 } else { 3542 eLog() << Verbose(0) << "Could not find any triangles for point " << *Point << "." << endl; 3543 performCriticalExit(); 3544 } 3545 PlaneNormal.Scale(1.0/triangles->size()); 3546 Log() << Verbose(1) << "INFO: Calculated PlaneNormal of all circle points is " << PlaneNormal << "." << endl; 3547 PlaneNormal.Normalize(); 3548 3549 // construct one orthogonal vector 3550 if (Reference != NULL) { 3551 AngleZero.CopyVector(Reference); 3552 AngleZero.SubtractVector(Point->node); 3553 AngleZero.ProjectOntoPlane(&PlaneNormal); 3554 } 3555 if ((Reference == NULL) || (AngleZero.NormSquared() < MYEPSILON )) { 3556 Log() << Verbose(1) << "Using alternatively " << *(*SetOfNeighbours->begin())->node << " as angle 0 referencer." << endl; 3557 AngleZero.CopyVector((*SetOfNeighbours->begin())->node); 3558 AngleZero.SubtractVector(Point->node); 3559 AngleZero.ProjectOntoPlane(&PlaneNormal); 3560 if (AngleZero.NormSquared() < MYEPSILON) { 3561 eLog() << Verbose(0) << "CRITIAL: AngleZero is 0 even with alternative reference. The algorithm has to be changed here!" << endl; 3562 performCriticalExit(); 3563 } 3564 } 3565 Log() << Verbose(1) << "INFO: Reference vector on this plane representing angle 0 is " << AngleZero << "." << endl; 3566 if (AngleZero.NormSquared() > MYEPSILON) 3567 OrthogonalVector.MakeNormalVector(&PlaneNormal, &AngleZero); 3568 else 3569 OrthogonalVector.MakeNormalVector(&PlaneNormal); 3570 Log() << Verbose(1) << "INFO: OrthogonalVector on plane is " << OrthogonalVector << "." << endl; 3571 3572 // go through all connected points and calculate angle 3573 for (TesselPointSet::iterator listRunner = SetOfNeighbours->begin(); listRunner != SetOfNeighbours->end(); listRunner++) { 3574 helper.CopyVector((*listRunner)->node); 3575 helper.SubtractVector(Point->node); 3576 helper.ProjectOntoPlane(&PlaneNormal); 3577 double angle = GetAngle(helper, AngleZero, OrthogonalVector); 3578 Log() << Verbose(0) << "INFO: Calculated angle is " << angle << " for point " << **listRunner << "." << endl; 3579 anglesOfPoints.insert(pair<double, TesselPoint*>(angle, (*listRunner))); 3580 } 3581 3582 for(map<double, TesselPoint*>::iterator AngleRunner = anglesOfPoints.begin(); AngleRunner != anglesOfPoints.end(); AngleRunner++) { 3583 connectedCircle->push_back(AngleRunner->second); 3584 } 3585 3586 return connectedCircle; 3587 } 3588 3589 /** Gets all points connected to the provided point by triangulation lines, ordered such that we have the circle round the point. 3590 * Maps them down onto the plane designated by the axis \a *Point and \a *Reference. The center of all points 3591 * connected in the tesselation to \a *Point is mapped to spherical coordinates with the zero angle being given 3592 * by the mapped down \a *Reference. Hence, the biggest and the smallest angles are those of the two shanks of the 3593 * triangle we are looking for. 3594 * 3595 * @param *SetOfNeighbours all points for which the angle should be calculated 3596 * @param *Point of which get all connected points 3597 * @param *Reference Reference vector for zero angle or NULL for no preference 3598 * @return list of the all points linked to the provided one 3599 */ 3600 TesselPointList * Tesselation::GetCircleOfSetOfPoints(TesselPointSet *SetOfNeighbours, const TesselPoint* const Point, const Vector * const Reference) const 3601 { 3602 Info FunctionInfo(__func__); 3603 map<double, TesselPoint*> anglesOfPoints; 3604 TesselPointList *connectedCircle = new TesselPointList; 2877 3605 Vector center; 2878 3606 Vector PlaneNormal; … … 2881 3609 Vector helper; 2882 3610 2883 if ( connectedPoints == NULL) {2884 Log() << Verbose(2) << "Could not find any connected points!" << endl;3611 if (SetOfNeighbours == NULL) { 3612 eLog() << Verbose(2) << "Could not find any connected points!" << endl; 2885 3613 delete(connectedCircle); 2886 3614 return NULL; 2887 3615 } 2888 Log() << Verbose(2) << "Begin of GetCircleOfConnectedPoints" << endl; 2889 3616 3617 // check whether there's something to do 3618 if (SetOfNeighbours->size() < 3) { 3619 for (TesselPointSet::iterator TesselRunner = SetOfNeighbours->begin(); TesselRunner != SetOfNeighbours->end(); TesselRunner++) 3620 connectedCircle->push_back(*TesselRunner); 3621 return connectedCircle; 3622 } 3623 3624 Log() << Verbose(1) << "INFO: Point is " << *Point << " and Reference is " << *Reference << "." << endl; 2890 3625 // calculate central point 2891 for (set<TesselPoint*>::const_iterator TesselRunner = connectedPoints->begin(); TesselRunner != connectedPoints->end(); TesselRunner++) 2892 center.AddVector((*TesselRunner)->node); 3626 3627 TesselPointSet::const_iterator TesselA = SetOfNeighbours->begin(); 3628 TesselPointSet::const_iterator TesselB = SetOfNeighbours->begin(); 3629 TesselPointSet::const_iterator TesselC = SetOfNeighbours->begin(); 3630 TesselB++; 3631 TesselC++; 3632 TesselC++; 3633 int counter = 0; 3634 while (TesselC != SetOfNeighbours->end()) { 3635 helper.MakeNormalVector((*TesselA)->node, (*TesselB)->node, (*TesselC)->node); 3636 Log() << Verbose(0) << "Making normal vector out of " << *(*TesselA) << ", " << *(*TesselB) << " and " << *(*TesselC) << ":" << helper << endl; 3637 counter++; 3638 TesselA++; 3639 TesselB++; 3640 TesselC++; 3641 PlaneNormal.AddVector(&helper); 3642 } 2893 3643 //Log() << Verbose(0) << "Summed vectors " << center << "; number of points " << connectedPoints.size() 2894 // << "; scale factor " << 1.0/connectedPoints.size();2895 center.Scale(1.0/connectedPoints->size());2896 Log() << Verbose(4) << "INFO: Calculated center of all circle points is " << center << "." << endl;2897 2898 // projection plane of the circle is at the closes Point and normal is pointing away from center of all circle points2899 PlaneNormal.CopyVector(Point->node);2900 PlaneNormal.SubtractVector(¢er);2901 PlaneNormal.Normalize();2902 Log() << Verbose( 4) << "INFO: Calculated plane normal of circle is " << PlaneNormal << "." << endl;3644 // << "; scale factor " << counter; 3645 PlaneNormal.Scale(1.0/(double)counter); 3646 // Log() << Verbose(1) << "INFO: Calculated center of all circle points is " << center << "." << endl; 3647 // 3648 // // projection plane of the circle is at the closes Point and normal is pointing away from center of all circle points 3649 // PlaneNormal.CopyVector(Point->node); 3650 // PlaneNormal.SubtractVector(¢er); 3651 // PlaneNormal.Normalize(); 3652 Log() << Verbose(1) << "INFO: Calculated plane normal of circle is " << PlaneNormal << "." << endl; 2903 3653 2904 3654 // construct one orthogonal vector … … 2909 3659 } 2910 3660 if ((Reference == NULL) || (AngleZero.NormSquared() < MYEPSILON )) { 2911 Log() << Verbose( 4) << "Using alternatively " << *(*connectedPoints->begin())->node << " as angle 0 referencer." << endl;2912 AngleZero.CopyVector((* connectedPoints->begin())->node);3661 Log() << Verbose(1) << "Using alternatively " << *(*SetOfNeighbours->begin())->node << " as angle 0 referencer." << endl; 3662 AngleZero.CopyVector((*SetOfNeighbours->begin())->node); 2913 3663 AngleZero.SubtractVector(Point->node); 2914 3664 AngleZero.ProjectOntoPlane(&PlaneNormal); … … 2918 3668 } 2919 3669 } 2920 Log() << Verbose( 4) << "INFO: Reference vector on this plane representing angle 0 is " << AngleZero << "." << endl;3670 Log() << Verbose(1) << "INFO: Reference vector on this plane representing angle 0 is " << AngleZero << "." << endl; 2921 3671 if (AngleZero.NormSquared() > MYEPSILON) 2922 3672 OrthogonalVector.MakeNormalVector(&PlaneNormal, &AngleZero); 2923 3673 else 2924 3674 OrthogonalVector.MakeNormalVector(&PlaneNormal); 2925 Log() << Verbose( 4) << "INFO: OrthogonalVector on plane is " << OrthogonalVector << "." << endl;3675 Log() << Verbose(1) << "INFO: OrthogonalVector on plane is " << OrthogonalVector << "." << endl; 2926 3676 2927 3677 // go through all connected points and calculate angle 2928 for (set<TesselPoint*>::iterator listRunner = connectedPoints->begin(); listRunner != connectedPoints->end(); listRunner++) { 3678 pair <map<double, TesselPoint*>::iterator, bool > InserterTest; 3679 for (TesselPointSet::iterator listRunner = SetOfNeighbours->begin(); listRunner != SetOfNeighbours->end(); listRunner++) { 2929 3680 helper.CopyVector((*listRunner)->node); 2930 3681 helper.SubtractVector(Point->node); 2931 3682 helper.ProjectOntoPlane(&PlaneNormal); 2932 3683 double angle = GetAngle(helper, AngleZero, OrthogonalVector); 2933 Log() << Verbose(3) << "INFO: Calculated angle is " << angle << " for point " << **listRunner << "." << endl; 2934 anglesOfPoints.insert(pair<double, TesselPoint*>(angle, (*listRunner))); 3684 if (angle > M_PI) // the correction is of no use here (and not desired) 3685 angle = 2.*M_PI - angle; 3686 Log() << Verbose(0) << "INFO: Calculated angle between " << helper << " and " << AngleZero << " is " << angle << " for point " << **listRunner << "." << endl; 3687 InserterTest = anglesOfPoints.insert(pair<double, TesselPoint*>(angle, (*listRunner))); 3688 if (!InserterTest.second) { 3689 eLog() << Verbose(0) << "GetCircleOfSetOfPoints() got two atoms with same angle: " << *((InserterTest.first)->second) << " and " << (*listRunner) << endl; 3690 performCriticalExit(); 3691 } 2935 3692 } 2936 3693 … … 2938 3695 connectedCircle->push_back(AngleRunner->second); 2939 3696 } 2940 2941 delete(connectedPoints);2942 2943 Log() << Verbose(2) << "End of GetCircleOfConnectedPoints" << endl;2944 3697 2945 3698 return connectedCircle; … … 2952 3705 * @return list of the all points linked to the provided one 2953 3706 */ 2954 list<list<TesselPoint*> *> * Tesselation::GetPathsOfConnectedPoints(const TesselPoint* const Point) const 2955 { 3707 ListOfTesselPointList * Tesselation::GetPathsOfConnectedPoints(const TesselPoint* const Point) const 3708 { 3709 Info FunctionInfo(__func__); 2956 3710 map<double, TesselPoint*> anglesOfPoints; 2957 list< list<TesselPoint*> *> *ListOfPaths = new list<list<TesselPoint*>*>;2958 list<TesselPoint*>*connectedPath = NULL;3711 list< TesselPointList *> *ListOfPaths = new list< TesselPointList *>; 3712 TesselPointList *connectedPath = NULL; 2959 3713 Vector center; 2960 3714 Vector PlaneNormal; … … 2993 3747 } else if (!LineRunner->second) { 2994 3748 LineRunner->second = true; 2995 connectedPath = new list<TesselPoint*>;3749 connectedPath = new TesselPointList; 2996 3750 triangle = NULL; 2997 3751 CurrentLine = runner->second; 2998 3752 StartLine = CurrentLine; 2999 3753 CurrentPoint = CurrentLine->GetOtherEndpoint(ReferencePoint); 3000 Log() << Verbose( 3)<< "INFO: Beginning path retrieval at " << *CurrentPoint << " of line " << *CurrentLine << "." << endl;3754 Log() << Verbose(1)<< "INFO: Beginning path retrieval at " << *CurrentPoint << " of line " << *CurrentLine << "." << endl; 3001 3755 do { 3002 3756 // push current one 3003 Log() << Verbose( 3) << "INFO: Putting " << *CurrentPoint << " at end of path." << endl;3757 Log() << Verbose(1) << "INFO: Putting " << *CurrentPoint << " at end of path." << endl; 3004 3758 connectedPath->push_back(CurrentPoint->node); 3005 3759 3006 3760 // find next triangle 3007 3761 for (TriangleMap::iterator Runner = CurrentLine->triangles.begin(); Runner != CurrentLine->triangles.end(); Runner++) { 3008 Log() << Verbose( 3) << "INFO: Inspecting triangle " << *Runner->second << "." << endl;3762 Log() << Verbose(1) << "INFO: Inspecting triangle " << *Runner->second << "." << endl; 3009 3763 if ((Runner->second != triangle)) { // look for first triangle not equal to old one 3010 3764 triangle = Runner->second; … … 3013 3767 if (!TriangleRunner->second) { 3014 3768 TriangleRunner->second = true; 3015 Log() << Verbose( 3) << "INFO: Connecting triangle is " << *triangle << "." << endl;3769 Log() << Verbose(1) << "INFO: Connecting triangle is " << *triangle << "." << endl; 3016 3770 break; 3017 3771 } else { 3018 Log() << Verbose( 3) << "INFO: Skipping " << *triangle << ", as we have already visited it." << endl;3772 Log() << Verbose(1) << "INFO: Skipping " << *triangle << ", as we have already visited it." << endl; 3019 3773 triangle = NULL; 3020 3774 } … … 3031 3785 if ((triangle->lines[i] != CurrentLine) && (triangle->lines[i]->ContainsBoundaryPoint(ReferencePoint))) { // not the current line and still containing Point 3032 3786 CurrentLine = triangle->lines[i]; 3033 Log() << Verbose( 3) << "INFO: Connecting line is " << *CurrentLine << "." << endl;3787 Log() << Verbose(1) << "INFO: Connecting line is " << *CurrentLine << "." << endl; 3034 3788 break; 3035 3789 } … … 3045 3799 } while (CurrentLine != StartLine); 3046 3800 // last point is missing, as it's on start line 3047 Log() << Verbose( 3) << "INFO: Putting " << *CurrentPoint << " at end of path." << endl;3801 Log() << Verbose(1) << "INFO: Putting " << *CurrentPoint << " at end of path." << endl; 3048 3802 if (StartLine->GetOtherEndpoint(ReferencePoint)->node != connectedPath->back()) 3049 3803 connectedPath->push_back(StartLine->GetOtherEndpoint(ReferencePoint)->node); … … 3051 3805 ListOfPaths->push_back(connectedPath); 3052 3806 } else { 3053 Log() << Verbose( 3) << "INFO: Skipping " << *runner->second << ", as we have already visited it." << endl;3807 Log() << Verbose(1) << "INFO: Skipping " << *runner->second << ", as we have already visited it." << endl; 3054 3808 } 3055 3809 } … … 3067 3821 * @return list of the closed paths 3068 3822 */ 3069 list<list<TesselPoint*> *> * Tesselation::GetClosedPathsOfConnectedPoints(const TesselPoint* const Point) const 3070 { 3071 list<list<TesselPoint*> *> *ListofPaths = GetPathsOfConnectedPoints(Point); 3072 list<list<TesselPoint*> *> *ListofClosedPaths = new list<list<TesselPoint*> *>; 3073 list<TesselPoint*> *connectedPath = NULL; 3074 list<TesselPoint*> *newPath = NULL; 3823 ListOfTesselPointList * Tesselation::GetClosedPathsOfConnectedPoints(const TesselPoint* const Point) const 3824 { 3825 Info FunctionInfo(__func__); 3826 list<TesselPointList *> *ListofPaths = GetPathsOfConnectedPoints(Point); 3827 list<TesselPointList *> *ListofClosedPaths = new list<TesselPointList *>; 3828 TesselPointList *connectedPath = NULL; 3829 TesselPointList *newPath = NULL; 3075 3830 int count = 0; 3076 3831 3077 3832 3078 list<TesselPoint*>::iterator CircleRunner;3079 list<TesselPoint*>::iterator CircleStart;3080 3081 for(list< list<TesselPoint*>*>::iterator ListRunner = ListofPaths->begin(); ListRunner != ListofPaths->end(); ListRunner++) {3833 TesselPointList::iterator CircleRunner; 3834 TesselPointList::iterator CircleStart; 3835 3836 for(list<TesselPointList *>::iterator ListRunner = ListofPaths->begin(); ListRunner != ListofPaths->end(); ListRunner++) { 3082 3837 connectedPath = *ListRunner; 3083 3838 3084 Log() << Verbose( 2) << "INFO: Current path is " << connectedPath << "." << endl;3839 Log() << Verbose(1) << "INFO: Current path is " << connectedPath << "." << endl; 3085 3840 3086 3841 // go through list, look for reappearance of starting Point and count … … 3088 3843 3089 3844 // go through list, look for reappearance of starting Point and create list 3090 list<TesselPoint*>::iterator Marker = CircleStart;3845 TesselPointList::iterator Marker = CircleStart; 3091 3846 for (CircleRunner = CircleStart; CircleRunner != connectedPath->end(); CircleRunner++) { 3092 3847 if ((*CircleRunner == *CircleStart) && (CircleRunner != CircleStart)) { // is not the very first point 3093 3848 // we have a closed circle from Marker to new Marker 3094 Log() << Verbose( 3) << count+1 << ". closed path consists of: ";3095 newPath = new list<TesselPoint*>;3096 list<TesselPoint*>::iterator CircleSprinter = Marker;3849 Log() << Verbose(1) << count+1 << ". closed path consists of: "; 3850 newPath = new TesselPointList; 3851 TesselPointList::iterator CircleSprinter = Marker; 3097 3852 for (; CircleSprinter != CircleRunner; CircleSprinter++) { 3098 3853 newPath->push_back(*CircleSprinter); … … 3108 3863 } 3109 3864 } 3110 Log() << Verbose( 3) << "INFO: " << count << " closed additional path(s) have been created." << endl;3865 Log() << Verbose(1) << "INFO: " << count << " closed additional path(s) have been created." << endl; 3111 3866 3112 3867 // delete list of paths … … 3128 3883 * \return pointer to allocated list of triangles 3129 3884 */ 3130 set<BoundaryTriangleSet*> *Tesselation::GetAllTriangles(const BoundaryPointSet * const Point) const 3131 { 3132 set<BoundaryTriangleSet*> *connectedTriangles = new set<BoundaryTriangleSet*>; 3885 TriangleSet *Tesselation::GetAllTriangles(const BoundaryPointSet * const Point) const 3886 { 3887 Info FunctionInfo(__func__); 3888 TriangleSet *connectedTriangles = new TriangleSet; 3133 3889 3134 3890 if (Point == NULL) { … … 3168 3924 return 0.; 3169 3925 } else 3170 Log() << Verbose( 2) << "Removing point " << *point << " from tesselated boundary ..." << endl;3926 Log() << Verbose(0) << "Removing point " << *point << " from tesselated boundary ..." << endl; 3171 3927 3172 3928 // copy old location for the volume … … 3179 3935 } 3180 3936 3181 list< list<TesselPoint*>*> *ListOfClosedPaths = GetClosedPathsOfConnectedPoints(point->node);3182 list<TesselPoint*>*connectedPath = NULL;3937 list<TesselPointList *> *ListOfClosedPaths = GetClosedPathsOfConnectedPoints(point->node); 3938 TesselPointList *connectedPath = NULL; 3183 3939 3184 3940 // gather all triangles 3185 3941 for (LineMap::iterator LineRunner = point->lines.begin(); LineRunner != point->lines.end(); LineRunner++) 3186 3942 count+=LineRunner->second->triangles.size(); 3187 map<class BoundaryTriangleSet *, int>Candidates;3943 TriangleMap Candidates; 3188 3944 for (LineMap::iterator LineRunner = point->lines.begin(); LineRunner != point->lines.end(); LineRunner++) { 3189 3945 line = LineRunner->second; 3190 3946 for (TriangleMap::iterator TriangleRunner = line->triangles.begin(); TriangleRunner != line->triangles.end(); TriangleRunner++) { 3191 3947 triangle = TriangleRunner->second; 3192 Candidates.insert( pair<class BoundaryTriangleSet *, int> (triangle, triangle->Nr) );3948 Candidates.insert( TrianglePair (triangle->Nr, triangle) ); 3193 3949 } 3194 3950 } … … 3197 3953 count=0; 3198 3954 NormalVector.Zero(); 3199 for ( map<class BoundaryTriangleSet *, int>::iterator Runner = Candidates.begin(); Runner != Candidates.end(); Runner++) {3200 Log() << Verbose( 3) << "INFO: Removing triangle " << *(Runner->first) << "." << endl;3201 NormalVector.SubtractVector(&Runner-> first->NormalVector); // has to point inward3202 RemoveTesselationTriangle(Runner-> first);3955 for (TriangleMap::iterator Runner = Candidates.begin(); Runner != Candidates.end(); Runner++) { 3956 Log() << Verbose(1) << "INFO: Removing triangle " << *(Runner->second) << "." << endl; 3957 NormalVector.SubtractVector(&Runner->second->NormalVector); // has to point inward 3958 RemoveTesselationTriangle(Runner->second); 3203 3959 count++; 3204 3960 } 3205 3961 Log() << Verbose(1) << count << " triangles were removed." << endl; 3206 3962 3207 list< list<TesselPoint*>*>::iterator ListAdvance = ListOfClosedPaths->begin();3208 list< list<TesselPoint*>*>::iterator ListRunner = ListAdvance;3209 map<class BoundaryTriangleSet *, int>::iterator NumberRunner = Candidates.begin();3210 list<TesselPoint*>::iterator StartNode, MiddleNode, EndNode;3963 list<TesselPointList *>::iterator ListAdvance = ListOfClosedPaths->begin(); 3964 list<TesselPointList *>::iterator ListRunner = ListAdvance; 3965 TriangleMap::iterator NumberRunner = Candidates.begin(); 3966 TesselPointList::iterator StartNode, MiddleNode, EndNode; 3211 3967 double angle; 3212 3968 double smallestangle; … … 3222 3978 3223 3979 // re-create all triangles by going through connected points list 3224 list<class BoundaryLineSet *>NewLines;3980 LineList NewLines; 3225 3981 for (;!connectedPath->empty();) { 3226 3982 // search middle node with widest angle to next neighbours … … 3228 3984 smallestangle = 0.; 3229 3985 for (MiddleNode = connectedPath->begin(); MiddleNode != connectedPath->end(); MiddleNode++) { 3230 Log() << Verbose( 3) << "INFO: MiddleNode is " << **MiddleNode << "." << endl;3986 Log() << Verbose(1) << "INFO: MiddleNode is " << **MiddleNode << "." << endl; 3231 3987 // construct vectors to next and previous neighbour 3232 3988 StartNode = MiddleNode; … … 3256 4012 MiddleNode = EndNode; 3257 4013 if (MiddleNode == connectedPath->end()) { 3258 Log() << Verbose(1) << "CRITICAL: Could not find a smallest angle!" << endl;3259 exit(255);4014 eLog() << Verbose(0) << "CRITICAL: Could not find a smallest angle!" << endl; 4015 performCriticalExit(); 3260 4016 } 3261 4017 StartNode = MiddleNode; … … 3266 4022 if (EndNode == connectedPath->end()) 3267 4023 EndNode = connectedPath->begin(); 3268 Log() << Verbose( 4) << "INFO: StartNode is " << **StartNode << "." << endl;3269 Log() << Verbose( 4) << "INFO: MiddleNode is " << **MiddleNode << "." << endl;3270 Log() << Verbose( 4) << "INFO: EndNode is " << **EndNode << "." << endl;3271 Log() << Verbose( 3) << "INFO: Attempting to create triangle " << (*StartNode)->Name << ", " << (*MiddleNode)->Name << " and " << (*EndNode)->Name << "." << endl;4024 Log() << Verbose(2) << "INFO: StartNode is " << **StartNode << "." << endl; 4025 Log() << Verbose(2) << "INFO: MiddleNode is " << **MiddleNode << "." << endl; 4026 Log() << Verbose(2) << "INFO: EndNode is " << **EndNode << "." << endl; 4027 Log() << Verbose(1) << "INFO: Attempting to create triangle " << (*StartNode)->Name << ", " << (*MiddleNode)->Name << " and " << (*EndNode)->Name << "." << endl; 3272 4028 TriangleCandidates[0] = *StartNode; 3273 4029 TriangleCandidates[1] = *MiddleNode; … … 3275 4031 triangle = GetPresentTriangle(TriangleCandidates); 3276 4032 if (triangle != NULL) { 3277 eLog() << Verbose( 2) << "New triangle already present, skipping!" << endl;4033 eLog() << Verbose(0) << "New triangle already present, skipping!" << endl; 3278 4034 StartNode++; 3279 4035 MiddleNode++; … … 3287 4043 continue; 3288 4044 } 3289 Log() << Verbose( 5) << "Adding new triangle points."<< endl;4045 Log() << Verbose(3) << "Adding new triangle points."<< endl; 3290 4046 AddTesselationPoint(*StartNode, 0); 3291 4047 AddTesselationPoint(*MiddleNode, 1); 3292 4048 AddTesselationPoint(*EndNode, 2); 3293 Log() << Verbose( 5) << "Adding new triangle lines."<< endl;4049 Log() << Verbose(3) << "Adding new triangle lines."<< endl; 3294 4050 AddTesselationLine(TPS[0], TPS[1], 0); 3295 4051 AddTesselationLine(TPS[0], TPS[2], 1); … … 3306 4062 // prepare nodes for next triangle 3307 4063 StartNode = EndNode; 3308 Log() << Verbose( 4) << "Removing " << **MiddleNode << " from closed path, remaining points: " << connectedPath->size() << "." << endl;4064 Log() << Verbose(2) << "Removing " << **MiddleNode << " from closed path, remaining points: " << connectedPath->size() << "." << endl; 3309 4065 connectedPath->remove(*MiddleNode); // remove the middle node (it is surrounded by triangles) 3310 4066 if (connectedPath->size() == 2) { // we are done … … 3313 4069 break; 3314 4070 } else if (connectedPath->size() < 2) { // something's gone wrong! 3315 Log() << Verbose(1) << "CRITICAL: There are only two endpoints left!" << endl;3316 exit(255);4071 eLog() << Verbose(0) << "CRITICAL: There are only two endpoints left!" << endl; 4072 performCriticalExit(); 3317 4073 } else { 3318 4074 MiddleNode = StartNode; … … 3328 4084 // maximize the inner lines (we preferentially created lines with a huge angle, which is for the tesselation not wanted though useful for the closing) 3329 4085 if (NewLines.size() > 1) { 3330 list<class BoundaryLineSet *>::iterator Candidate;4086 LineList::iterator Candidate; 3331 4087 class BoundaryLineSet *OtherBase = NULL; 3332 4088 double tmp, maxgain; 3333 4089 do { 3334 4090 maxgain = 0; 3335 for( list<class BoundaryLineSet *>::iterator Runner = NewLines.begin(); Runner != NewLines.end(); Runner++) {4091 for(LineList::iterator Runner = NewLines.begin(); Runner != NewLines.end(); Runner++) { 3336 4092 tmp = PickFarthestofTwoBaselines(*Runner); 3337 4093 if (maxgain < tmp) { … … 3342 4098 if (maxgain != 0) { 3343 4099 volume += maxgain; 3344 Log() << Verbose( 3) << "Flipping baseline with highest volume" << **Candidate << "." << endl;4100 Log() << Verbose(1) << "Flipping baseline with highest volume" << **Candidate << "." << endl; 3345 4101 OtherBase = FlipBaseline(*Candidate); 3346 4102 NewLines.erase(Candidate); … … 3353 4109 delete(connectedPath); 3354 4110 } 3355 Log() << Verbose( 1) << count << " triangles were created." << endl;4111 Log() << Verbose(0) << count << " triangles were created." << endl; 3356 4112 } else { 3357 4113 while (!ListOfClosedPaths->empty()) { … … 3361 4117 delete(connectedPath); 3362 4118 } 3363 Log() << Verbose( 1) << "No need to create any triangles." << endl;4119 Log() << Verbose(0) << "No need to create any triangles." << endl; 3364 4120 } 3365 4121 delete(ListOfClosedPaths); 3366 4122 3367 Log() << Verbose( 1) << "Removed volume is " << volume << "." << endl;4123 Log() << Verbose(0) << "Removed volume is " << volume << "." << endl; 3368 4124 3369 4125 return volume; … … 3375 4131 * Finds triangles belonging to the three provided points. 3376 4132 * 3377 * @param *Points[3] list, is expected to contain three points 4133 * @param *Points[3] list, is expected to contain three points (NULL means wildcard) 3378 4134 * 3379 4135 * @return triangles which belong to the provided points, will be empty if there are none, 3380 4136 * will usually be one, in case of degeneration, there will be two 3381 4137 */ 3382 list<BoundaryTriangleSet*> *Tesselation::FindTriangles(const TesselPoint* const Points[3]) const 3383 { 3384 list<BoundaryTriangleSet*> *result = new list<BoundaryTriangleSet*>; 4138 TriangleList *Tesselation::FindTriangles(const TesselPoint* const Points[3]) const 4139 { 4140 Info FunctionInfo(__func__); 4141 TriangleList *result = new TriangleList; 3385 4142 LineMap::const_iterator FindLine; 3386 4143 TriangleMap::const_iterator FindTriangle; 3387 4144 class BoundaryPointSet *TrianglePoints[3]; 4145 size_t NoOfWildcards = 0; 3388 4146 3389 4147 for (int i = 0; i < 3; i++) { 3390 PointMap::const_iterator FindPoint = PointsOnBoundary.find(Points[i]->nr);3391 if (FindPoint != PointsOnBoundary.end()) {3392 TrianglePoints[i] = FindPoint->second;4148 if (Points[i] == NULL) { 4149 NoOfWildcards++; 4150 TrianglePoints[i] = NULL; 3393 4151 } else { 3394 TrianglePoints[i] = NULL; 3395 } 3396 } 3397 3398 // checks lines between the points in the Points for their adjacent triangles 3399 for (int i = 0; i < 3; i++) { 3400 if (TrianglePoints[i] != NULL) { 3401 for (int j = i+1; j < 3; j++) { 3402 if (TrianglePoints[j] != NULL) { 3403 for (FindLine = TrianglePoints[i]->lines.find(TrianglePoints[j]->node->nr); // is a multimap! 3404 (FindLine != TrianglePoints[i]->lines.end()) && (FindLine->first == TrianglePoints[j]->node->nr); 3405 FindLine++) { 3406 for (FindTriangle = FindLine->second->triangles.begin(); 3407 FindTriangle != FindLine->second->triangles.end(); 3408 FindTriangle++) { 3409 if (FindTriangle->second->IsPresentTupel(TrianglePoints)) { 3410 result->push_back(FindTriangle->second); 4152 PointMap::const_iterator FindPoint = PointsOnBoundary.find(Points[i]->nr); 4153 if (FindPoint != PointsOnBoundary.end()) { 4154 TrianglePoints[i] = FindPoint->second; 4155 } else { 4156 TrianglePoints[i] = NULL; 4157 } 4158 } 4159 } 4160 4161 switch (NoOfWildcards) { 4162 case 0: // checks lines between the points in the Points for their adjacent triangles 4163 for (int i = 0; i < 3; i++) { 4164 if (TrianglePoints[i] != NULL) { 4165 for (int j = i+1; j < 3; j++) { 4166 if (TrianglePoints[j] != NULL) { 4167 for (FindLine = TrianglePoints[i]->lines.find(TrianglePoints[j]->node->nr); // is a multimap! 4168 (FindLine != TrianglePoints[i]->lines.end()) && (FindLine->first == TrianglePoints[j]->node->nr); 4169 FindLine++) { 4170 for (FindTriangle = FindLine->second->triangles.begin(); 4171 FindTriangle != FindLine->second->triangles.end(); 4172 FindTriangle++) { 4173 if (FindTriangle->second->IsPresentTupel(TrianglePoints)) { 4174 result->push_back(FindTriangle->second); 4175 } 4176 } 3411 4177 } 4178 // Is it sufficient to consider one of the triangle lines for this. 4179 return result; 3412 4180 } 3413 4181 } 3414 // Is it sufficient to consider one of the triangle lines for this.3415 return result;3416 4182 } 3417 4183 } 3418 } 4184 break; 4185 case 1: // copy all triangles of the respective line 4186 { 4187 int i=0; 4188 for (; i < 3; i++) 4189 if (TrianglePoints[i] == NULL) 4190 break; 4191 for (FindLine = TrianglePoints[(i+1)%3]->lines.find(TrianglePoints[(i+2)%3]->node->nr); // is a multimap! 4192 (FindLine != TrianglePoints[(i+1)%3]->lines.end()) && (FindLine->first == TrianglePoints[(i+2)%3]->node->nr); 4193 FindLine++) { 4194 for (FindTriangle = FindLine->second->triangles.begin(); 4195 FindTriangle != FindLine->second->triangles.end(); 4196 FindTriangle++) { 4197 if (FindTriangle->second->IsPresentTupel(TrianglePoints)) { 4198 result->push_back(FindTriangle->second); 4199 } 4200 } 4201 } 4202 break; 4203 } 4204 case 2: // copy all triangles of the respective point 4205 { 4206 int i=0; 4207 for (; i < 3; i++) 4208 if (TrianglePoints[i] != NULL) 4209 break; 4210 for (LineMap::const_iterator line = TrianglePoints[i]->lines.begin(); line != TrianglePoints[i]->lines.end(); line++) 4211 for (TriangleMap::const_iterator triangle = line->second->triangles.begin(); triangle != line->second->triangles.end(); triangle++) 4212 result->push_back(triangle->second); 4213 result->sort(); 4214 result->unique(); 4215 break; 4216 } 4217 case 3: // copy all triangles 4218 { 4219 for (TriangleMap::const_iterator triangle = TrianglesOnBoundary.begin(); triangle != TrianglesOnBoundary.end(); triangle++) 4220 result->push_back(triangle->second); 4221 break; 4222 } 4223 default: 4224 eLog() << Verbose(0) << "Number of wildcards is greater than 3, cannot happen!" << endl; 4225 performCriticalExit(); 4226 break; 3419 4227 } 3420 4228 3421 4229 return result; 3422 4230 } 4231 4232 struct BoundaryLineSetCompare { 4233 bool operator() (const BoundaryLineSet * const a, const BoundaryLineSet * const b) { 4234 int lowerNra = -1; 4235 int lowerNrb = -1; 4236 4237 if (a->endpoints[0] < a->endpoints[1]) 4238 lowerNra = 0; 4239 else 4240 lowerNra = 1; 4241 4242 if (b->endpoints[0] < b->endpoints[1]) 4243 lowerNrb = 0; 4244 else 4245 lowerNrb = 1; 4246 4247 if (a->endpoints[lowerNra] < b->endpoints[lowerNrb]) 4248 return true; 4249 else if (a->endpoints[lowerNra] > b->endpoints[lowerNrb]) 4250 return false; 4251 else { // both lower-numbered endpoints are the same ... 4252 if (a->endpoints[(lowerNra+1)%2] < b->endpoints[(lowerNrb+1)%2]) 4253 return true; 4254 else if (a->endpoints[(lowerNra+1)%2] > b->endpoints[(lowerNrb+1)%2]) 4255 return false; 4256 } 4257 return false; 4258 }; 4259 }; 4260 4261 #define UniqueLines set < class BoundaryLineSet *, BoundaryLineSetCompare> 3423 4262 3424 4263 /** … … 3428 4267 * in the list, once as key and once as value 3429 4268 */ 3430 map<int, int> * Tesselation::FindAllDegeneratedLines() 3431 { 3432 map<int, class BoundaryLineSet *> AllLines; 3433 map<int, int> * DegeneratedLines = new map<int, int>; 4269 IndexToIndex * Tesselation::FindAllDegeneratedLines() 4270 { 4271 Info FunctionInfo(__func__); 4272 UniqueLines AllLines; 4273 IndexToIndex * DegeneratedLines = new IndexToIndex; 3434 4274 3435 4275 // sanity check 3436 4276 if (LinesOnBoundary.empty()) { 3437 Log() << Verbose(1) << "Warning:FindAllDegeneratedTriangles() was called without any tesselation structure.";4277 eLog() << Verbose(2) << "FindAllDegeneratedTriangles() was called without any tesselation structure."; 3438 4278 return DegeneratedLines; 3439 4279 } 3440 4280 3441 4281 LineMap::iterator LineRunner1; 3442 pair< LineMap::iterator, bool> tester;4282 pair< UniqueLines::iterator, bool> tester; 3443 4283 for (LineRunner1 = LinesOnBoundary.begin(); LineRunner1 != LinesOnBoundary.end(); ++LineRunner1) { 3444 tester = AllLines.insert( pair<int,BoundaryLineSet *> (LineRunner1->second->endpoints[0]->Nr, LineRunner1->second));3445 if ( (!tester.second) && (tester.first->second->endpoints[1]->Nr == LineRunner1->second->endpoints[1]->Nr)) { // found degenerated line3446 DegeneratedLines->insert ( pair<int, int> (LineRunner1->second->Nr, tester.first->second->Nr) );3447 DegeneratedLines->insert ( pair<int, int> ( tester.first->second->Nr, LineRunner1->second->Nr) );4284 tester = AllLines.insert( LineRunner1->second ); 4285 if (!tester.second) { // found degenerated line 4286 DegeneratedLines->insert ( pair<int, int> (LineRunner1->second->Nr, (*tester.first)->Nr) ); 4287 DegeneratedLines->insert ( pair<int, int> ((*tester.first)->Nr, LineRunner1->second->Nr) ); 3448 4288 } 3449 4289 } … … 3451 4291 AllLines.clear(); 3452 4292 3453 Log() << Verbose(1) << "FindAllDegeneratedLines() found " << DegeneratedLines->size() << " lines." << endl; 3454 map<int,int>::iterator it; 3455 for (it = DegeneratedLines->begin(); it != DegeneratedLines->end(); it++) 3456 Log() << Verbose(2) << (*it).first << " => " << (*it).second << endl; 4293 Log() << Verbose(0) << "FindAllDegeneratedLines() found " << DegeneratedLines->size() << " lines." << endl; 4294 IndexToIndex::iterator it; 4295 for (it = DegeneratedLines->begin(); it != DegeneratedLines->end(); it++) { 4296 const LineMap::const_iterator Line1 = LinesOnBoundary.find((*it).first); 4297 const LineMap::const_iterator Line2 = LinesOnBoundary.find((*it).second); 4298 if (Line1 != LinesOnBoundary.end() && Line2 != LinesOnBoundary.end()) 4299 Log() << Verbose(0) << *Line1->second << " => " << *Line2->second << endl; 4300 else 4301 eLog() << Verbose(1) << "Either " << (*it).first << " or " << (*it).second << " are not in LinesOnBoundary!" << endl; 4302 } 3457 4303 3458 4304 return DegeneratedLines; … … 3465 4311 * in the list, once as key and once as value 3466 4312 */ 3467 map<int, int> * Tesselation::FindAllDegeneratedTriangles() 3468 { 3469 map<int, int> * DegeneratedLines = FindAllDegeneratedLines(); 3470 map<int, int> * DegeneratedTriangles = new map<int, int>; 4313 IndexToIndex * Tesselation::FindAllDegeneratedTriangles() 4314 { 4315 Info FunctionInfo(__func__); 4316 IndexToIndex * DegeneratedLines = FindAllDegeneratedLines(); 4317 IndexToIndex * DegeneratedTriangles = new IndexToIndex; 3471 4318 3472 4319 TriangleMap::iterator TriangleRunner1, TriangleRunner2; … … 3474 4321 class BoundaryLineSet *line1 = NULL, *line2 = NULL; 3475 4322 3476 for ( map<int, int>::iterator LineRunner = DegeneratedLines->begin(); LineRunner != DegeneratedLines->end(); ++LineRunner) {4323 for (IndexToIndex::iterator LineRunner = DegeneratedLines->begin(); LineRunner != DegeneratedLines->end(); ++LineRunner) { 3477 4324 // run over both lines' triangles 3478 4325 Liner = LinesOnBoundary.find(LineRunner->first); … … 3494 4341 delete(DegeneratedLines); 3495 4342 3496 Log() << Verbose( 1) << "FindAllDegeneratedTriangles() found " << DegeneratedTriangles->size() << " triangles:" << endl;3497 map<int,int>::iterator it;4343 Log() << Verbose(0) << "FindAllDegeneratedTriangles() found " << DegeneratedTriangles->size() << " triangles:" << endl; 4344 IndexToIndex::iterator it; 3498 4345 for (it = DegeneratedTriangles->begin(); it != DegeneratedTriangles->end(); it++) 3499 Log() << Verbose( 2) << (*it).first << " => " << (*it).second << endl;4346 Log() << Verbose(0) << (*it).first << " => " << (*it).second << endl; 3500 4347 3501 4348 return DegeneratedTriangles; … … 3508 4355 void Tesselation::RemoveDegeneratedTriangles() 3509 4356 { 3510 map<int, int> * DegeneratedTriangles = FindAllDegeneratedTriangles(); 4357 Info FunctionInfo(__func__); 4358 IndexToIndex * DegeneratedTriangles = FindAllDegeneratedTriangles(); 3511 4359 TriangleMap::iterator finder; 3512 4360 BoundaryTriangleSet *triangle = NULL, *partnerTriangle = NULL; 3513 4361 int count = 0; 3514 4362 3515 Log() << Verbose(1) << "Begin of RemoveDegeneratedTriangles" << endl; 3516 3517 for (map<int, int>::iterator TriangleKeyRunner = DegeneratedTriangles->begin(); 4363 for (IndexToIndex::iterator TriangleKeyRunner = DegeneratedTriangles->begin(); 3518 4364 TriangleKeyRunner != DegeneratedTriangles->end(); ++TriangleKeyRunner 3519 4365 ) { … … 3572 4418 // erase the pair 3573 4419 count += (int) DegeneratedTriangles->erase(triangle->Nr); 3574 Log() << Verbose( 1) << "RemoveDegeneratedTriangles() removes triangle " << *triangle << "." << endl;4420 Log() << Verbose(0) << "RemoveDegeneratedTriangles() removes triangle " << *triangle << "." << endl; 3575 4421 RemoveTesselationTriangle(triangle); 3576 4422 count += (int) DegeneratedTriangles->erase(partnerTriangle->Nr); 3577 Log() << Verbose( 1) << "RemoveDegeneratedTriangles() removes triangle " << *partnerTriangle << "." << endl;4423 Log() << Verbose(0) << "RemoveDegeneratedTriangles() removes triangle " << *partnerTriangle << "." << endl; 3578 4424 RemoveTesselationTriangle(partnerTriangle); 3579 4425 } else { 3580 Log() << Verbose( 1) << "RemoveDegeneratedTriangles() does not remove triangle " << *triangle4426 Log() << Verbose(0) << "RemoveDegeneratedTriangles() does not remove triangle " << *triangle 3581 4427 << " and its partner " << *partnerTriangle << " because it is essential for at" 3582 4428 << " least one of the endpoints to be kept in the tesselation structure." << endl; … … 3584 4430 } 3585 4431 delete(DegeneratedTriangles); 3586 3587 Log() << Verbose(1) << "RemoveDegeneratedTriangles() removed " << count << " triangles:" << endl; 3588 Log() << Verbose(1) << "End of RemoveDegeneratedTriangles" << endl; 4432 if (count > 0) 4433 LastTriangle = NULL; 4434 4435 Log() << Verbose(0) << "RemoveDegeneratedTriangles() removed " << count << " triangles:" << endl; 3589 4436 } 3590 4437 … … 3599 4446 void Tesselation::AddBoundaryPointByDegeneratedTriangle(class TesselPoint *point, LinkedCell *LC) 3600 4447 { 3601 Log() << Verbose(2) << "Begin of AddBoundaryPointByDegeneratedTriangle" << endl; 3602 4448 Info FunctionInfo(__func__); 3603 4449 // find nearest boundary point 3604 4450 class TesselPoint *BackupPoint = NULL; 3605 class TesselPoint *NearestPoint = FindClosest Point(point->node, BackupPoint, LC);4451 class TesselPoint *NearestPoint = FindClosestTesselPoint(point->node, BackupPoint, LC); 3606 4452 class BoundaryPointSet *NearestBoundaryPoint = NULL; 3607 4453 PointMap::iterator PointRunner; … … 3616 4462 return; 3617 4463 } 3618 Log() << Verbose( 2) << "Nearest point on boundary is " << NearestPoint->Name << "." << endl;4464 Log() << Verbose(0) << "Nearest point on boundary is " << NearestPoint->Name << "." << endl; 3619 4465 3620 4466 // go through its lines and find the best one to split … … 3649 4495 3650 4496 // create new triangle to connect point (connects automatically with the missing spot of the chosen line) 3651 Log() << Verbose( 5) << "Adding new triangle points."<< endl;4497 Log() << Verbose(2) << "Adding new triangle points."<< endl; 3652 4498 AddTesselationPoint((BestLine->endpoints[0]->node), 0); 3653 4499 AddTesselationPoint((BestLine->endpoints[1]->node), 1); 3654 4500 AddTesselationPoint(point, 2); 3655 Log() << Verbose( 5) << "Adding new triangle lines."<< endl;4501 Log() << Verbose(2) << "Adding new triangle lines."<< endl; 3656 4502 AddTesselationLine(TPS[0], TPS[1], 0); 3657 4503 AddTesselationLine(TPS[0], TPS[2], 1); … … 3660 4506 BTS->GetNormalVector(TempTriangle->NormalVector); 3661 4507 BTS->NormalVector.Scale(-1.); 3662 Log() << Verbose( 3) << "INFO: NormalVector of new triangle is " << BTS->NormalVector << "." << endl;4508 Log() << Verbose(1) << "INFO: NormalVector of new triangle is " << BTS->NormalVector << "." << endl; 3663 4509 AddTesselationTriangle(); 3664 4510 3665 4511 // create other side of this triangle and close both new sides of the first created triangle 3666 Log() << Verbose( 5) << "Adding new triangle points."<< endl;4512 Log() << Verbose(2) << "Adding new triangle points."<< endl; 3667 4513 AddTesselationPoint((BestLine->endpoints[0]->node), 0); 3668 4514 AddTesselationPoint((BestLine->endpoints[1]->node), 1); 3669 4515 AddTesselationPoint(point, 2); 3670 Log() << Verbose( 5) << "Adding new triangle lines."<< endl;4516 Log() << Verbose(2) << "Adding new triangle lines."<< endl; 3671 4517 AddTesselationLine(TPS[0], TPS[1], 0); 3672 4518 AddTesselationLine(TPS[0], TPS[2], 1); … … 3674 4520 BTS = new class BoundaryTriangleSet(BLS, TrianglesOnBoundaryCount); 3675 4521 BTS->GetNormalVector(TempTriangle->NormalVector); 3676 Log() << Verbose( 3) << "INFO: NormalVector of other new triangle is " << BTS->NormalVector << "." << endl;4522 Log() << Verbose(1) << "INFO: NormalVector of other new triangle is " << BTS->NormalVector << "." << endl; 3677 4523 AddTesselationTriangle(); 3678 4524 … … 3681 4527 if ((BTS->lines[i]->ContainsBoundaryPoint(BestLine->endpoints[0])) && (BTS->lines[i]->ContainsBoundaryPoint(BestLine->endpoints[1]))) { 3682 4528 if (BestLine == BTS->lines[i]){ 3683 Log() << Verbose(1) << "CRITICAL:BestLine is same as found line, something's wrong here!" << endl;3684 exit(255);4529 eLog() << Verbose(0) << "BestLine is same as found line, something's wrong here!" << endl; 4530 performCriticalExit(); 3685 4531 } 3686 4532 BTS->lines[i]->triangles.insert( pair<int, class BoundaryTriangleSet *> (TempTriangle->Nr, TempTriangle) ); … … 3689 4535 } 3690 4536 } 3691 3692 // exit3693 Log() << Verbose(2) << "End of AddBoundaryPointByDegeneratedTriangle" << endl;3694 4537 }; 3695 4538 … … 3701 4544 void Tesselation::Output(const char *filename, const PointCloud * const cloud) 3702 4545 { 4546 Info FunctionInfo(__func__); 3703 4547 ofstream *tempstream = NULL; 3704 4548 string NameofTempFile; … … 3713 4557 NameofTempFile.erase(npos, 1); 3714 4558 NameofTempFile.append(TecplotSuffix); 3715 Log() << Verbose( 1) << "Writing temporary non convex hull to file " << NameofTempFile << ".\n";4559 Log() << Verbose(0) << "Writing temporary non convex hull to file " << NameofTempFile << ".\n"; 3716 4560 tempstream = new ofstream(NameofTempFile.c_str(), ios::trunc); 3717 4561 WriteTecplotFile(tempstream, this, cloud, TriangleFilesWritten); … … 3727 4571 NameofTempFile.erase(npos, 1); 3728 4572 NameofTempFile.append(Raster3DSuffix); 3729 Log() << Verbose( 1) << "Writing temporary non convex hull to file " << NameofTempFile << ".\n";4573 Log() << Verbose(0) << "Writing temporary non convex hull to file " << NameofTempFile << ".\n"; 3730 4574 tempstream = new ofstream(NameofTempFile.c_str(), ios::trunc); 3731 4575 WriteRaster3dFile(tempstream, this, cloud); … … 3739 4583 TriangleFilesWritten++; 3740 4584 }; 4585 4586 struct BoundaryPolygonSetCompare { 4587 bool operator()(const BoundaryPolygonSet * s1, const BoundaryPolygonSet * s2) const { 4588 if (s1->endpoints.size() < s2->endpoints.size()) 4589 return true; 4590 else if (s1->endpoints.size() > s2->endpoints.size()) 4591 return false; 4592 else { // equality of number of endpoints 4593 PointSet::const_iterator Walker1 = s1->endpoints.begin(); 4594 PointSet::const_iterator Walker2 = s2->endpoints.begin(); 4595 while ((Walker1 != s1->endpoints.end()) || (Walker2 != s2->endpoints.end())) { 4596 if ((*Walker1)->Nr < (*Walker2)->Nr) 4597 return true; 4598 else if ((*Walker1)->Nr > (*Walker2)->Nr) 4599 return false; 4600 Walker1++; 4601 Walker2++; 4602 } 4603 return false; 4604 } 4605 } 4606 }; 4607 4608 #define UniquePolygonSet set < BoundaryPolygonSet *, BoundaryPolygonSetCompare> 4609 4610 /** Finds all degenerated polygons and calls ReTesselateDegeneratedPolygon()/ 4611 * \return number of polygons found 4612 */ 4613 int Tesselation::CorrectAllDegeneratedPolygons() 4614 { 4615 Info FunctionInfo(__func__); 4616 4617 /// 2. Go through all BoundaryPointSet's, check their triangles' NormalVector 4618 IndexToIndex *DegeneratedTriangles = FindAllDegeneratedTriangles(); 4619 set < BoundaryPointSet *> EndpointCandidateList; 4620 pair < set < BoundaryPointSet *>::iterator, bool > InsertionTester; 4621 pair < map < int, Vector *>::iterator, bool > TriangleInsertionTester; 4622 for (PointMap::const_iterator Runner = PointsOnBoundary.begin(); Runner != PointsOnBoundary.end(); Runner++) { 4623 Log() << Verbose(0) << "Current point is " << *Runner->second << "." << endl; 4624 map < int, Vector *> TriangleVectors; 4625 // gather all NormalVectors 4626 Log() << Verbose(1) << "Gathering triangles ..." << endl; 4627 for (LineMap::const_iterator LineRunner = (Runner->second)->lines.begin(); LineRunner != (Runner->second)->lines.end(); LineRunner++) 4628 for (TriangleMap::const_iterator TriangleRunner = (LineRunner->second)->triangles.begin(); TriangleRunner != (LineRunner->second)->triangles.end(); TriangleRunner++) { 4629 if (DegeneratedTriangles->find(TriangleRunner->second->Nr) == DegeneratedTriangles->end()) { 4630 TriangleInsertionTester = TriangleVectors.insert( pair< int, Vector *> ((TriangleRunner->second)->Nr, &((TriangleRunner->second)->NormalVector)) ); 4631 if (TriangleInsertionTester.second) 4632 Log() << Verbose(1) << " Adding triangle " << *(TriangleRunner->second) << " to triangles to check-list." << endl; 4633 } else { 4634 Log() << Verbose(1) << " NOT adding triangle " << *(TriangleRunner->second) << " as it's a simply degenerated one." << endl; 4635 } 4636 } 4637 // check whether there are two that are parallel 4638 Log() << Verbose(1) << "Finding two parallel triangles ..." << endl; 4639 for (map < int, Vector *>::iterator VectorWalker = TriangleVectors.begin(); VectorWalker != TriangleVectors.end(); VectorWalker++) 4640 for (map < int, Vector *>::iterator VectorRunner = VectorWalker; VectorRunner != TriangleVectors.end(); VectorRunner++) 4641 if (VectorWalker != VectorRunner) { // skip equals 4642 const double SCP = VectorWalker->second->ScalarProduct(VectorRunner->second); // ScalarProduct should result in -1. for degenerated triangles 4643 Log() << Verbose(1) << "Checking " << *VectorWalker->second<< " against " << *VectorRunner->second << ": " << SCP << endl; 4644 if (fabs(SCP + 1.) < ParallelEpsilon) { 4645 InsertionTester = EndpointCandidateList.insert((Runner->second)); 4646 if (InsertionTester.second) 4647 Log() << Verbose(0) << " Adding " << *Runner->second << " to endpoint candidate list." << endl; 4648 // and break out of both loops 4649 VectorWalker = TriangleVectors.end(); 4650 VectorRunner = TriangleVectors.end(); 4651 break; 4652 } 4653 } 4654 } 4655 4656 /// 3. Find connected endpoint candidates and put them into a polygon 4657 UniquePolygonSet ListofDegeneratedPolygons; 4658 BoundaryPointSet *Walker = NULL; 4659 BoundaryPointSet *OtherWalker = NULL; 4660 BoundaryPolygonSet *Current = NULL; 4661 stack <BoundaryPointSet*> ToCheckConnecteds; 4662 while (!EndpointCandidateList.empty()) { 4663 Walker = *(EndpointCandidateList.begin()); 4664 if (Current == NULL) { // create a new polygon with current candidate 4665 Log() << Verbose(0) << "Starting new polygon set at point " << *Walker << endl; 4666 Current = new BoundaryPolygonSet; 4667 Current->endpoints.insert(Walker); 4668 EndpointCandidateList.erase(Walker); 4669 ToCheckConnecteds.push(Walker); 4670 } 4671 4672 // go through to-check stack 4673 while (!ToCheckConnecteds.empty()) { 4674 Walker = ToCheckConnecteds.top(); // fetch ... 4675 ToCheckConnecteds.pop(); // ... and remove 4676 for (LineMap::const_iterator LineWalker = Walker->lines.begin(); LineWalker != Walker->lines.end(); LineWalker++) { 4677 OtherWalker = (LineWalker->second)->GetOtherEndpoint(Walker); 4678 Log() << Verbose(1) << "Checking " << *OtherWalker << endl; 4679 set < BoundaryPointSet *>::iterator Finder = EndpointCandidateList.find(OtherWalker); 4680 if (Finder != EndpointCandidateList.end()) { // found a connected partner 4681 Log() << Verbose(1) << " Adding to polygon." << endl; 4682 Current->endpoints.insert(OtherWalker); 4683 EndpointCandidateList.erase(Finder); // remove from candidates 4684 ToCheckConnecteds.push(OtherWalker); // but check its partners too 4685 } else { 4686 Log() << Verbose(1) << " is not connected to " << *Walker << endl; 4687 } 4688 } 4689 } 4690 4691 Log() << Verbose(0) << "Final polygon is " << *Current << endl; 4692 ListofDegeneratedPolygons.insert(Current); 4693 Current = NULL; 4694 } 4695 4696 const int counter = ListofDegeneratedPolygons.size(); 4697 4698 Log() << Verbose(0) << "The following " << counter << " degenerated polygons have been found: " << endl; 4699 for (UniquePolygonSet::iterator PolygonRunner = ListofDegeneratedPolygons.begin(); PolygonRunner != ListofDegeneratedPolygons.end(); PolygonRunner++) 4700 Log() << Verbose(0) << " " << **PolygonRunner << endl; 4701 4702 /// 4. Go through all these degenerated polygons 4703 for (UniquePolygonSet::iterator PolygonRunner = ListofDegeneratedPolygons.begin(); PolygonRunner != ListofDegeneratedPolygons.end(); PolygonRunner++) { 4704 stack <int> TriangleNrs; 4705 Vector NormalVector; 4706 /// 4a. Gather all triangles of this polygon 4707 TriangleSet *T = (*PolygonRunner)->GetAllContainedTrianglesFromEndpoints(); 4708 4709 // check whether number is bigger than 2, otherwise it's just a simply degenerated one and nothing to do. 4710 if (T->size() == 2) { 4711 Log() << Verbose(1) << " Skipping degenerated polygon, is just a (already simply degenerated) triangle." << endl; 4712 delete(T); 4713 continue; 4714 } 4715 4716 // check whether number is even 4717 // If this case occurs, we have to think about it! 4718 // The Problem is probably due to two degenerated polygons being connected by a bridging, non-degenerated polygon, as somehow one node has 4719 // connections to either polygon ... 4720 if (T->size() % 2 != 0) { 4721 eLog() << Verbose(0) << " degenerated polygon contains an odd number of triangles, probably contains bridging non-degenerated ones, too!" << endl; 4722 performCriticalExit(); 4723 } 4724 4725 TriangleSet::iterator TriangleWalker = T->begin(); // is the inner iterator 4726 /// 4a. Get NormalVector for one side (this is "front") 4727 NormalVector.CopyVector(&(*TriangleWalker)->NormalVector); 4728 Log() << Verbose(1) << "\"front\" defining triangle is " << **TriangleWalker << " and Normal vector of \"front\" side is " << NormalVector << endl; 4729 TriangleWalker++; 4730 TriangleSet::iterator TriangleSprinter = TriangleWalker; // is the inner advanced iterator 4731 /// 4b. Remove all triangles whose NormalVector is in opposite direction (i.e. "back") 4732 BoundaryTriangleSet *triangle = NULL; 4733 while (TriangleSprinter != T->end()) { 4734 TriangleWalker = TriangleSprinter; 4735 triangle = *TriangleWalker; 4736 TriangleSprinter++; 4737 Log() << Verbose(1) << "Current triangle to test for removal: " << *triangle << endl; 4738 if (triangle->NormalVector.ScalarProduct(&NormalVector) < 0) { // if from other side, then delete and remove from list 4739 Log() << Verbose(1) << " Removing ... " << endl; 4740 TriangleNrs.push(triangle->Nr); 4741 T->erase(TriangleWalker); 4742 RemoveTesselationTriangle(triangle); 4743 } else 4744 Log() << Verbose(1) << " Keeping ... " << endl; 4745 } 4746 /// 4c. Copy all "front" triangles but with inverse NormalVector 4747 TriangleWalker = T->begin(); 4748 while (TriangleWalker != T->end()) { // go through all front triangles 4749 Log() << Verbose(1) << " Re-creating triangle " << **TriangleWalker << " with NormalVector " << (*TriangleWalker)->NormalVector << endl; 4750 for (int i = 0; i < 3; i++) 4751 AddTesselationPoint((*TriangleWalker)->endpoints[i]->node, i); 4752 AddTesselationLine(TPS[0], TPS[1], 0); 4753 AddTesselationLine(TPS[0], TPS[2], 1); 4754 AddTesselationLine(TPS[1], TPS[2], 2); 4755 if (TriangleNrs.empty()) 4756 eLog() << Verbose(0) << "No more free triangle numbers!" << endl; 4757 BTS = new BoundaryTriangleSet(BLS, TriangleNrs.top()); // copy triangle ... 4758 AddTesselationTriangle(); // ... and add 4759 TriangleNrs.pop(); 4760 BTS->NormalVector.CopyVector(&(*TriangleWalker)->NormalVector); 4761 BTS->NormalVector.Scale(-1.); 4762 TriangleWalker++; 4763 } 4764 if (!TriangleNrs.empty()) { 4765 eLog() << Verbose(0) << "There have been less triangles created than removed!" << endl; 4766 } 4767 delete(T); // remove the triangleset 4768 } 4769 4770 IndexToIndex * SimplyDegeneratedTriangles = FindAllDegeneratedTriangles(); 4771 Log() << Verbose(0) << "Final list of simply degenerated triangles found, containing " << SimplyDegeneratedTriangles->size() << " triangles:" << endl; 4772 IndexToIndex::iterator it; 4773 for (it = SimplyDegeneratedTriangles->begin(); it != SimplyDegeneratedTriangles->end(); it++) 4774 Log() << Verbose(0) << (*it).first << " => " << (*it).second << endl; 4775 delete(SimplyDegeneratedTriangles); 4776 4777 /// 5. exit 4778 UniquePolygonSet::iterator PolygonRunner; 4779 while (!ListofDegeneratedPolygons.empty()) { 4780 PolygonRunner = ListofDegeneratedPolygons.begin(); 4781 delete(*PolygonRunner); 4782 ListofDegeneratedPolygons.erase(PolygonRunner); 4783 } 4784 4785 return counter; 4786 }; -
TabularUnified src/tesselation.hpp ¶
r9fe36b rb8d1aeb 23 23 #include <list> 24 24 #include <set> 25 #include <stack> 25 26 26 27 #include "atom_particleinfo.hpp" … … 47 48 #define VRMLSUffix ".wrl" 48 49 50 #define ParallelEpsilon 1e-3 51 49 52 // ======================================================= some template functions ========================================= 50 53 54 #define IndexToIndex map <int, int> 55 51 56 #define PointMap map < int, class BoundaryPointSet * > 57 #define PointSet set < class BoundaryPointSet * > 58 #define PointList list < class BoundaryPointSet * > 52 59 #define PointPair pair < int, class BoundaryPointSet * > 53 60 #define PointTestPair pair < PointMap::iterator, bool > 61 54 62 #define CandidateList list <class CandidateForTesselation *> 63 #define CandidateMap map <class BoundaryLineSet *, class CandidateForTesselation *> 55 64 56 65 #define LineMap multimap < int, class BoundaryLineSet * > 66 #define LineSet set < class BoundaryLineSet * > 67 #define LineList list < class BoundaryLineSet * > 57 68 #define LinePair pair < int, class BoundaryLineSet * > 58 69 #define LineTestPair pair < LineMap::iterator, bool > 59 70 60 71 #define TriangleMap map < int, class BoundaryTriangleSet * > 72 #define TriangleSet set < class BoundaryTriangleSet * > 73 #define TriangleList list < class BoundaryTriangleSet * > 61 74 #define TrianglePair pair < int, class BoundaryTriangleSet * > 62 75 #define TriangleTestPair pair < TrianglePair::iterator, bool > 63 76 77 #define PolygonMap map < int, class BoundaryPolygonSet * > 78 #define PolygonSet set < class BoundaryPolygonSet * > 79 #define PolygonList list < class BoundaryPolygonSet * > 80 81 #define DistanceToPointMap multimap <double, class BoundaryPointSet * > 82 #define DistanceToPointPair pair <double, class BoundaryPointSet * > 83 64 84 #define DistanceMultiMap multimap <double, pair < PointMap::iterator, PointMap::iterator> > 65 85 #define DistanceMultiMapPair pair <double, pair < PointMap::iterator, PointMap::iterator> > 86 87 #define TesselPointList list <TesselPoint *> 88 #define TesselPointSet set <TesselPoint *> 89 90 #define ListOfTesselPointList list<list <TesselPoint *> *> 66 91 67 92 /********************************************** declarations *******************************/ … … 83 108 public: 84 109 BoundaryPointSet(); 85 BoundaryPointSet(TesselPoint * Walker);110 BoundaryPointSet(TesselPoint * const Walker); 86 111 ~BoundaryPointSet(); 87 112 88 void AddLine( class BoundaryLineSet *line);113 void AddLine(BoundaryLineSet * const line); 89 114 90 115 LineMap lines; … … 102 127 public: 103 128 BoundaryLineSet(); 104 BoundaryLineSet(class BoundaryPointSet *Point[2], const int number); 129 BoundaryLineSet(BoundaryPointSet * const Point[2], const int number); 130 BoundaryLineSet(BoundaryPointSet * const Point1, BoundaryPointSet * const Point2, const int number); 105 131 ~BoundaryLineSet(); 106 132 107 void AddTriangle( class BoundaryTriangleSet *triangle);108 bool IsConnectedTo(c lass BoundaryLineSet *line);109 bool ContainsBoundaryPoint(c lass BoundaryPointSet *point);110 bool CheckConvexityCriterion() ;111 class BoundaryPointSet *GetOtherEndpoint(c lass BoundaryPointSet *);133 void AddTriangle(BoundaryTriangleSet * const triangle); 134 bool IsConnectedTo(const BoundaryLineSet * const line) const; 135 bool ContainsBoundaryPoint(const BoundaryPointSet * const point) const; 136 bool CheckConvexityCriterion() const; 137 class BoundaryPointSet *GetOtherEndpoint(const BoundaryPointSet * const point) const; 112 138 113 139 class BoundaryPointSet *endpoints[2]; 114 140 TriangleMap triangles; 115 141 int Nr; 142 bool skipped; 116 143 }; 117 144 … … 123 150 public: 124 151 BoundaryTriangleSet(); 125 BoundaryTriangleSet(class BoundaryLineSet * line[3],int number);152 BoundaryTriangleSet(class BoundaryLineSet * const line[3], const int number); 126 153 ~BoundaryTriangleSet(); 127 154 128 void GetNormalVector(Vector &NormalVector); 129 void GetCenter(Vector *center); 130 bool GetIntersectionInsideTriangle(Vector *MolCenter, Vector *x, Vector *Intersection); 131 bool ContainsBoundaryLine(class BoundaryLineSet *line); 132 bool ContainsBoundaryPoint(class BoundaryPointSet *point); 133 bool ContainsBoundaryPoint(class TesselPoint *point); 134 class BoundaryPointSet *GetThirdEndpoint(class BoundaryLineSet *line); 135 bool IsPresentTupel(class BoundaryPointSet *Points[3]); 136 bool IsPresentTupel(class BoundaryTriangleSet *T); 155 void GetNormalVector(const Vector &NormalVector); 156 void GetCenter(Vector * const center) const; 157 bool GetIntersectionInsideTriangle(const Vector * const MolCenter, const Vector * const x, Vector * const Intersection) const; 158 double GetClosestPointInsideTriangle(const Vector * const x, Vector * const ClosestPoint) const; 159 bool ContainsBoundaryLine(const BoundaryLineSet * const line) const; 160 bool ContainsBoundaryPoint(const BoundaryPointSet * const point) const; 161 bool ContainsBoundaryPoint(const TesselPoint * const point) const; 162 class BoundaryPointSet *GetThirdEndpoint(const BoundaryLineSet * const line) const; 163 bool IsPresentTupel(const BoundaryPointSet * const Points[3]) const; 164 bool IsPresentTupel(const BoundaryTriangleSet * const T) const; 137 165 138 166 class BoundaryPointSet *endpoints[3]; 139 167 class BoundaryLineSet *lines[3]; 140 168 Vector NormalVector; 169 Vector SphereCenter; 141 170 int Nr; 142 171 }; 143 172 144 173 ostream & operator << (ostream &ost, const BoundaryTriangleSet &a); 174 175 176 // ======================================================== class BoundaryTriangleSet ======================================= 177 178 /** Set of BoundaryPointSet. 179 * This is just meant as a container for a group of endpoints, extending the node, line, triangle concept. However, this has 180 * only marginally something to do with the tesselation. Hence, there is no incorporation into the bookkeeping of the Tesselation 181 * class (i.e. no allocation, no deletion). 182 * \note we assume that the set of endpoints reside (more or less) on a plane. 183 */ 184 class BoundaryPolygonSet { 185 public: 186 BoundaryPolygonSet(); 187 ~BoundaryPolygonSet(); 188 189 Vector * GetNormalVector(const Vector &NormalVector) const; 190 void GetCenter(Vector *center) const; 191 bool ContainsBoundaryLine(const BoundaryLineSet * const line) const; 192 bool ContainsBoundaryPoint(const BoundaryPointSet * const point) const; 193 bool ContainsBoundaryPoint(const TesselPoint * const point) const; 194 bool ContainsBoundaryTriangle(const BoundaryTriangleSet * const point) const; 195 bool ContainsPresentTupel(const BoundaryPointSet * const * Points, const int dim) const; 196 bool ContainsPresentTupel(const BoundaryPolygonSet * const P) const; 197 bool ContainsPresentTupel(const PointSet &endpoints) const; 198 TriangleSet * GetAllContainedTrianglesFromEndpoints() const; 199 bool FillPolygonFromTrianglesOfLine(const BoundaryLineSet * const line); 200 201 PointSet endpoints; 202 int Nr; 203 }; 204 205 ostream & operator << (ostream &ost, const BoundaryPolygonSet &a); 145 206 146 207 // =========================================================== class TESSELPOINT =========================================== … … 170 231 virtual ~PointCloud(); 171 232 233 virtual const char * const GetName() const { return "unknown"; }; 172 234 virtual Vector *GetCenter() const { return NULL; }; 173 235 virtual TesselPoint *GetPoint() const { return NULL; }; 174 236 virtual TesselPoint *GetTerminalPoint() const { return NULL; }; 237 virtual int GetMaxId() const { return 0; }; 175 238 virtual void GoToNext() const {}; 176 239 virtual void GoToPrevious() const {}; 177 240 virtual void GoToFirst() const {}; 178 241 virtual void GoToLast() const {}; 179 virtual bool IsEmpty() const { return false; };180 virtual bool IsEnd() const { return false; };242 virtual bool IsEmpty() const { return true; }; 243 virtual bool IsEnd() const { return true; }; 181 244 }; 182 245 … … 185 248 class CandidateForTesselation { 186 249 public : 250 CandidateForTesselation(BoundaryLineSet* currentBaseLine); 187 251 CandidateForTesselation(TesselPoint* candidate, BoundaryLineSet* currentBaseLine, Vector OptCandidateCenter, Vector OtherOptCandidateCenter); 188 252 ~CandidateForTesselation(); 189 253 190 TesselPoint *point;254 TesselPointList pointlist; 191 255 BoundaryLineSet *BaseLine; 192 256 Vector OptCenter; 193 257 Vector OtherOptCenter; 194 }; 258 double ShortestAngle; 259 double OtherShortestAngle; 260 }; 261 262 ostream & operator <<(ostream &ost, const CandidateForTesselation &a); 195 263 196 264 // =========================================================== class TESSELATION =========================================== … … 210 278 void AddTesselationTriangle(); 211 279 void AddTesselationTriangle(const int nr); 280 void AddCandidateTriangle(CandidateForTesselation CandidateLine); 212 281 void RemoveTesselationTriangle(class BoundaryTriangleSet *triangle); 213 282 void RemoveTesselationLine(class BoundaryLineSet *line); … … 218 287 void FindStartingTriangle(const double RADIUS, const LinkedCell *LC); 219 288 void FindSecondPointForTesselation(class TesselPoint* a, Vector Oben, class TesselPoint*& OptCandidate, double Storage[3], double RADIUS, const LinkedCell *LC); 220 void FindThirdPointForTesselation(Vector &NormalVector, Vector &SearchDirection, Vector &OldSphereCenter, class BoundaryLineSet *BaseLine, const class TesselPoint * const ThirdNode, CandidateList* &candidates, double *ShortestAngle, const double RADIUS, const LinkedCell *LC) const;221 bool FindNextSuitableTriangle( BoundaryLineSet &Line, BoundaryTriangleSet &T, const double& RADIUS, const LinkedCell *LC);289 void FindThirdPointForTesselation(Vector &NormalVector, Vector &SearchDirection, Vector &OldSphereCenter, CandidateForTesselation &CandidateLine, const class TesselPoint * const ThirdNode, const double RADIUS, const LinkedCell *LC) const; 290 bool FindNextSuitableTriangle(CandidateForTesselation &CandidateLine, BoundaryTriangleSet &T, const double& RADIUS, const LinkedCell *LC); 222 291 int CheckPresenceOfTriangle(class TesselPoint *Candidates[3]) const; 223 292 class BoundaryTriangleSet * GetPresentTriangle(TesselPoint *Candidates[3]); … … 231 300 double PickFarthestofTwoBaselines(class BoundaryLineSet *Base); 232 301 class BoundaryPointSet *IsConvexRectangle(class BoundaryLineSet *Base); 233 map<int, int>* FindAllDegeneratedTriangles();234 map<int, int>* FindAllDegeneratedLines();302 IndexToIndex * FindAllDegeneratedTriangles(); 303 IndexToIndex * FindAllDegeneratedLines(); 235 304 void RemoveDegeneratedTriangles(); 236 305 void AddBoundaryPointByDegeneratedTriangle(class TesselPoint *point, LinkedCell *LC); 237 238 set<TesselPoint*> * GetAllConnectedPoints(const TesselPoint* const Point) const; 239 set<BoundaryTriangleSet*> *GetAllTriangles(const BoundaryPointSet * const Point) const; 240 list<list<TesselPoint*> *> * GetPathsOfConnectedPoints(const TesselPoint* const Point) const; 241 list<list<TesselPoint*> *> * GetClosedPathsOfConnectedPoints(const TesselPoint* const Point) const; 242 list<TesselPoint*> * GetCircleOfConnectedPoints(const TesselPoint* const Point, const Vector * const Reference = NULL) const; 243 class BoundaryPointSet *GetCommonEndpoint(const BoundaryLineSet * line1, const BoundaryLineSet * line2) const; 244 list<BoundaryTriangleSet*> *FindTriangles(const TesselPoint* const Points[3]) const; 245 list<BoundaryTriangleSet*> * FindClosestTrianglesToPoint(const Vector *x, const LinkedCell* LC) const; 246 class BoundaryTriangleSet * FindClosestTriangleToPoint(const Vector *x, const LinkedCell* LC) const; 306 int CorrectAllDegeneratedPolygons(); 307 308 TesselPointSet * GetAllConnectedPoints(const TesselPoint* const Point) const; 309 TriangleSet * GetAllTriangles(const BoundaryPointSet * const Point) const; 310 ListOfTesselPointList * GetPathsOfConnectedPoints(const TesselPoint* const Point) const; 311 ListOfTesselPointList * GetClosedPathsOfConnectedPoints(const TesselPoint* const Point) const; 312 TesselPointList * GetCircleOfSetOfPoints(TesselPointSet *SetOfNeighbours, const TesselPoint* const Point, const Vector * const Reference = NULL) const; 313 TesselPointList * GetCircleOfConnectedTriangles(TesselPointSet *SetOfNeighbours, const TesselPoint* const Point, const Vector * const Reference) const; 314 class BoundaryPointSet * GetCommonEndpoint(const BoundaryLineSet * line1, const BoundaryLineSet * line2) const; 315 TriangleList * FindTriangles(const TesselPoint* const Points[3]) const; 316 TriangleList * FindClosestTrianglesToVector(const Vector *x, const LinkedCell* LC) const; 317 BoundaryTriangleSet * FindClosestTriangleToVector(const Vector *x, const LinkedCell* LC) const; 247 318 bool IsInnerPoint(const Vector &Point, const LinkedCell* const LC) const; 248 bool IsInnerPoint(const TesselPoint * const Point, const LinkedCell* const LC) const; 319 double GetDistanceSquaredToTriangle(const Vector &Point, const BoundaryTriangleSet* const triangle) const; 320 double GetDistanceSquaredToSurface(const Vector &Point, const LinkedCell* const LC) const; 249 321 bool AddBoundaryPoint(TesselPoint * Walker, const int n); 322 DistanceToPointMap * FindClosestBoundaryPointsToVector(const Vector *x, const LinkedCell* LC) const; 323 BoundaryLineSet * FindClosestBoundaryLineToVector(const Vector *x, const LinkedCell* LC) const; 250 324 251 325 // print for debugging … … 259 333 PointMap PointsOnBoundary; 260 334 LineMap LinesOnBoundary; 335 CandidateMap OpenLines; 261 336 TriangleMap TrianglesOnBoundary; 262 337 int PointsOnBoundaryCount; … … 286 361 mutable PointMap::const_iterator InternalPointer; 287 362 288 bool HasOtherBaselineBetterCandidate(const BoundaryLineSet * const BaseRay, const TesselPoint * const OptCandidate, double ShortestAngle, double RADIUS, const LinkedCell * const LC) const;363 //bool HasOtherBaselineBetterCandidate(const BoundaryLineSet * const BaseRay, const TesselPoint * const OptCandidate, double ShortestAngle, double RADIUS, const LinkedCell * const LC) const; 289 364 }; 290 365 -
TabularUnified src/tesselationhelpers.cpp ¶
r9fe36b rb8d1aeb 8 8 #include <fstream> 9 9 10 #include "info.hpp" 10 11 #include "linkedcell.hpp" 11 12 #include "log.hpp" … … 15 16 #include "verbose.hpp" 16 17 17 double DetGet(gsl_matrix * const A, const int inPlace) { 18 double DetGet(gsl_matrix * const A, const int inPlace) 19 { 20 Info FunctionInfo(__func__); 18 21 /* 19 22 inPlace = 1 => A is replaced with the LU decomposed copy. … … 45 48 void GetSphere(Vector * const center, const Vector &a, const Vector &b, const Vector &c, const double RADIUS) 46 49 { 50 Info FunctionInfo(__func__); 47 51 gsl_matrix *A = gsl_matrix_calloc(3,3); 48 52 double m11, m12, m13, m14; … … 111 115 const double HalfplaneIndicator, const double AlternativeIndicator, const double alpha, const double beta, const double gamma, const double RADIUS, const double Umkreisradius) 112 116 { 117 Info FunctionInfo(__func__); 113 118 Vector TempNormal, helper; 114 119 double Restradius; 115 120 Vector OtherCenter; 116 Log() << Verbose(3) << "Begin of GetCenterOfSphere.\n";117 121 Center->Zero(); 118 122 helper.CopyVector(&a); … … 128 132 Center->Scale(1./(sin(2.*alpha) + sin(2.*beta) + sin(2.*gamma))); 129 133 NewUmkreismittelpunkt->CopyVector(Center); 130 Log() << Verbose( 4) << "Center of new circumference is " << *NewUmkreismittelpunkt << ".\n";134 Log() << Verbose(1) << "Center of new circumference is " << *NewUmkreismittelpunkt << ".\n"; 131 135 // Here we calculated center of circumscribing circle, using barycentric coordinates 132 Log() << Verbose( 4) << "Center of circumference is " << *Center << " in direction " << *Direction << ".\n";136 Log() << Verbose(1) << "Center of circumference is " << *Center << " in direction " << *Direction << ".\n"; 133 137 134 138 TempNormal.CopyVector(&a); … … 139 143 if (fabs(HalfplaneIndicator) < MYEPSILON) 140 144 { 141 if ((TempNormal.ScalarProduct(AlternativeDirection) <0 and AlternativeIndicator >0) or (TempNormal.ScalarProduct(AlternativeDirection) >0 andAlternativeIndicator <0))145 if ((TempNormal.ScalarProduct(AlternativeDirection) <0 && AlternativeIndicator >0) || (TempNormal.ScalarProduct(AlternativeDirection) >0 && AlternativeIndicator <0)) 142 146 { 143 147 TempNormal.Scale(-1); … … 146 150 else 147 151 { 148 if ( TempNormal.ScalarProduct(Direction)<0 && HalfplaneIndicator >0 || TempNormal.ScalarProduct(Direction)>0 && HalfplaneIndicator<0)152 if (((TempNormal.ScalarProduct(Direction)<0) && (HalfplaneIndicator >0)) || ((TempNormal.ScalarProduct(Direction)>0) && (HalfplaneIndicator<0))) 149 153 { 150 154 TempNormal.Scale(-1); … … 154 158 TempNormal.Normalize(); 155 159 Restradius = sqrt(RADIUS*RADIUS - Umkreisradius*Umkreisradius); 156 Log() << Verbose( 4) << "Height of center of circumference to center of sphere is " << Restradius << ".\n";160 Log() << Verbose(1) << "Height of center of circumference to center of sphere is " << Restradius << ".\n"; 157 161 TempNormal.Scale(Restradius); 158 Log() << Verbose( 4) << "Shift vector to sphere of circumference is " << TempNormal << ".\n";162 Log() << Verbose(1) << "Shift vector to sphere of circumference is " << TempNormal << ".\n"; 159 163 160 164 Center->AddVector(&TempNormal); 161 Log() << Verbose( 0) << "Center of sphere of circumference is " << *Center << ".\n";165 Log() << Verbose(1) << "Center of sphere of circumference is " << *Center << ".\n"; 162 166 GetSphere(&OtherCenter, a, b, c, RADIUS); 163 Log() << Verbose(0) << "OtherCenter of sphere of circumference is " << OtherCenter << ".\n"; 164 Log() << Verbose(3) << "End of GetCenterOfSphere.\n"; 167 Log() << Verbose(1) << "OtherCenter of sphere of circumference is " << OtherCenter << ".\n"; 165 168 }; 166 169 … … 174 177 void GetCenterofCircumcircle(Vector * const Center, const Vector &a, const Vector &b, const Vector &c) 175 178 { 179 Info FunctionInfo(__func__); 176 180 Vector helper; 177 181 double alpha, beta, gamma; … … 186 190 beta = M_PI - SideC.Angle(&SideA); 187 191 gamma = M_PI - SideA.Angle(&SideB); 188 //Log() << Verbose( 3) << "INFO: alpha = " << alpha/M_PI*180. << ", beta = " << beta/M_PI*180. << ", gamma = " << gamma/M_PI*180. << "." << endl;192 //Log() << Verbose(1) << "INFO: alpha = " << alpha/M_PI*180. << ", beta = " << beta/M_PI*180. << ", gamma = " << gamma/M_PI*180. << "." << endl; 189 193 if (fabs(M_PI - alpha - beta - gamma) > HULLEPSILON) { 190 194 eLog() << Verbose(1) << "GetCenterofCircumcircle: Sum of angles " << (alpha+beta+gamma)/M_PI*180. << " > 180 degrees by " << fabs(M_PI - alpha - beta - gamma)/M_PI*180. << "!" << endl; … … 219 223 double GetPathLengthonCircumCircle(const Vector &CircleCenter, const Vector &CirclePlaneNormal, const double CircleRadius, const Vector &NewSphereCenter, const Vector &OldSphereCenter, const Vector &NormalVector, const Vector &SearchDirection) 220 224 { 225 Info FunctionInfo(__func__); 221 226 Vector helper; 222 227 double radius, alpha; 223 224 helper.CopyVector(&NewSphereCenter); 228 Vector RelativeOldSphereCenter; 229 Vector RelativeNewSphereCenter; 230 231 RelativeOldSphereCenter.CopyVector(&OldSphereCenter); 232 RelativeOldSphereCenter.SubtractVector(&CircleCenter); 233 RelativeNewSphereCenter.CopyVector(&NewSphereCenter); 234 RelativeNewSphereCenter.SubtractVector(&CircleCenter); 235 helper.CopyVector(&RelativeNewSphereCenter); 225 236 // test whether new center is on the parameter circle's plane 226 237 if (fabs(helper.ScalarProduct(&CirclePlaneNormal)) > HULLEPSILON) { … … 228 239 helper.ProjectOntoPlane(&CirclePlaneNormal); 229 240 } 230 radius = helper. ScalarProduct(&helper);241 radius = helper.NormSquared(); 231 242 // test whether the new center vector has length of CircleRadius 232 243 if (fabs(radius - CircleRadius) > HULLEPSILON) 233 244 eLog() << Verbose(1) << "The projected center of the new sphere has radius " << radius << " instead of " << CircleRadius << "." << endl; 234 alpha = helper.Angle(& OldSphereCenter);245 alpha = helper.Angle(&RelativeOldSphereCenter); 235 246 // make the angle unique by checking the halfplanes/search direction 236 247 if (helper.ScalarProduct(&SearchDirection) < -HULLEPSILON) // acos is not unique on [0, 2.*M_PI), hence extra check to decide between two half intervals 237 248 alpha = 2.*M_PI - alpha; 238 //Log() << Verbose(2) << "INFO: RelativeNewSphereCenter is " << helper << ", RelativeOldSphereCenter is " <<OldSphereCenter << " and resulting angle is " << alpha << "." << endl;239 radius = helper.Distance(& OldSphereCenter);249 Log() << Verbose(1) << "INFO: RelativeNewSphereCenter is " << helper << ", RelativeOldSphereCenter is " << RelativeOldSphereCenter << " and resulting angle is " << alpha << "." << endl; 250 radius = helper.Distance(&RelativeOldSphereCenter); 240 251 helper.ProjectOntoPlane(&NormalVector); 241 252 // check whether new center is somewhat away or at least right over the current baseline to prevent intersecting triangles 242 253 if ((radius > HULLEPSILON) || (helper.Norm() < HULLEPSILON)) { 243 //Log() << Verbose(2) << "INFO: Distance between old and new center is " << radius << " and between new center and baseline center is " << helper.Norm() << "." << endl;254 Log() << Verbose(1) << "INFO: Distance between old and new center is " << radius << " and between new center and baseline center is " << helper.Norm() << "." << endl; 244 255 return alpha; 245 256 } else { 246 //Log() << Verbose(1) << "INFO: NewSphereCenter " << helper << " is too close to OldSphereCenter" <<OldSphereCenter << "." << endl;257 Log() << Verbose(1) << "INFO: NewSphereCenter " << RelativeNewSphereCenter << " is too close to RelativeOldSphereCenter" << RelativeOldSphereCenter << "." << endl; 247 258 return 2.*M_PI; 248 259 } … … 264 275 double MinIntersectDistance(const gsl_vector * x, void *params) 265 276 { 277 Info FunctionInfo(__func__); 266 278 double retval = 0; 267 279 struct Intersection *I = (struct Intersection *)params; … … 284 296 285 297 retval = HeightA.ScalarProduct(&HeightA) + HeightB.ScalarProduct(&HeightB); 286 //Log() << Verbose( 2) << "MinIntersectDistance called, result: " << retval << endl;298 //Log() << Verbose(1) << "MinIntersectDistance called, result: " << retval << endl; 287 299 288 300 return retval; … … 304 316 bool existsIntersection(const Vector &point1, const Vector &point2, const Vector &point3, const Vector &point4) 305 317 { 318 Info FunctionInfo(__func__); 306 319 bool result; 307 320 … … 351 364 352 365 if (status == GSL_SUCCESS) { 353 Log() << Verbose( 2) << "converged to minimum" << endl;366 Log() << Verbose(1) << "converged to minimum" << endl; 354 367 } 355 368 } while (status == GSL_CONTINUE && iter < 100); … … 376 389 t2 = HeightB.ScalarProduct(&SideB)/SideB.ScalarProduct(&SideB); 377 390 378 Log() << Verbose( 2) << "Intersection " << intersection << " is at "391 Log() << Verbose(1) << "Intersection " << intersection << " is at " 379 392 << t1 << " for (" << point1 << "," << point2 << ") and at " 380 393 << t2 << " for (" << point3 << "," << point4 << "): "; 381 394 382 395 if (((t1 >= 0) && (t1 <= 1)) && ((t2 >= 0) && (t2 <= 1))) { 383 Log() << Verbose( 0) << "true intersection." << endl;396 Log() << Verbose(1) << "true intersection." << endl; 384 397 result = true; 385 398 } else { 386 Log() << Verbose( 0) << "intersection out of region of interest." << endl;399 Log() << Verbose(1) << "intersection out of region of interest." << endl; 387 400 result = false; 388 401 } … … 407 420 double GetAngle(const Vector &point, const Vector &reference, const Vector &OrthogonalVector) 408 421 { 422 Info FunctionInfo(__func__); 409 423 if (reference.IsZero()) 410 424 return M_PI; … … 418 432 } 419 433 420 Log() << Verbose( 4) << "INFO: " << point << " has angle " << phi << " with respect to reference " << reference << "." << endl;434 Log() << Verbose(1) << "INFO: " << point << " has angle " << phi << " with respect to reference " << reference << "." << endl; 421 435 422 436 return phi; … … 433 447 double CalculateVolumeofGeneralTetraeder(const Vector &a, const Vector &b, const Vector &c, const Vector &d) 434 448 { 449 Info FunctionInfo(__func__); 435 450 Vector Point, TetraederVector[3]; 436 451 double volume; … … 456 471 bool CheckLineCriteriaForDegeneratedTriangle(const BoundaryPointSet * const nodes[3]) 457 472 { 473 Info FunctionInfo(__func__); 458 474 bool result = false; 459 475 int counter = 0; … … 482 498 } 483 499 if ((!result) && (counter > 1)) { 484 Log() << Verbose( 2) << "INFO: Degenerate triangle is ok, at least two, here " << counter << ", existing lines are used." << endl;500 Log() << Verbose(1) << "INFO: Degenerate triangle is ok, at least two, here " << counter << ", existing lines are used." << endl; 485 501 result = true; 486 502 } … … 489 505 490 506 491 /** Sort function for the candidate list. 492 */ 493 bool SortCandidates(const CandidateForTesselation* candidate1, const CandidateForTesselation* candidate2) 494 { 495 Vector BaseLineVector, OrthogonalVector, helper; 496 if (candidate1->BaseLine != candidate2->BaseLine) { // sanity check 497 eLog() << Verbose(1) << "sortCandidates was called for two different baselines: " << candidate1->BaseLine << " and " << candidate2->BaseLine << "." << endl; 498 //return false; 499 exit(1); 500 } 501 // create baseline vector 502 BaseLineVector.CopyVector(candidate1->BaseLine->endpoints[1]->node->node); 503 BaseLineVector.SubtractVector(candidate1->BaseLine->endpoints[0]->node->node); 504 BaseLineVector.Normalize(); 505 506 // create normal in-plane vector to cope with acos() non-uniqueness on [0,2pi] (note that is pointing in the "right" direction already, hence ">0" test!) 507 helper.CopyVector(candidate1->BaseLine->endpoints[0]->node->node); 508 helper.SubtractVector(candidate1->point->node); 509 OrthogonalVector.CopyVector(&helper); 510 helper.VectorProduct(&BaseLineVector); 511 OrthogonalVector.SubtractVector(&helper); 512 OrthogonalVector.Normalize(); 513 514 // calculate both angles and correct with in-plane vector 515 helper.CopyVector(candidate1->point->node); 516 helper.SubtractVector(candidate1->BaseLine->endpoints[0]->node->node); 517 double phi = BaseLineVector.Angle(&helper); 518 if (OrthogonalVector.ScalarProduct(&helper) > 0) { 519 phi = 2.*M_PI - phi; 520 } 521 helper.CopyVector(candidate2->point->node); 522 helper.SubtractVector(candidate1->BaseLine->endpoints[0]->node->node); 523 double psi = BaseLineVector.Angle(&helper); 524 if (OrthogonalVector.ScalarProduct(&helper) > 0) { 525 psi = 2.*M_PI - psi; 526 } 527 528 Log() << Verbose(2) << *candidate1->point << " has angle " << phi << endl; 529 Log() << Verbose(2) << *candidate2->point << " has angle " << psi << endl; 530 531 // return comparison 532 return phi < psi; 533 }; 507 ///** Sort function for the candidate list. 508 // */ 509 //bool SortCandidates(const CandidateForTesselation* candidate1, const CandidateForTesselation* candidate2) 510 //{ 511 // Info FunctionInfo(__func__); 512 // Vector BaseLineVector, OrthogonalVector, helper; 513 // if (candidate1->BaseLine != candidate2->BaseLine) { // sanity check 514 // eLog() << Verbose(1) << "sortCandidates was called for two different baselines: " << candidate1->BaseLine << " and " << candidate2->BaseLine << "." << endl; 515 // //return false; 516 // exit(1); 517 // } 518 // // create baseline vector 519 // BaseLineVector.CopyVector(candidate1->BaseLine->endpoints[1]->node->node); 520 // BaseLineVector.SubtractVector(candidate1->BaseLine->endpoints[0]->node->node); 521 // BaseLineVector.Normalize(); 522 // 523 // // create normal in-plane vector to cope with acos() non-uniqueness on [0,2pi] (note that is pointing in the "right" direction already, hence ">0" test!) 524 // helper.CopyVector(candidate1->BaseLine->endpoints[0]->node->node); 525 // helper.SubtractVector(candidate1->point->node); 526 // OrthogonalVector.CopyVector(&helper); 527 // helper.VectorProduct(&BaseLineVector); 528 // OrthogonalVector.SubtractVector(&helper); 529 // OrthogonalVector.Normalize(); 530 // 531 // // calculate both angles and correct with in-plane vector 532 // helper.CopyVector(candidate1->point->node); 533 // helper.SubtractVector(candidate1->BaseLine->endpoints[0]->node->node); 534 // double phi = BaseLineVector.Angle(&helper); 535 // if (OrthogonalVector.ScalarProduct(&helper) > 0) { 536 // phi = 2.*M_PI - phi; 537 // } 538 // helper.CopyVector(candidate2->point->node); 539 // helper.SubtractVector(candidate1->BaseLine->endpoints[0]->node->node); 540 // double psi = BaseLineVector.Angle(&helper); 541 // if (OrthogonalVector.ScalarProduct(&helper) > 0) { 542 // psi = 2.*M_PI - psi; 543 // } 544 // 545 // Log() << Verbose(1) << *candidate1->point << " has angle " << phi << endl; 546 // Log() << Verbose(1) << *candidate2->point << " has angle " << psi << endl; 547 // 548 // // return comparison 549 // return phi < psi; 550 //}; 534 551 535 552 /** … … 541 558 * @return point which is second closest to the provided one 542 559 */ 543 TesselPoint* FindSecondClosestPoint(const Vector* Point, const LinkedCell* const LC) 544 { 560 TesselPoint* FindSecondClosestTesselPoint(const Vector* Point, const LinkedCell* const LC) 561 { 562 Info FunctionInfo(__func__); 545 563 TesselPoint* closestPoint = NULL; 546 564 TesselPoint* secondClosestPoint = NULL; … … 553 571 for(int i=0;i<NDIM;i++) // store indices of this cell 554 572 N[i] = LC->n[i]; 555 Log() << Verbose( 2) << "INFO: Center cell is " << N[0] << ", " << N[1] << ", " << N[2] << " with No. " << LC->index << "." << endl;573 Log() << Verbose(1) << "INFO: Center cell is " << N[0] << ", " << N[1] << ", " << N[2] << " with No. " << LC->index << "." << endl; 556 574 557 575 LC->GetNeighbourBounds(Nlower, Nupper); 558 //Log() << Verbose( 0) << endl;576 //Log() << Verbose(1) << endl; 559 577 for (LC->n[0] = Nlower[0]; LC->n[0] <= Nupper[0]; LC->n[0]++) 560 578 for (LC->n[1] = Nlower[1]; LC->n[1] <= Nupper[1]; LC->n[1]++) 561 579 for (LC->n[2] = Nlower[2]; LC->n[2] <= Nupper[2]; LC->n[2]++) { 562 580 const LinkedNodes *List = LC->GetCurrentCell(); 563 //Log() << Verbose( 3) << "The current cell " << LC->n[0] << "," << LC->n[1] << "," << LC->n[2] << endl;581 //Log() << Verbose(1) << "The current cell " << LC->n[0] << "," << LC->n[1] << "," << LC->n[2] << endl; 564 582 if (List != NULL) { 565 583 for (LinkedNodes::const_iterator Runner = List->begin(); Runner != List->end(); Runner++) { … … 595 613 * @return point which is closest to the provided one, NULL if none found 596 614 */ 597 TesselPoint* FindClosestPoint(const Vector* Point, TesselPoint *&SecondPoint, const LinkedCell* const LC) 598 { 615 TesselPoint* FindClosestTesselPoint(const Vector* Point, TesselPoint *&SecondPoint, const LinkedCell* const LC) 616 { 617 Info FunctionInfo(__func__); 599 618 TesselPoint* closestPoint = NULL; 600 619 SecondPoint = NULL; … … 607 626 for(int i=0;i<NDIM;i++) // store indices of this cell 608 627 N[i] = LC->n[i]; 609 Log() << Verbose( 3) << "INFO: Center cell is " << N[0] << ", " << N[1] << ", " << N[2] << " with No. " << LC->index << "." << endl;628 Log() << Verbose(1) << "INFO: Center cell is " << N[0] << ", " << N[1] << ", " << N[2] << " with No. " << LC->index << "." << endl; 610 629 611 630 LC->GetNeighbourBounds(Nlower, Nupper); 612 //Log() << Verbose( 0) << endl;631 //Log() << Verbose(1) << endl; 613 632 for (LC->n[0] = Nlower[0]; LC->n[0] <= Nupper[0]; LC->n[0]++) 614 633 for (LC->n[1] = Nlower[1]; LC->n[1] <= Nupper[1]; LC->n[1]++) 615 634 for (LC->n[2] = Nlower[2]; LC->n[2] <= Nupper[2]; LC->n[2]++) { 616 635 const LinkedNodes *List = LC->GetCurrentCell(); 617 //Log() << Verbose( 3) << "The current cell " << LC->n[0] << "," << LC->n[1] << "," << LC->n[2] << endl;636 //Log() << Verbose(1) << "The current cell " << LC->n[0] << "," << LC->n[1] << "," << LC->n[2] << endl; 618 637 if (List != NULL) { 619 638 for (LinkedNodes::const_iterator Runner = List->begin(); Runner != List->end(); Runner++) { 620 639 helper.CopyVector(Point); 621 640 helper.SubtractVector((*Runner)->node); 622 double currentNorm = helper. Norm();641 double currentNorm = helper.NormSquared(); 623 642 if (currentNorm < distance) { 624 643 secondDistance = distance; … … 626 645 distance = currentNorm; 627 646 closestPoint = (*Runner); 628 //Log() << Verbose( 2) << "INFO: New Nearest Neighbour is " << *closestPoint << "." << endl;647 //Log() << Verbose(1) << "INFO: New Nearest Neighbour is " << *closestPoint << "." << endl; 629 648 } else if (currentNorm < secondDistance) { 630 649 secondDistance = currentNorm; 631 650 SecondPoint = (*Runner); 632 //Log() << Verbose( 2) << "INFO: New Second Nearest Neighbour is " << *SecondPoint << "." << endl;651 //Log() << Verbose(1) << "INFO: New Second Nearest Neighbour is " << *SecondPoint << "." << endl; 633 652 } 634 653 } … … 640 659 // output 641 660 if (closestPoint != NULL) { 642 Log() << Verbose( 2) << "Closest point is " << *closestPoint;661 Log() << Verbose(1) << "Closest point is " << *closestPoint; 643 662 if (SecondPoint != NULL) 644 663 Log() << Verbose(0) << " and second closest is " << *SecondPoint; … … 656 675 Vector * GetClosestPointBetweenLine(const BoundaryLineSet * const Base, const BoundaryLineSet * const OtherBase) 657 676 { 677 Info FunctionInfo(__func__); 658 678 // construct the plane of the two baselines (i.e. take both their directional vectors) 659 679 Vector Normal; … … 666 686 Normal.VectorProduct(&OtherBaseline); 667 687 Normal.Normalize(); 668 Log() << Verbose( 4) << "First direction is " << Baseline << ", second direction is " << OtherBaseline << ", normal of intersection plane is " << Normal << "." << endl;688 Log() << Verbose(1) << "First direction is " << Baseline << ", second direction is " << OtherBaseline << ", normal of intersection plane is " << Normal << "." << endl; 669 689 670 690 // project one offset point of OtherBase onto this plane (and add plane offset vector) … … 683 703 Normal.CopyVector(Intersection); 684 704 Normal.SubtractVector(Base->endpoints[0]->node->node); 685 Log() << Verbose( 3) << "Found closest point on " << *Base << " at " << *Intersection << ", factor in line is " << fabs(Normal.ScalarProduct(&Baseline)/Baseline.NormSquared()) << "." << endl;705 Log() << Verbose(1) << "Found closest point on " << *Base << " at " << *Intersection << ", factor in line is " << fabs(Normal.ScalarProduct(&Baseline)/Baseline.NormSquared()) << "." << endl; 686 706 687 707 return Intersection; … … 696 716 double DistanceToTrianglePlane(const Vector *x, const BoundaryTriangleSet * const triangle) 697 717 { 718 Info FunctionInfo(__func__); 698 719 double distance = 0.; 699 720 if (x == NULL) { … … 712 733 void WriteVrmlFile(ofstream * const vrmlfile, const Tesselation * const Tess, const PointCloud * const cloud) 713 734 { 735 Info FunctionInfo(__func__); 714 736 TesselPoint *Walker = NULL; 715 737 int i; … … 755 777 void IncludeSphereinRaster3D(ofstream * const rasterfile, const Tesselation * const Tess, const PointCloud * const cloud) 756 778 { 779 Info FunctionInfo(__func__); 757 780 Vector helper; 758 // include the current position of the virtual sphere in the temporary raster3d file 759 Vector *center = cloud->GetCenter(); 760 // make the circumsphere's center absolute again 761 helper.CopyVector(Tess->LastTriangle->endpoints[0]->node->node); 762 helper.AddVector(Tess->LastTriangle->endpoints[1]->node->node); 763 helper.AddVector(Tess->LastTriangle->endpoints[2]->node->node); 764 helper.Scale(1./3.); 765 helper.SubtractVector(center); 766 // and add to file plus translucency object 767 *rasterfile << "# current virtual sphere\n"; 768 *rasterfile << "8\n 25.0 0.6 -1.0 -1.0 -1.0 0.2 0 0 0 0\n"; 769 *rasterfile << "2\n " << helper.x[0] << " " << helper.x[1] << " " << helper.x[2] << "\t" << 5. << "\t1 0 0\n"; 770 *rasterfile << "9\n terminating special property\n"; 771 delete(center); 781 782 if (Tess->LastTriangle != NULL) { 783 // include the current position of the virtual sphere in the temporary raster3d file 784 Vector *center = cloud->GetCenter(); 785 // make the circumsphere's center absolute again 786 helper.CopyVector(Tess->LastTriangle->endpoints[0]->node->node); 787 helper.AddVector(Tess->LastTriangle->endpoints[1]->node->node); 788 helper.AddVector(Tess->LastTriangle->endpoints[2]->node->node); 789 helper.Scale(1./3.); 790 helper.SubtractVector(center); 791 // and add to file plus translucency object 792 *rasterfile << "# current virtual sphere\n"; 793 *rasterfile << "8\n 25.0 0.6 -1.0 -1.0 -1.0 0.2 0 0 0 0\n"; 794 *rasterfile << "2\n " << helper.x[0] << " " << helper.x[1] << " " << helper.x[2] << "\t" << 5. << "\t1 0 0\n"; 795 *rasterfile << "9\n terminating special property\n"; 796 delete(center); 797 } 772 798 }; 773 799 … … 780 806 void WriteRaster3dFile(ofstream * const rasterfile, const Tesselation * const Tess, const PointCloud * const cloud) 781 807 { 808 Info FunctionInfo(__func__); 782 809 TesselPoint *Walker = NULL; 783 810 int i; … … 825 852 void WriteTecplotFile(ofstream * const tecplot, const Tesselation * const TesselStruct, const PointCloud * const cloud, const int N) 826 853 { 854 Info FunctionInfo(__func__); 827 855 if ((tecplot != NULL) && (TesselStruct != NULL)) { 828 856 // write header 829 857 *tecplot << "TITLE = \"3D CONVEX SHELL\"" << endl; 830 858 *tecplot << "VARIABLES = \"X\" \"Y\" \"Z\" \"U\"" << endl; 831 *tecplot << "ZONE T=\"" << N << "-"; 832 for (int i=0;i<3;i++) 833 *tecplot << (i==0 ? "" : "_") << TesselStruct->LastTriangle->endpoints[i]->node->Name; 859 *tecplot << "ZONE T=\""; 860 if (N < 0) { 861 *tecplot << cloud->GetName(); 862 } else { 863 *tecplot << N << "-"; 864 for (int i=0;i<3;i++) 865 *tecplot << (i==0 ? "" : "_") << TesselStruct->LastTriangle->endpoints[i]->node->Name; 866 } 834 867 *tecplot << "\", N=" << TesselStruct->PointsOnBoundary.size() << ", E=" << TesselStruct->TrianglesOnBoundary.size() << ", DATAPACKING=POINT, ZONETYPE=FETRIANGLE" << endl; 835 int i=0; 836 for (cloud->GoToFirst(); !cloud->IsEnd(); cloud->GoToNext(), i++); 868 int i=cloud->GetMaxId(); 837 869 int *LookupList = new int[i]; 838 870 for (cloud->GoToFirst(), i=0; !cloud->IsEnd(); cloud->GoToNext(), i++) … … 840 872 841 873 // print atom coordinates 842 Log() << Verbose(2) << "The following triangles were created:";843 874 int Counter = 1; 844 875 TesselPoint *Walker = NULL; … … 850 881 *tecplot << endl; 851 882 // print connectivity 883 Log() << Verbose(1) << "The following triangles were created:" << endl; 852 884 for (TriangleMap::const_iterator runner = TesselStruct->TrianglesOnBoundary.begin(); runner != TesselStruct->TrianglesOnBoundary.end(); runner++) { 853 Log() << Verbose( 0) << " " << runner->second->endpoints[0]->node->Name << "<->" << runner->second->endpoints[1]->node->Name << "<->" << runner->second->endpoints[2]->node->Name;885 Log() << Verbose(1) << " " << runner->second->endpoints[0]->node->Name << "<->" << runner->second->endpoints[1]->node->Name << "<->" << runner->second->endpoints[2]->node->Name << endl; 854 886 *tecplot << LookupList[runner->second->endpoints[0]->node->nr] << " " << LookupList[runner->second->endpoints[1]->node->nr] << " " << LookupList[runner->second->endpoints[2]->node->nr] << endl; 855 887 } 856 888 delete[] (LookupList); 857 Log() << Verbose(0) << endl;858 889 } 859 890 }; … … 866 897 void CalculateConcavityPerBoundaryPoint(const Tesselation * const TesselStruct) 867 898 { 899 Info FunctionInfo(__func__); 868 900 class BoundaryPointSet *point = NULL; 869 901 class BoundaryLineSet *line = NULL; 870 902 871 //Log() << Verbose(2) << "Begin of CalculateConcavityPerBoundaryPoint" << endl;872 903 // calculate remaining concavity 873 904 for (PointMap::const_iterator PointRunner = TesselStruct->PointsOnBoundary.begin(); PointRunner != TesselStruct->PointsOnBoundary.end(); PointRunner++) { … … 877 908 for (LineMap::iterator LineRunner = point->lines.begin(); LineRunner != point->lines.end(); LineRunner++) { 878 909 line = LineRunner->second; 879 //Log() << Verbose( 2) << "INFO: Current line of point " << *point << " is " << *line << "." << endl;910 //Log() << Verbose(1) << "INFO: Current line of point " << *point << " is " << *line << "." << endl; 880 911 if (!line->CheckConvexityCriterion()) 881 912 point->value += 1; 882 913 } 883 914 } 884 //Log() << Verbose(2) << "End of CalculateConcavityPerBoundaryPoint" << endl;885 915 }; 886 916 … … 893 923 bool CheckListOfBaselines(const Tesselation * const TesselStruct) 894 924 { 925 Info FunctionInfo(__func__); 895 926 LineMap::const_iterator testline; 896 927 bool result = false; … … 900 931 for (testline = TesselStruct->LinesOnBoundary.begin(); testline != TesselStruct->LinesOnBoundary.end(); testline++) { 901 932 if (testline->second->triangles.size() != 2) { 902 Log() << Verbose( 1) << *testline->second << "\t" << testline->second->triangles.size() << endl;933 Log() << Verbose(2) << *testline->second << "\t" << testline->second->triangles.size() << endl; 903 934 counter++; 904 935 } … … 911 942 } 912 943 944 /** Counts the number of triangle pairs that contain the given polygon. 945 * \param *P polygon with endpoints to look for 946 * \param *T set of triangles to create pairs from containing \a *P 947 */ 948 int CountTrianglePairContainingPolygon(const BoundaryPolygonSet * const P, const TriangleSet * const T) 949 { 950 Info FunctionInfo(__func__); 951 // check number of endpoints in *P 952 if (P->endpoints.size() != 4) { 953 eLog() << Verbose(1) << "CountTrianglePairContainingPolygon works only on polygons with 4 nodes!" << endl; 954 return 0; 955 } 956 957 // check number of triangles in *T 958 if (T->size() < 2) { 959 eLog() << Verbose(1) << "Not enough triangles to have pairs!" << endl; 960 return 0; 961 } 962 963 Log() << Verbose(0) << "Polygon is " << *P << endl; 964 // create each pair, get the endpoints and check whether *P is contained. 965 int counter = 0; 966 PointSet Trianglenodes; 967 class BoundaryPolygonSet PairTrianglenodes; 968 for(TriangleSet::iterator Walker = T->begin(); Walker != T->end(); Walker++) { 969 for (int i=0;i<3;i++) 970 Trianglenodes.insert((*Walker)->endpoints[i]); 971 972 for(TriangleSet::iterator PairWalker = Walker; PairWalker != T->end(); PairWalker++) { 973 if (Walker != PairWalker) { // skip first 974 PairTrianglenodes.endpoints = Trianglenodes; 975 for (int i=0;i<3;i++) 976 PairTrianglenodes.endpoints.insert((*PairWalker)->endpoints[i]); 977 const int size = PairTrianglenodes.endpoints.size(); 978 if (size == 4) { 979 Log() << Verbose(0) << " Current pair of triangles: " << **Walker << "," << **PairWalker << " with " << size << " distinct endpoints:" << PairTrianglenodes << endl; 980 // now check 981 if (PairTrianglenodes.ContainsPresentTupel(P)) { 982 counter++; 983 Log() << Verbose(0) << " ACCEPT: Matches with " << *P << endl; 984 } else { 985 Log() << Verbose(0) << " REJECT: No match with " << *P << endl; 986 } 987 } else { 988 Log() << Verbose(0) << " REJECT: Less than four endpoints." << endl; 989 } 990 } 991 } 992 Trianglenodes.clear(); 993 } 994 return counter; 995 }; 996 997 /** Checks whether two give polygons have two or more points in common. 998 * \param *P1 first polygon 999 * \param *P2 second polygon 1000 * \return true - are connected, false = are note 1001 */ 1002 bool ArePolygonsEdgeConnected(const BoundaryPolygonSet * const P1, const BoundaryPolygonSet * const P2) 1003 { 1004 Info FunctionInfo(__func__); 1005 int counter = 0; 1006 for(PointSet::const_iterator Runner = P1->endpoints.begin(); Runner != P1->endpoints.end(); Runner++) { 1007 if (P2->ContainsBoundaryPoint((*Runner))) { 1008 counter++; 1009 Log() << Verbose(1) << *(*Runner) << " of second polygon is found in the first one." << endl; 1010 return true; 1011 } 1012 } 1013 return false; 1014 }; 1015 1016 /** Combines second into the first and deletes the second. 1017 * \param *P1 first polygon, contains all nodes on return 1018 * \param *&P2 second polygon, is deleted. 1019 */ 1020 void CombinePolygons(BoundaryPolygonSet * const P1, BoundaryPolygonSet * &P2) 1021 { 1022 Info FunctionInfo(__func__); 1023 pair <PointSet::iterator, bool> Tester; 1024 for(PointSet::iterator Runner = P2->endpoints.begin(); Runner != P2->endpoints.end(); Runner++) { 1025 Tester = P1->endpoints.insert((*Runner)); 1026 if (Tester.second) 1027 Log() << Verbose(0) << "Inserting endpoint " << *(*Runner) << " into first polygon." << endl; 1028 } 1029 P2->endpoints.clear(); 1030 delete(P2); 1031 }; 1032 -
TabularUnified src/tesselationhelpers.hpp ¶
r9fe36b rb8d1aeb 59 59 bool CheckLineCriteriaForDegeneratedTriangle(const BoundaryPointSet * const nodes[3]); 60 60 bool SortCandidates(const CandidateForTesselation* candidate1, const CandidateForTesselation *candidate2); 61 TesselPoint* FindClosest Point(const Vector* Point, TesselPoint *&SecondPoint, const LinkedCell* const LC);62 TesselPoint* FindSecondClosest Point(const Vector*, const LinkedCell* const LC);61 TesselPoint* FindClosestTesselPoint(const Vector* Point, TesselPoint *&SecondPoint, const LinkedCell* const LC); 62 TesselPoint* FindSecondClosestTesselPoint(const Vector*, const LinkedCell* const LC); 63 63 Vector * GetClosestPointBetweenLine(const BoundaryLineSet * const Base, const BoundaryLineSet * const OtherBase); 64 64 … … 72 72 bool CheckListOfBaselines(const Tesselation * const TesselStruct); 73 73 74 int CountTrianglePairContainingPolygon(const BoundaryPolygonSet * const P, const TriangleSet * const T); 75 bool ArePolygonsEdgeConnected(const BoundaryPolygonSet * const P1, const BoundaryPolygonSet * const P2); 76 void CombinePolygons(BoundaryPolygonSet * const P1, BoundaryPolygonSet * &P2); 77 74 78 75 79 #endif /* TESSELATIONHELPERS_HPP_ */ -
TabularUnified src/unittests/AnalysisCorrelationToPointUnitTest.cpp ¶
r9fe36b rb8d1aeb 11 11 #include <cppunit/extensions/TestFactoryRegistry.h> 12 12 #include <cppunit/ui/text/TestRunner.h> 13 14 #include <cstring> 13 15 14 16 #include "analysis_correlation.hpp" -
TabularUnified src/unittests/AnalysisCorrelationToSurfaceUnitTest.cpp ¶
r9fe36b rb8d1aeb 11 11 #include <cppunit/extensions/TestFactoryRegistry.h> 12 12 #include <cppunit/ui/text/TestRunner.h> 13 14 #include <cstring> 13 15 14 16 #include "analysis_correlation.hpp" -
TabularUnified src/unittests/AnalysisPairCorrelationUnitTest.cpp ¶
r9fe36b rb8d1aeb 11 11 #include <cppunit/extensions/TestFactoryRegistry.h> 12 12 #include <cppunit/ui/text/TestRunner.h> 13 14 #include <cstring> 13 15 14 16 #include "analysis_correlation.hpp" -
TabularUnified src/unittests/Makefile.am ¶
r9fe36b rb8d1aeb 6 6 MENUTESTS = ActionSequenceTest 7 7 8 TESTS = ActOnAllUnitTest AnalysisBondsUnitTests AnalysisCorrelationToPointUnitTest AnalysisCorrelationToSurfaceUnitTest AnalysisPairCorrelationUnitTest BondGraphUnitTest ListOfBondsUnitTest LogUnitTest MemoryUsageObserverUnitTest MemoryAllocatorUnitTest StackClassUnitTest VectorUnitTest ObserverTest $(MENUTESTS) 8 9 TESTS = \ 10 ActOnAllUnitTest \ 11 AnalysisBondsUnitTests \ 12 AnalysisCorrelationToPointUnitTest \ 13 AnalysisCorrelationToSurfaceUnitTest \ 14 AnalysisPairCorrelationUnitTest \ 15 BondGraphUnitTest \ 16 GSLMatrixSymmetricUnitTest \ 17 GSLMatrixUnitTest \ 18 GSLVectorUnitTest \ 19 InfoUnitTest \ 20 LinearSystemOfEquationsUnitTest \ 21 ListOfBondsUnitTest \ 22 LogUnitTest \ 23 MemoryUsageObserverUnitTest \ 24 MemoryAllocatorUnitTest \ 25 StackClassUnitTest \ 26 TesselationUnitTest \ 27 Tesselation_BoundaryTriangleUnitTest \ 28 Tesselation_InOutsideUnitTest \ 29 VectorUnitTest \ 30 ObserverTest \ 31 ${MENUTESTS} 32 33 9 34 check_PROGRAMS = $(TESTS) 10 35 noinst_PROGRAMS = $(TESTS) 11 36 12 37 ActOnAllUnitTest_SOURCES = ../test/ActOnAllTest.hpp ActOnAllUnitTest.cpp ActOnAllUnitTest.hpp 13 ActOnAllUnitTest_LDADD = ../libmolecuilder.a 38 ActOnAllUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 14 39 15 40 AnalysisBondsUnitTests_SOURCES = analysisbondsunittest.cpp analysisbondsunittest.hpp 16 AnalysisBondsUnitTests_LDADD = ../libmolecuilder.a 41 AnalysisBondsUnitTests_LDADD = ../libmolecuilder.a ../libgslwrapper.a 17 42 18 43 AnalysisCorrelationToPointUnitTest_SOURCES = analysis_correlation.hpp AnalysisCorrelationToPointUnitTest.cpp AnalysisCorrelationToPointUnitTest.hpp 19 AnalysisCorrelationToPointUnitTest_LDADD = ../libmolecuilder.a 44 AnalysisCorrelationToPointUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 20 45 21 46 AnalysisCorrelationToSurfaceUnitTest_SOURCES = analysis_correlation.hpp AnalysisCorrelationToSurfaceUnitTest.cpp AnalysisCorrelationToSurfaceUnitTest.hpp 22 AnalysisCorrelationToSurfaceUnitTest_LDADD = ../libmolecuilder.a 47 AnalysisCorrelationToSurfaceUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 23 48 24 49 AnalysisPairCorrelationUnitTest_SOURCES = analysis_correlation.hpp AnalysisPairCorrelationUnitTest.cpp AnalysisPairCorrelationUnitTest.hpp 25 AnalysisPairCorrelationUnitTest_LDADD = ../libmolecuilder.a 50 AnalysisPairCorrelationUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 26 51 27 52 BondGraphUnitTest_SOURCES = bondgraphunittest.cpp bondgraphunittest.hpp 28 BondGraphUnitTest_LDADD = ../libmolecuilder.a 53 BondGraphUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 54 55 GSLMatrixSymmetricUnitTest_SOURCES = gslmatrixsymmetricunittest.cpp gslmatrixsymmetricunittest.hpp 56 GSLMatrixSymmetricUnitTest_LDADD = ../libgslwrapper.a 57 58 GSLMatrixUnitTest_SOURCES = gslmatrixunittest.cpp gslmatrixunittest.hpp 59 GSLMatrixUnitTest_LDADD = ../libgslwrapper.a 60 61 GSLVectorUnitTest_SOURCES = gslvectorunittest.cpp gslvectorunittest.hpp 62 GSLVectorUnitTest_LDADD = ../libgslwrapper.a 63 64 InfoUnitTest_SOURCES = infounittest.cpp infounittest.hpp 65 InfoUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 66 67 LinearSystemOfEquationsUnitTest_SOURCES = linearsystemofequationsunittest.cpp linearsystemofequationsunittest.hpp 68 LinearSystemOfEquationsUnitTest_LDADD = ../libgslwrapper.a ../libmolecuilder.a 29 69 30 70 ListOfBondsUnitTest_SOURCES = listofbondsunittest.cpp listofbondsunittest.hpp 31 ListOfBondsUnitTest_LDADD = ../libmolecuilder.a 71 ListOfBondsUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 32 72 33 73 LogUnitTest_SOURCES = logunittest.cpp logunittest.hpp 34 LogUnitTest_LDADD = ../libmolecuilder.a 74 LogUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 35 75 36 76 MemoryAllocatorUnitTest_SOURCES = memoryallocatorunittest.cpp memoryallocatorunittest.hpp 37 MemoryAllocatorUnitTest_LDADD = ../libmolecuilder.a 77 MemoryAllocatorUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 38 78 39 79 MemoryUsageObserverUnitTest_SOURCES = memoryusageobserverunittest.cpp memoryusageobserverunittest.hpp 40 MemoryUsageObserverUnitTest_LDADD = ../libmolecuilder.a 80 MemoryUsageObserverUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 41 81 42 82 StackClassUnitTest_SOURCES = stackclassunittest.cpp stackclassunittest.hpp 43 StackClassUnitTest_LDADD = ../libmolecuilder.a 83 StackClassUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 84 85 TesselationUnitTest_SOURCES = tesselationunittest.cpp tesselationunittest.hpp 86 TesselationUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 87 88 Tesselation_BoundaryTriangleUnitTest_SOURCES = tesselation_boundarytriangleunittest.cpp tesselation_boundarytriangleunittest.hpp 89 Tesselation_BoundaryTriangleUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 90 91 Tesselation_InOutsideUnitTest_SOURCES = tesselation_insideoutsideunittest.cpp tesselation_insideoutsideunittest.hpp 92 Tesselation_InOutsideUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 44 93 45 94 VectorUnitTest_SOURCES = vectorunittest.cpp vectorunittest.hpp 46 VectorUnitTest_LDADD = ../libmolecuilder.a 95 VectorUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 47 96 48 97 ActionSequenceTest_SOURCES = ActionSequenceTest.cpp ActionSequenceTest.hpp -
TabularUnified src/unittests/analysisbondsunittest.cpp ¶
r9fe36b rb8d1aeb 14 14 #include <iostream> 15 15 #include <stdio.h> 16 #include <cstring> 16 17 17 18 #include "analysis_bonds.hpp" -
TabularUnified src/unittests/bondgraphunittest.cpp ¶
r9fe36b rb8d1aeb 14 14 #include <iostream> 15 15 #include <stdio.h> 16 #include <cstring> 16 17 17 18 #include "atom.hpp" -
TabularUnified src/unittests/listofbondsunittest.cpp ¶
r9fe36b rb8d1aeb 11 11 #include <cppunit/extensions/TestFactoryRegistry.h> 12 12 #include <cppunit/ui/text/TestRunner.h> 13 14 #include <cstring> 13 15 14 16 #include "listofbondsunittest.hpp" -
TabularUnified src/unittests/tesselationunittest.cpp ¶
r9fe36b rb8d1aeb 12 12 #include <cppunit/extensions/TestFactoryRegistry.h> 13 13 #include <cppunit/ui/text/TestRunner.h> 14 15 #include <cstring> 14 16 15 17 #include "defs.hpp" … … 30 32 class TesselPoint *Walker; 31 33 Walker = new TesselPoint; 32 Walker->node = new Vector(1., 0., 0.);33 Walker->Name = new char[3];34 Walker->node = new Vector(1., 0., -1.); 35 Walker->Name = Malloc<char>(3, "TesselationTest::setUp"); 34 36 strcpy(Walker->Name, "1"); 35 37 Walker->nr = 1; 36 38 Corners.push_back(Walker); 37 39 Walker = new TesselPoint; 38 Walker->node = new Vector(-1., 1., 0.);39 Walker->Name = new char[3];40 Walker->node = new Vector(-1., 1., -1.); 41 Walker->Name = Malloc<char>(3, "TesselationTest::setUp"); 40 42 strcpy(Walker->Name, "2"); 41 43 Walker->nr = 2; 42 44 Corners.push_back(Walker); 43 45 Walker = new TesselPoint; 44 Walker->node = new Vector(-1., -1., 0.);45 Walker->Name = new char[3];46 Walker->node = new Vector(-1., -1., -1.); 47 Walker->Name = Malloc<char>(3, "TesselationTest::setUp"); 46 48 strcpy(Walker->Name, "3"); 47 49 Walker->nr = 3; … … 49 51 Walker = new TesselPoint; 50 52 Walker->node = new Vector(-1., 0., 1.); 51 Walker->Name = new char[3];53 Walker->Name = Malloc<char>(3, "TesselationTest::setUp"); 52 54 strcpy(Walker->Name, "4"); 53 55 Walker->nr = 4; … … 59 61 // create tesselation 60 62 TesselStruct = new Tesselation; 61 TesselStruct->PointsOnBoundary.clear();62 TesselStruct->LinesOnBoundary.clear();63 TesselStruct->TrianglesOnBoundary.clear();63 CPPUNIT_ASSERT_EQUAL( true, TesselStruct->PointsOnBoundary.empty() ); 64 CPPUNIT_ASSERT_EQUAL( true, TesselStruct->LinesOnBoundary.empty() ); 65 CPPUNIT_ASSERT_EQUAL( true, TesselStruct->TrianglesOnBoundary.empty() ); 64 66 TesselStruct->FindStartingTriangle(SPHERERADIUS, LinkedList); 65 bool flag = false;66 67 67 LineMap::iterator baseline = TesselStruct->LinesOnBoundary.begin(); 68 while (baseline != TesselStruct->LinesOnBoundary.end()) { 69 if (baseline->second->triangles.size() == 1) { 70 flag = TesselStruct->FindNextSuitableTriangle(*(baseline->second), *(((baseline->second->triangles.begin()))->second), SPHERERADIUS, LinkedList); //the line is there, so there is a triangle, but only one. 68 CandidateForTesselation *baseline = NULL; 69 BoundaryTriangleSet *T = NULL; 70 bool OneLoopWithoutSuccessFlag = true; 71 bool TesselationFailFlag = false; 72 while ((!TesselStruct->OpenLines.empty()) && (OneLoopWithoutSuccessFlag)) { 73 // 2a. fill all new OpenLines 74 for (CandidateMap::iterator Runner = TesselStruct->OpenLines.begin(); Runner != TesselStruct->OpenLines.end(); Runner++) { 75 baseline = Runner->second; 76 if (baseline->pointlist.empty()) { 77 T = (((baseline->BaseLine->triangles.begin()))->second); 78 TesselationFailFlag = TesselStruct->FindNextSuitableTriangle(*baseline, *T, SPHERERADIUS, LinkedList); //the line is there, so there is a triangle, but only one. 79 } 71 80 } 72 baseline++; 73 if ((baseline == TesselStruct->LinesOnBoundary.end()) && (flag)) { 74 baseline = TesselStruct->LinesOnBoundary.begin(); // restart if we reach end due to newly inserted lines 75 flag = false; 81 82 // 2b. search for smallest ShortestAngle among all candidates 83 double ShortestAngle = 4.*M_PI; 84 for (CandidateMap::iterator Runner = TesselStruct->OpenLines.begin(); Runner != TesselStruct->OpenLines.end(); Runner++) { 85 if (Runner->second->ShortestAngle < ShortestAngle) { 86 baseline = Runner->second; 87 ShortestAngle = baseline->ShortestAngle; 88 } 89 } 90 if ((ShortestAngle == 4.*M_PI) || (baseline->pointlist.empty())) 91 OneLoopWithoutSuccessFlag = false; 92 else { 93 TesselStruct->AddCandidateTriangle(*baseline); 76 94 } 77 95 } … … 84 102 delete(TesselStruct); 85 103 for (LinkedNodes::iterator Runner = Corners.begin(); Runner != Corners.end(); Runner++) { 86 delete[]((*Runner)->Name);87 104 delete((*Runner)->node); 88 105 delete(*Runner); 89 106 } 90 107 Corners.clear(); 91 }; 92 93 /** UnitTest for Tesselation::IsInnerPoint() 94 */ 95 void TesselationTest::IsInnerPointTest() 96 { 97 // true inside points 98 CPPUNIT_ASSERT_EQUAL( true, TesselStruct->IsInnerPoint(Vector(0.,0.,0.), LinkedList) ); 99 CPPUNIT_ASSERT_EQUAL( true, TesselStruct->IsInnerPoint(Vector(0.5,0.,0.), LinkedList) ); 100 CPPUNIT_ASSERT_EQUAL( true, TesselStruct->IsInnerPoint(Vector(0.,0.5,0.), LinkedList) ); 101 CPPUNIT_ASSERT_EQUAL( true, TesselStruct->IsInnerPoint(Vector(0.,0.,0.5), LinkedList) ); 102 103 // corners 104 for (LinkedNodes::iterator Runner = Corners.begin(); Runner != Corners.end(); Runner++) 105 CPPUNIT_ASSERT_EQUAL( true, TesselStruct->IsInnerPoint((*Runner), LinkedList) ); 106 107 // true outside points 108 CPPUNIT_ASSERT_EQUAL( false, TesselStruct->IsInnerPoint(Vector(0.,5.,0.), LinkedList) ); 109 CPPUNIT_ASSERT_EQUAL( false, TesselStruct->IsInnerPoint(Vector(0.,0.,5.), LinkedList) ); 110 CPPUNIT_ASSERT_EQUAL( false, TesselStruct->IsInnerPoint(Vector(1.,1.,1.), LinkedList) ); 111 112 // tricky point, there are three equally close triangles 113 CPPUNIT_ASSERT_EQUAL( false, TesselStruct->IsInnerPoint(Vector(5.,0.,0.), LinkedList) ); 114 108 MemoryUsageObserver::purgeInstance(); 109 logger::purgeInstance(); 110 errorLogger::purgeInstance(); 115 111 }; 116 112 -
TabularUnified src/unittests/tesselationunittest.hpp ¶
r9fe36b rb8d1aeb 21 21 { 22 22 CPPUNIT_TEST_SUITE( TesselationTest) ; 23 CPPUNIT_TEST ( IsInnerPointTest );24 23 CPPUNIT_TEST ( GetAllTrianglesTest ); 25 24 CPPUNIT_TEST ( ContainmentTest ); … … 29 28 void setUp(); 30 29 void tearDown(); 31 void IsInnerPointTest();32 30 void GetAllTrianglesTest(); 33 31 void ContainmentTest(); -
TabularUnified src/vector.cpp ¶
r9fe36b rb8d1aeb 8 8 #include "defs.hpp" 9 9 #include "helpers.hpp" 10 #include "memoryallocator.hpp" 10 #include "info.hpp" 11 #include "gslmatrix.hpp" 11 12 #include "leastsquaremin.hpp" 12 13 #include "log.hpp" 14 #include "memoryallocator.hpp" 13 15 #include "vector.hpp" 14 16 #include "verbose.hpp" 17 18 #include <gsl/gsl_linalg.h> 19 #include <gsl/gsl_matrix.h> 20 #include <gsl/gsl_permutation.h> 21 #include <gsl/gsl_vector.h> 22 23 #include <cassert> 15 24 16 25 /************************************ Functions for class vector ************************************/ … … 215 224 * \param *Origin first vector of line 216 225 * \param *LineVector second vector of line 217 * \return true - \a this contains intersection point on return, false - line is parallel to plane 226 * \return true - \a this contains intersection point on return, false - line is parallel to plane (even if in-plane) 218 227 */ 219 228 bool Vector::GetIntersectionWithPlane(const Vector * const PlaneNormal, const Vector * const PlaneOffset, const Vector * const Origin, const Vector * const LineVector) 220 229 { 230 Info FunctionInfo(__func__); 221 231 double factor; 222 232 Vector Direction, helper; … … 226 236 Direction.SubtractVector(Origin); 227 237 Direction.Normalize(); 228 //Log() << Verbose(4) << "INFO: Direction is " << Direction << "." << endl; 238 Log() << Verbose(1) << "INFO: Direction is " << Direction << "." << endl; 239 //Log() << Verbose(1) << "INFO: PlaneNormal is " << *PlaneNormal << " and PlaneOffset is " << *PlaneOffset << "." << endl; 229 240 factor = Direction.ScalarProduct(PlaneNormal); 230 if (fa ctor< MYEPSILON) { // Uniqueness: line parallel to plane?231 eLog() << Verbose(2) << "Line is parallel to plane, no intersection." << endl;241 if (fabs(factor) < MYEPSILON) { // Uniqueness: line parallel to plane? 242 Log() << Verbose(1) << "BAD: Line is parallel to plane, no intersection." << endl; 232 243 return false; 233 244 } … … 235 246 helper.SubtractVector(Origin); 236 247 factor = helper.ScalarProduct(PlaneNormal)/factor; 237 if (fa ctor< MYEPSILON) { // Origin is in-plane238 //Log() << Verbose(2) << "Origin of line is in-plane, simple." << endl;248 if (fabs(factor) < MYEPSILON) { // Origin is in-plane 249 Log() << Verbose(1) << "GOOD: Origin of line is in-plane." << endl; 239 250 CopyVector(Origin); 240 251 return true; … … 243 254 Direction.Scale(factor); 244 255 CopyVector(Origin); 245 //Log() << Verbose(4) << "INFO: Scaled direction is " << Direction << "." << endl;256 Log() << Verbose(1) << "INFO: Scaled direction is " << Direction << "." << endl; 246 257 AddVector(&Direction); 247 258 … … 250 261 helper.SubtractVector(PlaneOffset); 251 262 if (helper.ScalarProduct(PlaneNormal) < MYEPSILON) { 252 //Log() << Verbose(2) << "INFO: Intersection at " << *this << " is good." << endl;263 Log() << Verbose(1) << "GOOD: Intersection is " << *this << "." << endl; 253 264 return true; 254 265 } else { … … 286 297 287 298 /** Calculates the intersection of the two lines that are both on the same plane. 288 * We construct auxiliary plane with its vector normal to one line direction and the PlaneNormal, then a vector 289 * from the first line's offset onto the plane. Finally, scale by factor is 1/cos(angle(line1,line2..)) = 1/SP(...), and 290 * project onto the first line's direction and add its offset. 299 * This is taken from Weisstein, Eric W. "Line-Line Intersection." From MathWorld--A Wolfram Web Resource. http://mathworld.wolfram.com/Line-LineIntersection.html 291 300 * \param *out output stream for debugging 292 301 * \param *Line1a first vector of first line … … 299 308 bool Vector::GetIntersectionOfTwoLinesOnPlane(const Vector * const Line1a, const Vector * const Line1b, const Vector * const Line2a, const Vector * const Line2b, const Vector *PlaneNormal) 300 309 { 301 bool result = true; 302 Vector Direction, OtherDirection; 303 Vector AuxiliaryNormal; 304 Vector Distance; 305 const Vector *Normal = NULL; 306 Vector *ConstructedNormal = NULL; 307 bool FreeNormal = false; 308 309 // construct both direction vectors 310 Zero(); 311 Direction.CopyVector(Line1b); 312 Direction.SubtractVector(Line1a); 313 if (Direction.IsZero()) 310 Info FunctionInfo(__func__); 311 312 GSLMatrix *M = new GSLMatrix(4,4); 313 314 M->SetAll(1.); 315 for (int i=0;i<3;i++) { 316 M->Set(0, i, Line1a->x[i]); 317 M->Set(1, i, Line1b->x[i]); 318 M->Set(2, i, Line2a->x[i]); 319 M->Set(3, i, Line2b->x[i]); 320 } 321 322 //Log() << Verbose(1) << "Coefficent matrix is:" << endl; 323 //for (int i=0;i<4;i++) { 324 // for (int j=0;j<4;j++) 325 // cout << "\t" << M->Get(i,j); 326 // cout << endl; 327 //} 328 if (fabs(M->Determinant()) > MYEPSILON) { 329 Log() << Verbose(1) << "Determinant of coefficient matrix is NOT zero." << endl; 314 330 return false; 315 OtherDirection.CopyVector(Line2b); 316 OtherDirection.SubtractVector(Line2a); 317 if (OtherDirection.IsZero()) 331 } 332 Log() << Verbose(1) << "INFO: Line1a = " << *Line1a << ", Line1b = " << *Line1b << ", Line2a = " << *Line2a << ", Line2b = " << *Line2b << "." << endl; 333 334 335 // constuct a,b,c 336 Vector a; 337 Vector b; 338 Vector c; 339 Vector d; 340 a.CopyVector(Line1b); 341 a.SubtractVector(Line1a); 342 b.CopyVector(Line2b); 343 b.SubtractVector(Line2a); 344 c.CopyVector(Line2a); 345 c.SubtractVector(Line1a); 346 d.CopyVector(Line2b); 347 d.SubtractVector(Line1b); 348 Log() << Verbose(1) << "INFO: a = " << a << ", b = " << b << ", c = " << c << "." << endl; 349 if ((a.NormSquared() < MYEPSILON) || (b.NormSquared() < MYEPSILON)) { 350 Zero(); 351 Log() << Verbose(1) << "At least one of the lines is ill-defined, i.e. offset equals second vector." << endl; 352 return false; 353 } 354 355 // check for parallelity 356 Vector parallel; 357 double factor = 0.; 358 if (fabs(a.ScalarProduct(&b)*a.ScalarProduct(&b)/a.NormSquared()/b.NormSquared() - 1.) < MYEPSILON) { 359 parallel.CopyVector(Line1a); 360 parallel.SubtractVector(Line2a); 361 factor = parallel.ScalarProduct(&a)/a.Norm(); 362 if ((factor >= -MYEPSILON) && (factor - 1. < MYEPSILON)) { 363 CopyVector(Line2a); 364 Log() << Verbose(1) << "Lines conincide." << endl; 365 return true; 366 } else { 367 parallel.CopyVector(Line1a); 368 parallel.SubtractVector(Line2b); 369 factor = parallel.ScalarProduct(&a)/a.Norm(); 370 if ((factor >= -MYEPSILON) && (factor - 1. < MYEPSILON)) { 371 CopyVector(Line2b); 372 Log() << Verbose(1) << "Lines conincide." << endl; 373 return true; 374 } 375 } 376 Log() << Verbose(1) << "Lines are parallel." << endl; 377 Zero(); 318 378 return false; 319 320 Direction.Normalize(); 321 OtherDirection.Normalize(); 322 323 //Log() << Verbose(4) << "INFO: Normalized Direction " << Direction << " and OtherDirection " << OtherDirection << "." << endl; 324 325 if (fabs(OtherDirection.ScalarProduct(&Direction) - 1.) < MYEPSILON) { // lines are parallel 326 if ((Line1a == Line2a) || (Line1a == Line2b)) 327 CopyVector(Line1a); 328 else if ((Line1b == Line2b) || (Line1b == Line2b)) 329 CopyVector(Line1b); 330 else 331 return false; 332 Log() << Verbose(4) << "INFO: Intersection is " << *this << "." << endl; 333 return true; 334 } else { 335 // check whether we have a plane normal vector 336 if (PlaneNormal == NULL) { 337 ConstructedNormal = new Vector; 338 ConstructedNormal->MakeNormalVector(&Direction, &OtherDirection); 339 Normal = ConstructedNormal; 340 FreeNormal = true; 341 } else 342 Normal = PlaneNormal; 343 344 AuxiliaryNormal.MakeNormalVector(&OtherDirection, Normal); 345 //Log() << Verbose(4) << "INFO: PlaneNormal is " << *Normal << " and AuxiliaryNormal " << AuxiliaryNormal << "." << endl; 346 347 Distance.CopyVector(Line2a); 348 Distance.SubtractVector(Line1a); 349 //Log() << Verbose(4) << "INFO: Distance is " << Distance << "." << endl; 350 if (Distance.IsZero()) { 351 // offsets are equal, match found 352 CopyVector(Line1a); 353 result = true; 354 } else { 355 CopyVector(Distance.Projection(&AuxiliaryNormal)); 356 //Log() << Verbose(4) << "INFO: Projected Distance is " << *this << "." << endl; 357 double factor = Direction.ScalarProduct(&AuxiliaryNormal); 358 //Log() << Verbose(4) << "INFO: Scaling factor is " << factor << "." << endl; 359 Scale(1./(factor*factor)); 360 //Log() << Verbose(4) << "INFO: Scaled Distance is " << *this << "." << endl; 361 CopyVector(Projection(&Direction)); 362 //Log() << Verbose(4) << "INFO: Distance, projected into Direction, is " << *this << "." << endl; 363 if (this->IsZero()) 364 result = false; 365 else 366 result = true; 367 AddVector(Line1a); 368 } 369 370 if (FreeNormal) 371 delete(ConstructedNormal); 372 } 373 if (result) 374 Log() << Verbose(4) << "INFO: Intersection is " << *this << "." << endl; 375 376 return result; 379 } 380 381 // obtain s 382 double s; 383 Vector temp1, temp2; 384 temp1.CopyVector(&c); 385 temp1.VectorProduct(&b); 386 temp2.CopyVector(&a); 387 temp2.VectorProduct(&b); 388 Log() << Verbose(1) << "INFO: temp1 = " << temp1 << ", temp2 = " << temp2 << "." << endl; 389 if (fabs(temp2.NormSquared()) > MYEPSILON) 390 s = temp1.ScalarProduct(&temp2)/temp2.NormSquared(); 391 else 392 s = 0.; 393 Log() << Verbose(1) << "Factor s is " << temp1.ScalarProduct(&temp2) << "/" << temp2.NormSquared() << " = " << s << "." << endl; 394 395 // construct intersection 396 CopyVector(&a); 397 Scale(s); 398 AddVector(Line1a); 399 Log() << Verbose(1) << "Intersection is at " << *this << "." << endl; 400 401 return true; 377 402 }; 378 403 … … 480 505 else 481 506 return false; 507 }; 508 509 /** Checks whether vector is normal to \a *normal. 510 * @return true - vector is normalized, false - vector is not 511 */ 512 bool Vector::IsEqualTo(const Vector * const a) const 513 { 514 bool status = true; 515 for (int i=0;i<NDIM;i++) { 516 if (fabs(x[i] - a->x[i]) > MYEPSILON) 517 status = false; 518 } 519 return status; 482 520 }; 483 521 … … 626 664 return *x; 627 665 }; 666 667 Vector& Vector::operator=(const Vector& src) { 668 CopyVector(src); 669 return *this; 670 } 671 672 double& Vector::operator[](int i){ 673 assert(i<NDIM && "Invalid Vector dimension requested"); 674 return x[i]; 675 } 628 676 629 677 /** Prints a 3dim vector. … … 1040 1088 void Vector::CopyVector(const Vector * const y) 1041 1089 { 1042 for (int i=NDIM;i--;) 1043 this->x[i] = y->x[i]; 1090 // check for self assignment 1091 if(y!=this){ 1092 for (int i=NDIM;i--;) 1093 this->x[i] = y->x[i]; 1094 } 1044 1095 } 1045 1096 … … 1049 1100 void Vector::CopyVector(const Vector &y) 1050 1101 { 1051 for (int i=NDIM;i--;) 1052 this->x[i] = y.x[i]; 1102 // check for self assignment 1103 if(&y!=this) { 1104 for (int i=NDIM;i--;) 1105 this->x[i] = y.x[i]; 1106 } 1053 1107 } 1054 1108 -
TabularUnified src/vector.hpp ¶
r9fe36b rb8d1aeb 42 42 bool IsOne() const; 43 43 bool IsNormalTo(const Vector * const normal) const; 44 bool IsEqualTo(const Vector * const a) const; 44 45 45 46 void AddVector(const Vector * const y); … … 78 79 bool IsInParallelepiped(const Vector &offset, const double * const parallelepiped) const; 79 80 void WrapPeriodically(const double * const M, const double * const Minv); 81 82 Vector& operator=(const Vector &src); 83 double& operator[](int i); 84 80 85 }; 81 86 -
TabularUnified src/verbose.cpp ¶
r9fe36b rb8d1aeb 1 1 using namespace std; 2 2 3 #include "info.hpp" 3 4 #include "verbose.hpp" 4 5 … … 9 10 ostream& Verbose::print (ostream &ost) const 10 11 { 11 for (int i=Verbosity ;i--;)12 for (int i=Verbosity+Info::verbosity;i--;) 12 13 ost.put('\t'); 13 14 //Log() << Verbose(0) << "Verbose(.) called." << endl; … … 22 23 bool Verbose::DoOutput(int verbosityLevel) const 23 24 { 24 return (verbosityLevel >= Verbosity );25 return (verbosityLevel >= Verbosity+Info::verbosity); 25 26 }; 26 27 -
TabularUnified tests/Tesselations/1_2-dimethoxyethane/NonConvexEnvelope-1_2-dimethoxyethane.dat ¶
r9fe36b rb8d1aeb 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- H10_ H15_ H16", N=12, E=20, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="1_2-dimethoxyethane", N=12, E=20, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 9.6489 7.0567 6.6101 2 5 5 6.8975 7.0567 5.9709 2 -
TabularUnified tests/Tesselations/1_2-dimethylbenzene/NonConvexEnvelope-1_2-dimethylbenzene.dat ¶
r9fe36b rb8d1aeb 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- C07_ C08_ H09", N=14, E=25, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="1_2-dimethylbenzene", N=14, E=25, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 8.3296 6.7712 6.0321 3 5 5 8.3296 8.1534 6.0305 3 -
TabularUnified tests/Tesselations/2-methylcyclohexanone/NonConvexEnvelope-2-methylcyclohexanone.dat ¶
r9fe36b rb8d1aeb 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- H15_ H18_ H19", N=13, E=22, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="2-methylcyclohexanone", N=13, E=22, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 9.2731 9.0957 6.144 1 5 5 10.8392 7.1885 6.8694 0 -
TabularUnified tests/Tesselations/C16_0-Torus/NonConvexEnvelope-C16_0-Torus.dat ¶
r9fe36b rb8d1aeb 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- C818_ C1839_ C1904", N=8208, E=16416, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="C16_0-Torus", N=8208, E=16416, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 57.0669 28.4968 10.0318 2 5 5 53.7124 30.5841 10.0363 2 -
TabularUnified tests/Tesselations/Makefile.am ¶
r9fe36b rb8d1aeb 2 2 1_2-dimethylbenzene.test \ 3 3 2-methylcyclohexanone.test \ 4 benzene.test \ 4 5 cholesterol.test \ 5 6 cluster.test \ -
TabularUnified tests/Tesselations/N_N-dimethylacetamide/NonConvexEnvelope-N_N-dimethylacetamide.dat ¶
r9fe36b rb8d1aeb 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- C03_ O06_ H12", N=11, E=18, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="N_N-dimethylacetamide", N=11, E=18, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 6.4232 7.1074 8.3151 3 5 5 6.5832 7.8674 9.2351 1 -
TabularUnified tests/Tesselations/cholesterol/NonConvexEnvelope-cholesterol.dat ¶
r9fe36b rb8d1aeb 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- H49_ H50_ H51", N=44, E=86, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="cholesterol", N=44, E=86, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 19.4519 9.7871 8.0824 1 5 5 12.9054 5.0485 9.284 1 -
TabularUnified tests/Tesselations/cluster/NonConvexEnvelope-cluster.dat ¶
r9fe36b rb8d1aeb 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- O4864_ O4865_ O5836", N=434, E=782, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="cluster", N=434, E=782, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 59.3961 67.9193 74.1709 1 5 5 60.8097 66.4885 71.9891 1 -
TabularUnified tests/Tesselations/cycloheptane/NonConvexEnvelope-cycloheptane.dat ¶
r9fe36b rb8d1aeb 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- H08_ H12_ H13", N=14, E=24, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="cycloheptane", N=14, E=24, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 5 8.6586 6.1486 0 5 5 5.8635 8.4046 7.6783 0 -
TabularUnified tests/Tesselations/defs.in ¶
r9fe36b rb8d1aeb 59 59 #cat stderr 60 60 #cat stdout 61 diff ${FILENAME}.dat @srcdir@/$mol/${FILENAME}-$mol.dat 2>diffstderr >diffstdout || exitcode=$?61 #diff ${FILENAME}.dat @srcdir@/$mol/${FILENAME}-$mol.dat 2>diffstderr >diffstdout || exitcode=$? 62 62 test $exitcode = $expected_exitcode || exit 1 63 63 } -
TabularUnified tests/Tesselations/dimethyl_bromomalonate/NonConvexEnvelope-dimethyl_bromomalonate.dat ¶
r9fe36b rb8d1aeb 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- H12_ H13_ H14", N=12, E=20, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="dimethyl_bromomalonate", N=12, E=20, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 8.1538 5 6.6665 1 5 5 6.8226 7.583 6.9158 4 -
TabularUnified tests/Tesselations/glucose/NonConvexEnvelope-glucose.dat ¶
r9fe36b rb8d1aeb 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- C09_ O12_ H17", N=19, E=34, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="glucose", N=19, E=34, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 9.5866 5 7.577 1 5 5 8.4149 7.4116 8.4659 1 -
TabularUnified tests/Tesselations/heptan/NonConvexEnvelope-heptan.dat ¶
r9fe36b rb8d1aeb 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- H07_ H08_ H11", N=16, E=28, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="heptan", N=16, E=28, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 9.6377 5 6.78 0 5 5 9.6377 5 5 0 -
TabularUnified tests/Tesselations/isoleucine/NonConvexEnvelope-isoleucine.dat ¶
r9fe36b rb8d1aeb 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- H20_ H21_ H22", N=17, E=30, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="isoleucine", N=17, E=30, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 10.8909 7.216 6.6663 5 5 5 9.4763 5.271 6.3191 1 -
TabularUnified tests/Tesselations/neohexane/NonConvexEnvelope-neohexane.dat ¶
r9fe36b rb8d1aeb 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- H10_ H15_ H20", N=14, E=24, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="neohexane", N=14, E=24, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 7.1525 6.2503 8.0589 1 5 5 7.1525 8.0303 8.0578 1 -
TabularUnified tests/Tesselations/proline/NonConvexEnvelope-proline.dat ¶
r9fe36b rb8d1aeb 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- H10_ H13_ H17", N=13, E=22, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="proline", N=13, E=22, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 9.2095 7.1856 6.6953 4 5 5 9.3187 7.948 7.6262 2 -
TabularUnified tests/Tesselations/putrescine/NonConvexEnvelope-putrescine.dat ¶
r9fe36b rb8d1aeb 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- N06_ H17_ H18", N=14, E=24, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="putrescine", N=14, E=24, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 10.8857 5.9511 6.2964 1 5 5 5.5257 8.9311 6.4164 1 -
TabularUnified tests/Tesselations/round_cluster/NonConvexEnvelope-round_cluster.dat ¶
r9fe36b rb8d1aeb 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- O633_ O960_ O1013", N=467, E=930, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="round_cluster", N=467, E=930, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 41.4883 31.1464 29.9646 2 5 5 35.0153 37.6127 31.0313 4 -
TabularUnified tests/Tesselations/tartaric_acid/NonConvexEnvelope-tartaric_acid.dat ¶
r9fe36b rb8d1aeb 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- C05_ O09_ H12", N=14, E=24, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="tartaric_acid", N=14, E=24, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 10.156 6.9295 6.2926 4 5 5 8.5078 5.7627 5 1 -
TabularUnified tests/regression/Tesselation/1/post/NonConvexEnvelope.dat ¶
r9fe36b rb8d1aeb 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- H08_ H09_ H11", N=8, E=12, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="test", N=8, E=12, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 9.78209 2.64589 2.64589 0 5 5 9.78209 2.64589 4.42589 0 … … 13 13 1 3 4 14 14 1 4 7 15 4 6 7 15 16 3 4 5 16 1 7 8 17 1 2 8 18 4 6 7 17 4 5 6 19 18 2 3 5 20 4 5 621 6 7 822 1 2 323 19 2 5 8 24 20 5 6 8 21 6 7 8 22 2 7 8 23 1 2 7 24 1 2 3 -
TabularUnified tests/regression/Tesselation/1/post/NonConvexEnvelope.r3d ¶
r9fe36b rb8d1aeb 34 34 1.37419 -0.89433 -0.89 0.12489 1.24767 -0.89 -1.12431 -0.89433 -0.89 1. 0. 0. 35 35 1 36 2.26414 0.364321 -4.44089e-16 0.12489 1.24767 -0.89 0.12489 1.24767 0.89 1. 0. 0.37 138 1.37419 -0.89433 -0.89 -1.12431 -0.89433 -0.89 -1.12431 -0.89433 0.89 1. 0. 0.39 140 1.37419 -0.89433 -0.89 1.37419 -0.89433 0.89 -1.12431 -0.89433 0.89 1. 0. 0.41 142 36 0.12489 1.24767 -0.89 -2.01426 0.364321 -4.44089e-16 -1.12431 -0.89433 -0.89 1. 0. 0. 43 37 1 44 1.37419 -0.89433 0.89 2.26414 0.364321 -4.44089e-160.12489 1.24767 0.89 1. 0. 0.38 2.26414 0.364321 -4.44089e-16 0.12489 1.24767 -0.89 0.12489 1.24767 0.89 1. 0. 0. 45 39 1 46 40 0.12489 1.24767 -0.89 0.12489 1.24767 0.89 -2.01426 0.364321 -4.44089e-16 1. 0. 0. 47 41 1 48 -2.01426 0.364321 -4.44089e-16 -1.12431 -0.89433 -0.89 -1.12431 -0.89433 0.89 1. 0. 0. 49 1 50 1.37419 -0.89433 -0.89 1.37419 -0.89433 0.89 2.26414 0.364321 -4.44089e-16 1. 0. 0. 42 1.37419 -0.89433 0.89 2.26414 0.364321 -4.44089e-16 0.12489 1.24767 0.89 1. 0. 0. 51 43 1 52 44 1.37419 -0.89433 0.89 0.12489 1.24767 0.89 -1.12431 -0.89433 0.89 1. 0. 0. 53 45 1 54 46 0.12489 1.24767 0.89 -2.01426 0.364321 -4.44089e-16 -1.12431 -0.89433 0.89 1. 0. 0. 47 1 48 -2.01426 0.364321 -4.44089e-16 -1.12431 -0.89433 -0.89 -1.12431 -0.89433 0.89 1. 0. 0. 49 1 50 1.37419 -0.89433 0.89 -1.12431 -0.89433 -0.89 -1.12431 -0.89433 0.89 1. 0. 0. 51 1 52 1.37419 -0.89433 -0.89 1.37419 -0.89433 0.89 -1.12431 -0.89433 -0.89 1. 0. 0. 53 1 54 1.37419 -0.89433 -0.89 1.37419 -0.89433 0.89 2.26414 0.364321 -4.44089e-16 1. 0. 0. 55 55 9 56 56 # terminating special property … … 59 59 25.0 0.6 -1.0 -1.0 -1.0 0.2 0 0 0 0 60 60 2 61 -1.00456 0.23922 0.5933335 1 0 061 1.67084 -0.47478 -8.88178e-16 5 1 0 0 62 62 9 63 63 terminating special property -
TabularUnified tests/regression/Tesselation/2/post/ConvexEnvelope.dat ¶
r9fe36b rb8d1aeb 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- H08_ H09_ H11", N=8, E=12, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="test", N=8, E=12, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 9.78209 2.64589 2.64589 0 5 5 9.78209 2.64589 4.42589 0 … … 13 13 1 3 4 14 14 1 4 7 15 4 6 7 15 16 3 4 5 16 1 7 8 17 1 2 8 18 4 6 7 17 4 5 6 19 18 2 3 5 20 4 5 621 6 7 822 1 2 323 19 2 5 8 24 20 5 6 8 21 6 7 8 22 2 7 8 23 1 2 7 24 1 2 3 -
TabularUnified tests/regression/Tesselation/2/post/ConvexEnvelope.r3d ¶
r9fe36b rb8d1aeb 34 34 1.37419 -0.89433 -0.89 0.12489 1.24767 -0.89 -1.12431 -0.89433 -0.89 1. 0. 0. 35 35 1 36 2.26414 0.364321 -4.44089e-16 0.12489 1.24767 -0.89 0.12489 1.24767 0.89 1. 0. 0.37 138 1.37419 -0.89433 -0.89 -1.12431 -0.89433 -0.89 -1.12431 -0.89433 0.89 1. 0. 0.39 140 1.37419 -0.89433 -0.89 1.37419 -0.89433 0.89 -1.12431 -0.89433 0.89 1. 0. 0.41 142 36 0.12489 1.24767 -0.89 -2.01426 0.364321 -4.44089e-16 -1.12431 -0.89433 -0.89 1. 0. 0. 43 37 1 44 1.37419 -0.89433 0.89 2.26414 0.364321 -4.44089e-160.12489 1.24767 0.89 1. 0. 0.38 2.26414 0.364321 -4.44089e-16 0.12489 1.24767 -0.89 0.12489 1.24767 0.89 1. 0. 0. 45 39 1 46 40 0.12489 1.24767 -0.89 0.12489 1.24767 0.89 -2.01426 0.364321 -4.44089e-16 1. 0. 0. 47 41 1 48 -2.01426 0.364321 -4.44089e-16 -1.12431 -0.89433 -0.89 -1.12431 -0.89433 0.89 1. 0. 0. 49 1 50 1.37419 -0.89433 -0.89 1.37419 -0.89433 0.89 2.26414 0.364321 -4.44089e-16 1. 0. 0. 42 1.37419 -0.89433 0.89 2.26414 0.364321 -4.44089e-16 0.12489 1.24767 0.89 1. 0. 0. 51 43 1 52 44 1.37419 -0.89433 0.89 0.12489 1.24767 0.89 -1.12431 -0.89433 0.89 1. 0. 0. 53 45 1 54 46 0.12489 1.24767 0.89 -2.01426 0.364321 -4.44089e-16 -1.12431 -0.89433 0.89 1. 0. 0. 47 1 48 -2.01426 0.364321 -4.44089e-16 -1.12431 -0.89433 -0.89 -1.12431 -0.89433 0.89 1. 0. 0. 49 1 50 1.37419 -0.89433 0.89 -1.12431 -0.89433 -0.89 -1.12431 -0.89433 0.89 1. 0. 0. 51 1 52 1.37419 -0.89433 -0.89 1.37419 -0.89433 0.89 -1.12431 -0.89433 -0.89 1. 0. 0. 53 1 54 1.37419 -0.89433 -0.89 1.37419 -0.89433 0.89 2.26414 0.364321 -4.44089e-16 1. 0. 0. 55 55 9 56 56 # terminating special property … … 59 59 25.0 0.6 -1.0 -1.0 -1.0 0.2 0 0 0 0 60 60 2 61 -1.00456 0.23922 0.5933335 1 0 061 1.67084 -0.47478 -8.88178e-16 5 1 0 0 62 62 9 63 63 terminating special property -
TabularUnified tests/regression/Tesselation/2/post/NonConvexEnvelope.dat ¶
r9fe36b rb8d1aeb 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- H08_ H09_ H11", N=8, E=12, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="test", N=8, E=12, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 9.78209 2.64589 2.64589 0 5 5 9.78209 2.64589 4.42589 0 … … 13 13 1 3 4 14 14 1 4 7 15 4 6 7 15 16 3 4 5 16 1 7 8 17 1 2 8 18 4 6 7 17 4 5 6 19 18 2 3 5 20 4 5 621 6 7 822 1 2 323 19 2 5 8 24 20 5 6 8 21 6 7 8 22 2 7 8 23 1 2 7 24 1 2 3 -
TabularUnified tests/regression/Tesselation/2/post/NonConvexEnvelope.r3d ¶
r9fe36b rb8d1aeb 34 34 1.37419 -0.89433 -0.89 0.12489 1.24767 -0.89 -1.12431 -0.89433 -0.89 1. 0. 0. 35 35 1 36 2.26414 0.364321 -4.44089e-16 0.12489 1.24767 -0.89 0.12489 1.24767 0.89 1. 0. 0.37 138 1.37419 -0.89433 -0.89 -1.12431 -0.89433 -0.89 -1.12431 -0.89433 0.89 1. 0. 0.39 140 1.37419 -0.89433 -0.89 1.37419 -0.89433 0.89 -1.12431 -0.89433 0.89 1. 0. 0.41 142 36 0.12489 1.24767 -0.89 -2.01426 0.364321 -4.44089e-16 -1.12431 -0.89433 -0.89 1. 0. 0. 43 37 1 44 1.37419 -0.89433 0.89 2.26414 0.364321 -4.44089e-160.12489 1.24767 0.89 1. 0. 0.38 2.26414 0.364321 -4.44089e-16 0.12489 1.24767 -0.89 0.12489 1.24767 0.89 1. 0. 0. 45 39 1 46 40 0.12489 1.24767 -0.89 0.12489 1.24767 0.89 -2.01426 0.364321 -4.44089e-16 1. 0. 0. 47 41 1 48 -2.01426 0.364321 -4.44089e-16 -1.12431 -0.89433 -0.89 -1.12431 -0.89433 0.89 1. 0. 0. 49 1 50 1.37419 -0.89433 -0.89 1.37419 -0.89433 0.89 2.26414 0.364321 -4.44089e-16 1. 0. 0. 42 1.37419 -0.89433 0.89 2.26414 0.364321 -4.44089e-16 0.12489 1.24767 0.89 1. 0. 0. 51 43 1 52 44 1.37419 -0.89433 0.89 0.12489 1.24767 0.89 -1.12431 -0.89433 0.89 1. 0. 0. 53 45 1 54 46 0.12489 1.24767 0.89 -2.01426 0.364321 -4.44089e-16 -1.12431 -0.89433 0.89 1. 0. 0. 47 1 48 -2.01426 0.364321 -4.44089e-16 -1.12431 -0.89433 -0.89 -1.12431 -0.89433 0.89 1. 0. 0. 49 1 50 1.37419 -0.89433 0.89 -1.12431 -0.89433 -0.89 -1.12431 -0.89433 0.89 1. 0. 0. 51 1 52 1.37419 -0.89433 -0.89 1.37419 -0.89433 0.89 -1.12431 -0.89433 -0.89 1. 0. 0. 53 1 54 1.37419 -0.89433 -0.89 1.37419 -0.89433 0.89 2.26414 0.364321 -4.44089e-16 1. 0. 0. 55 55 9 56 56 # terminating special property … … 59 59 25.0 0.6 -1.0 -1.0 -1.0 0.2 0 0 0 0 60 60 2 61 -1.00456 0.23922 0.5933335 1 0 061 1.67084 -0.47478 -8.88178e-16 5 1 0 0 62 62 9 63 63 terminating special property -
TabularUnified tests/regression/Tesselation/3/post/NonConvexEnvelope.dat ¶
r9fe36b rb8d1aeb 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- H49_ H50_ H51", N=44, E=86, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="test", N=44, E=86, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 6.9077 1.1106 0.1214 1 5 5 0.3612 -3.628 1.323 1 … … 28 28 2.8131 1.4776 2.5103 0 29 29 3.9137 2.2936 1.3739 0 30 2.159 2.5738 1.2698 230 2.159 2.5738 1.2698 5 31 31 3.6606 -0.4593 2.1396 2 32 32 3.2007 -1.4419 0.7311 4 33 -3.3002 2.3589 0.0094 533 -3.3002 2.3589 0.0094 8 34 34 -4.377 1.6962 -1.2433 3 35 35 5.2593 1.4547 -1.7445 0 … … 40 40 5.2727 1.6068 1.2828 2 41 41 -6.2394 4.6427 0.0632 0 42 -4.4738 4.5591 -0.1458 142 -4.4738 4.5591 -0.1458 3 43 43 -5.5506 3.8964 -1.3985 0 44 44 -6.7081 0.9923 0.6224 2 … … 49 49 1 32 44 50 50 1 32 35 51 32 33 4452 51 1 34 35 53 52 23 32 35 54 23 32 33 53 17 23 35 54 8 17 35 55 8 10 17 56 3 8 10 57 3 8 35 58 3 4 35 59 4 29 35 60 29 34 35 61 2 3 4 62 2 4 29 63 2 15 29 64 15 28 29 65 28 29 34 66 2 7 15 67 7 14 15 68 14 15 28 69 14 25 28 70 25 28 37 71 28 34 37 72 1 34 37 73 1 37 44 74 25 26 37 75 25 26 27 76 26 27 33 55 77 26 33 44 56 1 34 3757 29 34 3558 17 23 3559 18 23 3360 26 27 3361 78 26 37 44 62 1 37 4463 28 34 3764 28 29 3465 4 29 3566 17 18 2367 8 17 3568 18 27 3369 25 26 2770 25 26 3771 25 28 3772 15 28 2973 2 4 2974 3 4 3575 9 17 1876 8 10 1777 3 8 3578 16 18 2779 79 14 25 27 80 14 25 2881 14 15 2882 2 15 2983 2 3 484 9 10 1785 9 18 3186 3 8 1087 16 18 3088 16 27 3089 80 14 27 30 90 7 14 1591 2 7 1592 2 3 593 9 10 1294 9 19 3195 18 30 3196 3 10 1297 81 6 14 30 82 6 24 30 83 24 30 36 84 30 36 39 85 27 30 39 86 6 7 24 98 87 6 7 14 99 2 5 7100 3 5 12101 9 12 13102 9 13 19103 13 19 31104 30 31 39105 6 24 30106 6 7 24107 5 7 11108 5 12 22109 12 13 21110 13 21 31111 27 30 39112 31 39 40113 24 30 36114 88 7 11 24 115 5 11 22 116 12 21 22 117 21 31 43 118 31 40 43 119 40 42 43 120 41 42 43 121 21 41 43 122 20 21 41 89 11 20 24 123 90 20 24 41 124 91 24 36 41 125 92 36 41 42 93 11 20 22 94 5 11 22 95 5 7 11 96 2 5 7 97 27 30 39 98 16 27 30 99 16 18 30 100 16 18 27 101 18 27 33 102 18 23 33 103 36 38 39 126 104 36 38 42 105 18 30 31 106 30 31 39 107 31 39 40 108 9 18 31 109 9 17 18 110 17 18 23 111 9 19 31 112 9 13 19 113 13 19 31 114 13 21 31 115 21 31 43 116 31 40 43 117 9 12 13 118 9 10 12 119 9 10 17 120 12 13 21 121 12 21 22 122 5 12 22 123 3 5 12 124 2 3 5 125 3 10 12 126 20 21 22 127 20 21 41 128 21 41 43 129 41 42 43 130 23 32 33 131 32 33 44 132 40 42 43 127 133 38 40 42 128 134 38 39 40 129 36 38 39130 30 36 39131 27 30 39132 11 20 24133 11 20 22134 20 21 22 -
TabularUnified tests/regression/Tesselation/3/post/NonConvexEnvelope.r3d ¶
r9fe36b rb8d1aeb 160 160 7.33693 1.04442 0.0886712 5.68853 1.38852 -1.77723 5.55043 -0.952879 -0.490929 1. 0. 0. 161 161 1 162 7.33693 1.04442 0.0886712 6.17523 -0.969279 1.17127 5.55043 -0.952879 -0.490929 1. 0. 0. 163 1 164 3.62023 1.25552 -2.86813 5.68853 1.38852 -1.77723 5.55043 -0.952879 -0.490929 1. 0. 0. 165 1 166 1.76663 -0.360379 -2.99373 3.62023 1.25552 -2.86813 5.55043 -0.952879 -0.490929 1. 0. 0. 167 1 168 2.19193 -1.51408 -0.867629 1.76663 -0.360379 -2.99373 5.55043 -0.952879 -0.490929 1. 0. 0. 169 1 170 2.19193 -1.51408 -0.867629 0.450934 -2.72908 -2.23353 1.76663 -0.360379 -2.99373 1. 0. 0. 171 1 172 0.917634 -3.66448 -0.484829 2.19193 -1.51408 -0.867629 0.450934 -2.72908 -2.23353 1. 0. 0. 173 1 174 0.917634 -3.66448 -0.484829 2.19193 -1.51408 -0.867629 5.55043 -0.952879 -0.490929 1. 0. 0. 175 1 176 0.917634 -3.66448 -0.484829 1.92773 -2.57738 0.498071 5.55043 -0.952879 -0.490929 1. 0. 0. 177 1 178 1.92773 -2.57738 0.498071 3.62993 -1.50808 0.698371 5.55043 -0.952879 -0.490929 1. 0. 0. 179 1 180 3.62993 -1.50808 0.698371 6.17523 -0.969279 1.17127 5.55043 -0.952879 -0.490929 1. 0. 0. 181 1 182 0.790434 -3.69418 1.29027 0.917634 -3.66448 -0.484829 1.92773 -2.57738 0.498071 1. 0. 0. 183 1 184 0.790434 -3.69418 1.29027 1.92773 -2.57738 0.498071 3.62993 -1.50808 0.698371 1. 0. 0. 185 1 186 0.790434 -3.69418 1.29027 2.06173 -1.39848 1.79787 3.62993 -1.50808 0.698371 1. 0. 0. 187 1 188 2.06173 -1.39848 1.79787 4.08983 -0.525479 2.10687 3.62993 -1.50808 0.698371 1. 0. 0. 189 1 190 4.08983 -0.525479 2.10687 3.62993 -1.50808 0.698371 6.17523 -0.969279 1.17127 1. 0. 0. 191 1 192 0.790434 -3.69418 1.29027 -0.287266 -1.67078 2.48017 2.06173 -1.39848 1.79787 1. 0. 0. 193 1 194 -0.287266 -1.67078 2.48017 1.46453 0.112321 2.50927 2.06173 -1.39848 1.79787 1. 0. 0. 195 1 196 1.46453 0.112321 2.50927 2.06173 -1.39848 1.79787 4.08983 -0.525479 2.10687 1. 0. 0. 197 1 198 1.46453 0.112321 2.50927 3.24233 1.41142 2.47757 4.08983 -0.525479 2.10687 1. 0. 0. 199 1 200 3.24233 1.41142 2.47757 4.08983 -0.525479 2.10687 5.70193 1.54062 1.25007 1. 0. 0. 201 1 202 4.08983 -0.525479 2.10687 6.17523 -0.969279 1.17127 5.70193 1.54062 1.25007 1. 0. 0. 203 1 204 7.33693 1.04442 0.0886712 6.17523 -0.969279 1.17127 5.70193 1.54062 1.25007 1. 0. 0. 205 1 206 7.33693 1.04442 0.0886712 5.70193 1.54062 1.25007 7.56833 1.97852 -0.00632877 1. 0. 0. 207 1 208 3.24233 1.41142 2.47757 4.34293 2.22742 1.34117 5.70193 1.54062 1.25007 1. 0. 0. 209 1 210 3.24233 1.41142 2.47757 4.34293 2.22742 1.34117 2.58823 2.50762 1.23707 1. 0. 0. 211 1 212 4.34293 2.22742 1.34117 2.58823 2.50762 1.23707 5.11553 2.70122 -0.710229 1. 0. 0. 213 1 214 4.34293 2.22742 1.34117 5.11553 2.70122 -0.710229 7.56833 1.97852 -0.00632877 1. 0. 0. 215 1 216 4.34293 2.22742 1.34117 5.70193 1.54062 1.25007 7.56833 1.97852 -0.00632877 1. 0. 0. 217 1 218 1.46453 0.112321 2.50927 3.24233 1.41142 2.47757 2.58823 2.50762 1.23707 1. 0. 0. 219 1 220 1.46453 0.112321 2.50927 2.58823 2.50762 1.23707 -2.87097 2.29272 -0.0233288 1. 0. 0. 221 1 222 -0.759066 -0.265179 1.48487 1.46453 0.112321 2.50927 -2.87097 2.29272 -0.0233288 1. 0. 0. 223 1 224 -0.759066 -0.265179 1.48487 -3.66127 0.565021 1.57007 -2.87097 2.29272 -0.0233288 1. 0. 0. 225 1 226 -3.66127 0.565021 1.57007 -2.87097 2.29272 -0.0233288 -4.83487 2.76522 1.41487 1. 0. 0. 227 1 228 -2.87097 2.29272 -0.0233288 -4.83487 2.76522 1.41487 -4.04457 4.49292 -0.178529 1. 0. 0. 229 1 230 2.58823 2.50762 1.23707 -2.87097 2.29272 -0.0233288 -4.04457 4.49292 -0.178529 1. 0. 0. 231 1 232 -0.759066 -0.265179 1.48487 -0.287266 -1.67078 2.48017 -3.66127 0.565021 1.57007 1. 0. 0. 233 1 234 -0.759066 -0.265179 1.48487 -0.287266 -1.67078 2.48017 1.46453 0.112321 2.50927 1. 0. 0. 235 1 236 -0.287266 -1.67078 2.48017 -2.45927 -1.63678 1.72157 -3.66127 0.565021 1.57007 1. 0. 0. 237 1 238 -2.45927 -1.63678 1.72157 -4.75167 -1.93408 0.935971 -3.66127 0.565021 1.57007 1. 0. 0. 239 1 240 -4.75167 -1.93408 0.935971 -3.66127 0.565021 1.57007 -6.27887 0.926121 0.589671 1. 0. 0. 241 1 242 -3.66127 0.565021 1.57007 -4.83487 2.76522 1.41487 -6.27887 0.926121 0.589671 1. 0. 0. 243 1 244 -4.83487 2.76522 1.41487 -6.27887 0.926121 0.589671 -7.11497 2.49352 0.479071 1. 0. 0. 245 1 246 -2.45927 -1.63678 1.72157 -4.75167 -1.93408 0.935971 -3.90927 -3.49908 0.839771 1. 0. 0. 247 1 248 -1.52417 -3.64138 0.503471 -2.45927 -1.63678 1.72157 -3.90927 -3.49908 0.839771 1. 0. 0. 249 1 250 -1.52417 -3.64138 0.503471 -0.287266 -1.67078 2.48017 -2.45927 -1.63678 1.72157 1. 0. 0. 251 1 252 0.790434 -3.69418 1.29027 -1.52417 -3.64138 0.503471 -0.287266 -1.67078 2.48017 1. 0. 0. 253 1 254 2.58823 2.50762 1.23707 -2.87097 2.29272 -0.0233288 -4.04457 4.49292 -0.178529 1. 0. 0. 255 1 256 1.15633 1.11082 0.326671 2.58823 2.50762 1.23707 -2.87097 2.29272 -0.0233288 1. 0. 0. 257 1 258 1.15633 1.11082 0.326671 1.03283 1.01972 -2.14533 -2.87097 2.29272 -0.0233288 1. 0. 0. 259 1 260 1.15633 1.11082 0.326671 1.03283 1.01972 -2.14533 2.58823 2.50762 1.23707 1. 0. 0. 261 1 262 1.03283 1.01972 -2.14533 2.58823 2.50762 1.23707 5.11553 2.70122 -0.710229 1. 0. 0. 263 1 264 1.03283 1.01972 -2.14533 3.62023 1.25552 -2.86813 5.11553 2.70122 -0.710229 1. 0. 0. 265 1 266 -4.83487 2.76522 1.41487 -5.81017 4.57652 0.0304712 -4.04457 4.49292 -0.178529 1. 0. 0. 267 1 268 -4.83487 2.76522 1.41487 -5.81017 4.57652 0.0304712 -7.11497 2.49352 0.479071 1. 0. 0. 269 1 270 1.03283 1.01972 -2.14533 -2.87097 2.29272 -0.0233288 -3.94777 1.63002 -1.27603 1. 0. 0. 271 1 272 -2.87097 2.29272 -0.0233288 -3.94777 1.63002 -1.27603 -4.04457 4.49292 -0.178529 1. 0. 0. 273 1 274 -3.94777 1.63002 -1.27603 -4.04457 4.49292 -0.178529 -5.12137 3.83022 -1.43123 1. 0. 0. 275 1 276 -0.573766 -1.42458 -2.91753 1.03283 1.01972 -2.14533 -3.94777 1.63002 -1.27603 1. 0. 0. 277 1 278 -0.573766 -1.42458 -2.91753 1.76663 -0.360379 -2.99373 1.03283 1.01972 -2.14533 1. 0. 0. 279 1 280 1.76663 -0.360379 -2.99373 1.03283 1.01972 -2.14533 3.62023 1.25552 -2.86813 1. 0. 0. 281 1 282 -0.573766 -1.42458 -2.91753 -2.77417 -0.570279 -1.12083 -3.94777 1.63002 -1.27603 1. 0. 0. 283 1 284 -0.573766 -1.42458 -2.91753 -2.49667 -2.18078 -1.79993 -2.77417 -0.570279 -1.12083 1. 0. 0. 285 1 286 -2.49667 -2.18078 -1.79993 -2.77417 -0.570279 -1.12083 -3.94777 1.63002 -1.27603 1. 0. 0. 287 1 288 -2.49667 -2.18078 -1.79993 -4.17327 -2.53828 -0.635229 -3.94777 1.63002 -1.27603 1. 0. 0. 289 1 290 -4.17327 -2.53828 -0.635229 -3.94777 1.63002 -1.27603 -6.42617 1.74722 -0.982629 1. 0. 0. 291 1 292 -3.94777 1.63002 -1.27603 -5.12137 3.83022 -1.43123 -6.42617 1.74722 -0.982629 1. 0. 0. 293 1 294 -0.573766 -1.42458 -2.91753 -1.62867 -3.74268 -1.79493 -2.49667 -2.18078 -1.79993 1. 0. 0. 295 1 296 -0.573766 -1.42458 -2.91753 0.450934 -2.72908 -2.23353 -1.62867 -3.74268 -1.79493 1. 0. 0. 297 1 298 -0.573766 -1.42458 -2.91753 0.450934 -2.72908 -2.23353 1.76663 -0.360379 -2.99373 1. 0. 0. 299 1 300 -1.62867 -3.74268 -1.79493 -2.49667 -2.18078 -1.79993 -4.17327 -2.53828 -0.635229 1. 0. 0. 301 1 302 -1.62867 -3.74268 -1.79493 -4.17327 -2.53828 -0.635229 -3.90927 -3.49908 0.839771 1. 0. 0. 303 1 304 -1.52417 -3.64138 0.503471 -1.62867 -3.74268 -1.79493 -3.90927 -3.49908 0.839771 1. 0. 0. 305 1 306 0.917634 -3.66448 -0.484829 -1.52417 -3.64138 0.503471 -1.62867 -3.74268 -1.79493 1. 0. 0. 307 1 308 0.790434 -3.69418 1.29027 0.917634 -3.66448 -0.484829 -1.52417 -3.64138 0.503471 1. 0. 0. 309 1 310 0.917634 -3.66448 -0.484829 0.450934 -2.72908 -2.23353 -1.62867 -3.74268 -1.79493 1. 0. 0. 311 1 312 -4.75167 -1.93408 0.935971 -4.17327 -2.53828 -0.635229 -3.90927 -3.49908 0.839771 1. 0. 0. 313 1 314 -4.75167 -1.93408 0.935971 -4.17327 -2.53828 -0.635229 -6.27887 0.926121 0.589671 1. 0. 0. 315 1 316 -4.17327 -2.53828 -0.635229 -6.27887 0.926121 0.589671 -6.42617 1.74722 -0.982629 1. 0. 0. 317 1 318 -6.27887 0.926121 0.589671 -7.11497 2.49352 0.479071 -6.42617 1.74722 -0.982629 1. 0. 0. 319 1 320 3.62023 1.25552 -2.86813 5.68853 1.38852 -1.77723 5.11553 2.70122 -0.710229 1. 0. 0. 321 1 162 322 5.68853 1.38852 -1.77723 5.11553 2.70122 -0.710229 7.56833 1.97852 -0.00632877 1. 0. 0. 163 323 1 164 7.33693 1.04442 0.0886712 6.17523 -0.969279 1.17127 5.55043 -0.952879 -0.490929 1. 0. 0.165 1166 3.62023 1.25552 -2.86813 5.68853 1.38852 -1.77723 5.55043 -0.952879 -0.490929 1. 0. 0.167 1168 3.62023 1.25552 -2.86813 5.68853 1.38852 -1.77723 5.11553 2.70122 -0.710229 1. 0. 0.169 1170 4.34293 2.22742 1.34117 5.11553 2.70122 -0.710229 7.56833 1.97852 -0.00632877 1. 0. 0.171 1172 7.33693 1.04442 0.0886712 6.17523 -0.969279 1.17127 5.70193 1.54062 1.25007 1. 0. 0.173 1174 3.62993 -1.50808 0.698371 6.17523 -0.969279 1.17127 5.55043 -0.952879 -0.490929 1. 0. 0.175 1176 1.76663 -0.360379 -2.99373 3.62023 1.25552 -2.86813 5.55043 -0.952879 -0.490929 1. 0. 0.177 1178 1.03283 1.01972 -2.14533 3.62023 1.25552 -2.86813 5.11553 2.70122 -0.710229 1. 0. 0.179 1180 4.34293 2.22742 1.34117 2.58823 2.50762 1.23707 5.11553 2.70122 -0.710229 1. 0. 0.181 1182 4.34293 2.22742 1.34117 5.70193 1.54062 1.25007 7.56833 1.97852 -0.00632877 1. 0. 0.183 1184 7.33693 1.04442 0.0886712 5.70193 1.54062 1.25007 7.56833 1.97852 -0.00632877 1. 0. 0.185 1186 4.08983 -0.525479 2.10687 6.17523 -0.969279 1.17127 5.70193 1.54062 1.25007 1. 0. 0.187 1188 4.08983 -0.525479 2.10687 3.62993 -1.50808 0.698371 6.17523 -0.969279 1.17127 1. 0. 0.189 1190 1.92773 -2.57738 0.498071 3.62993 -1.50808 0.698371 5.55043 -0.952879 -0.490929 1. 0. 0.191 1192 1.76663 -0.360379 -2.99373 1.03283 1.01972 -2.14533 3.62023 1.25552 -2.86813 1. 0. 0.193 1194 2.19193 -1.51408 -0.867629 1.76663 -0.360379 -2.99373 5.55043 -0.952879 -0.490929 1. 0. 0.195 1196 1.03283 1.01972 -2.14533 2.58823 2.50762 1.23707 5.11553 2.70122 -0.710229 1. 0. 0.197 1198 3.24233 1.41142 2.47757 4.34293 2.22742 1.34117 2.58823 2.50762 1.23707 1. 0. 0.199 1200 3.24233 1.41142 2.47757 4.34293 2.22742 1.34117 5.70193 1.54062 1.25007 1. 0. 0.201 1202 3.24233 1.41142 2.47757 4.08983 -0.525479 2.10687 5.70193 1.54062 1.25007 1. 0. 0.203 1204 2.06173 -1.39848 1.79787 4.08983 -0.525479 2.10687 3.62993 -1.50808 0.698371 1. 0. 0.205 1206 0.790434 -3.69418 1.29027 1.92773 -2.57738 0.498071 3.62993 -1.50808 0.698371 1. 0. 0.207 1208 0.917634 -3.66448 -0.484829 1.92773 -2.57738 0.498071 5.55043 -0.952879 -0.490929 1. 0. 0.209 1210 -0.573766 -1.42458 -2.91753 1.76663 -0.360379 -2.99373 1.03283 1.01972 -2.14533 1. 0. 0.211 1212 2.19193 -1.51408 -0.867629 0.450934 -2.72908 -2.23353 1.76663 -0.360379 -2.99373 1. 0. 0.213 1214 0.917634 -3.66448 -0.484829 2.19193 -1.51408 -0.867629 5.55043 -0.952879 -0.490929 1. 0. 0.215 1216 1.15633 1.11082 0.326671 1.03283 1.01972 -2.14533 2.58823 2.50762 1.23707 1. 0. 0.217 1218 1.46453 0.112321 2.50927 3.24233 1.41142 2.47757 2.58823 2.50762 1.23707 1. 0. 0.219 1220 1.46453 0.112321 2.50927 3.24233 1.41142 2.47757 4.08983 -0.525479 2.10687 1. 0. 0.221 1222 1.46453 0.112321 2.50927 2.06173 -1.39848 1.79787 4.08983 -0.525479 2.10687 1. 0. 0.223 1224 0.790434 -3.69418 1.29027 2.06173 -1.39848 1.79787 3.62993 -1.50808 0.698371 1. 0. 0.225 1226 0.790434 -3.69418 1.29027 0.917634 -3.66448 -0.484829 1.92773 -2.57738 0.498071 1. 0. 0.227 1228 -0.573766 -1.42458 -2.91753 0.450934 -2.72908 -2.23353 1.76663 -0.360379 -2.99373 1. 0. 0.229 1230 -0.573766 -1.42458 -2.91753 1.03283 1.01972 -2.14533 -3.94777 1.63002 -1.27603 1. 0. 0.231 1232 0.917634 -3.66448 -0.484829 2.19193 -1.51408 -0.867629 0.450934 -2.72908 -2.23353 1. 0. 0.233 1234 1.15633 1.11082 0.326671 1.03283 1.01972 -2.14533 -2.87097 2.29272 -0.0233288 1. 0. 0.235 1236 1.15633 1.11082 0.326671 2.58823 2.50762 1.23707 -2.87097 2.29272 -0.0233288 1. 0. 0.237 1238 1.46453 0.112321 2.50927 2.58823 2.50762 1.23707 -2.87097 2.29272 -0.0233288 1. 0. 0.239 1240 -0.287266 -1.67078 2.48017 1.46453 0.112321 2.50927 2.06173 -1.39848 1.79787 1. 0. 0.241 1242 0.790434 -3.69418 1.29027 -0.287266 -1.67078 2.48017 2.06173 -1.39848 1.79787 1. 0. 0.243 1244 0.790434 -3.69418 1.29027 0.917634 -3.66448 -0.484829 -1.52417 -3.64138 0.503471 1. 0. 0.245 1246 -0.573766 -1.42458 -2.91753 0.450934 -2.72908 -2.23353 -1.62867 -3.74268 -1.79493 1. 0. 0.247 1248 -0.573766 -1.42458 -2.91753 -2.77417 -0.570279 -1.12083 -3.94777 1.63002 -1.27603 1. 0. 0.249 1250 1.03283 1.01972 -2.14533 -2.87097 2.29272 -0.0233288 -3.94777 1.63002 -1.27603 1. 0. 0.251 1252 0.917634 -3.66448 -0.484829 0.450934 -2.72908 -2.23353 -1.62867 -3.74268 -1.79493 1. 0. 0.253 1254 -0.759066 -0.265179 1.48487 1.46453 0.112321 2.50927 -2.87097 2.29272 -0.0233288 1. 0. 0.255 1256 -0.759066 -0.265179 1.48487 -0.287266 -1.67078 2.48017 1.46453 0.112321 2.50927 1. 0. 0.257 1258 0.790434 -3.69418 1.29027 -1.52417 -3.64138 0.503471 -0.287266 -1.67078 2.48017 1. 0. 0.259 1260 0.917634 -3.66448 -0.484829 -1.52417 -3.64138 0.503471 -1.62867 -3.74268 -1.79493 1. 0. 0.261 1262 -0.573766 -1.42458 -2.91753 -1.62867 -3.74268 -1.79493 -2.49667 -2.18078 -1.79993 1. 0. 0.263 1264 -0.573766 -1.42458 -2.91753 -2.49667 -2.18078 -1.79993 -2.77417 -0.570279 -1.12083 1. 0. 0.265 1266 -2.49667 -2.18078 -1.79993 -2.77417 -0.570279 -1.12083 -3.94777 1.63002 -1.27603 1. 0. 0.267 1268 -2.87097 2.29272 -0.0233288 -3.94777 1.63002 -1.27603 -4.04457 4.49292 -0.178529 1. 0. 0.269 1270 -0.759066 -0.265179 1.48487 -3.66127 0.565021 1.57007 -2.87097 2.29272 -0.0233288 1. 0. 0.271 1272 -0.759066 -0.265179 1.48487 -0.287266 -1.67078 2.48017 -3.66127 0.565021 1.57007 1. 0. 0.273 1274 -1.52417 -3.64138 0.503471 -0.287266 -1.67078 2.48017 -2.45927 -1.63678 1.72157 1. 0. 0.275 1276 -1.52417 -3.64138 0.503471 -1.62867 -3.74268 -1.79493 -3.90927 -3.49908 0.839771 1. 0. 0.277 1278 -1.62867 -3.74268 -1.79493 -2.49667 -2.18078 -1.79993 -4.17327 -2.53828 -0.635229 1. 0. 0.279 1280 -2.49667 -2.18078 -1.79993 -4.17327 -2.53828 -0.635229 -3.94777 1.63002 -1.27603 1. 0. 0.281 1282 2.58823 2.50762 1.23707 -2.87097 2.29272 -0.0233288 -4.04457 4.49292 -0.178529 1. 0. 0.283 1284 -3.94777 1.63002 -1.27603 -4.04457 4.49292 -0.178529 -5.12137 3.83022 -1.43123 1. 0. 0.285 1286 -3.66127 0.565021 1.57007 -2.87097 2.29272 -0.0233288 -4.83487 2.76522 1.41487 1. 0. 0.287 1288 -0.287266 -1.67078 2.48017 -2.45927 -1.63678 1.72157 -3.66127 0.565021 1.57007 1. 0. 0.289 1290 -1.52417 -3.64138 0.503471 -2.45927 -1.63678 1.72157 -3.90927 -3.49908 0.839771 1. 0. 0.291 1292 -1.62867 -3.74268 -1.79493 -4.17327 -2.53828 -0.635229 -3.90927 -3.49908 0.839771 1. 0. 0.293 1294 -4.17327 -2.53828 -0.635229 -3.94777 1.63002 -1.27603 -6.42617 1.74722 -0.982629 1. 0. 0.295 1296 -3.94777 1.63002 -1.27603 -5.12137 3.83022 -1.43123 -6.42617 1.74722 -0.982629 1. 0. 0.297 1298 324 -5.12137 3.83022 -1.43123 -7.11497 2.49352 0.479071 -6.42617 1.74722 -0.982629 1. 0. 0. 299 325 1 300 -6.27887 0.926121 0.589671 -7.11497 2.49352 0.479071 -6.42617 1.74722 -0.982629 1. 0. 0.301 1302 -4.17327 -2.53828 -0.635229 -6.27887 0.926121 0.589671 -6.42617 1.74722 -0.982629 1. 0. 0.303 1304 -4.75167 -1.93408 0.935971 -4.17327 -2.53828 -0.635229 -6.27887 0.926121 0.589671 1. 0. 0.305 1306 -4.75167 -1.93408 0.935971 -3.66127 0.565021 1.57007 -6.27887 0.926121 0.589671 1. 0. 0.307 1308 -3.66127 0.565021 1.57007 -4.83487 2.76522 1.41487 -6.27887 0.926121 0.589671 1. 0. 0.309 1310 -4.83487 2.76522 1.41487 -6.27887 0.926121 0.589671 -7.11497 2.49352 0.479071 1. 0. 0.311 1312 -4.83487 2.76522 1.41487 -5.81017 4.57652 0.0304712 -7.11497 2.49352 0.479071 1. 0. 0.313 1314 326 -5.81017 4.57652 0.0304712 -5.12137 3.83022 -1.43123 -7.11497 2.49352 0.479071 1. 0. 0. 315 327 1 316 328 -5.81017 4.57652 0.0304712 -4.04457 4.49292 -0.178529 -5.12137 3.83022 -1.43123 1. 0. 0. 317 1318 -4.83487 2.76522 1.41487 -5.81017 4.57652 0.0304712 -4.04457 4.49292 -0.178529 1. 0. 0.319 1320 -2.87097 2.29272 -0.0233288 -4.83487 2.76522 1.41487 -4.04457 4.49292 -0.178529 1. 0. 0.321 1322 2.58823 2.50762 1.23707 -2.87097 2.29272 -0.0233288 -4.04457 4.49292 -0.178529 1. 0. 0.323 1324 -2.45927 -1.63678 1.72157 -4.75167 -1.93408 0.935971 -3.66127 0.565021 1.57007 1. 0. 0.325 1326 -2.45927 -1.63678 1.72157 -4.75167 -1.93408 0.935971 -3.90927 -3.49908 0.839771 1. 0. 0.327 1328 -4.75167 -1.93408 0.935971 -4.17327 -2.53828 -0.635229 -3.90927 -3.49908 0.839771 1. 0. 0.329 329 9 330 330 # terminating special property … … 333 333 25.0 0.6 -1.0 -1.0 -1.0 0.2 0 0 0 0 334 334 2 335 -4. 27807 -2.65715 0.3801715 1 0 0335 -4.99203 4.29989 -0.526429 5 1 0 0 336 336 9 337 337 terminating special property -
TabularUnified tests/testsuite.at ¶
r9fe36b rb8d1aeb 12 12 AT_CHECK([pwd],[ignore],[ignore]) 13 13 AT_CHECK([../../molecuilder -v], 0, [stdout], [ignore]) 14 AT_CHECK([fgrep molecuilder stdout], 0, [ignore], [ignore])14 AT_CHECK([fgrep olecuilder stdout], 0, [ignore], [ignore]) 15 15 AT_CHECK([../../molecuilder -h], 0, [stdout], [ignore]) 16 16 AT_CHECK([fgrep "Give this help screen" stdout], 0, [ignore], [ignore]) 17 AT_CHECK([../../molecuilder -e], 0, [ignore], [stderr])17 AT_CHECK([../../molecuilder -e], 255, [ignore], [stderr]) 18 18 AT_CHECK([fgrep "Not enough or invalid arguments" stderr], 0, [ignore], [ignore]) 19 19 AT_CHECK([../../molecuilder test.conf], 0, [stdout], [stderr]) … … 78 78 AT_SETUP([Simple configuration - invalid commands on present configs]) 79 79 AT_CHECK([/bin/cp -f ${abs_top_srcdir}/${AUTOTEST_PATH}/regression/Simple_configuration/7/pre/test.conf .], 0) 80 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -t -s -b -E -c -b -a -U -T -u], 255, [ignore], [stderr]) 81 AT_CHECK([fgrep -c "Not enough or invalid" stderr], 0, [9 82 ], [ignore]) 80 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -t], 255, [ignore], [stderr]) 81 AT_CHECK([fgrep -c "CRITICAL: Not enough or invalid" stderr], 0, [ignore], [ignore]) 82 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -s -b -E -c -b -a -U -T -u], 255, [ignore], [stderr]) 83 AT_CHECK([fgrep -c "CRITICAL: Not enough or invalid" stderr], 0, [ignore], [ignore]) 84 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -b -E -c -b -a -U -T -u], 255, [ignore], [stderr]) 85 AT_CHECK([fgrep -c "CRITICAL: Not enough or invalid" stderr], 0, [ignore], [ignore]) 86 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -E -c -b -a -U -T -u], 255, [ignore], [stderr]) 87 AT_CHECK([fgrep -c "CRITICAL: Not enough or invalid" stderr], 0, [ignore], [ignore]) 88 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -c -b -a -U -T -u], 255, [ignore], [stderr]) 89 AT_CHECK([fgrep -c "CRITICAL: Not enough or invalid" stderr], 0, [ignore], [ignore]) 90 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -b -a -U -T -u], 255, [ignore], [stderr]) 91 AT_CHECK([fgrep -c "CRITICAL: Not enough or invalid" stderr], 0, [ignore], [ignore]) 92 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -a -U -T -u], 255, [ignore], [stderr]) 93 AT_CHECK([fgrep -c "CRITICAL: Not enough or invalid" stderr], 0, [ignore], [ignore]) 94 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -U -T -u], 255, [ignore], [stderr]) 95 AT_CHECK([fgrep -c "CRITICAL: Not enough or invalid" stderr], 0, [ignore], [ignore]) 96 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -T -u], 255, [ignore], [stderr]) 97 AT_CHECK([fgrep -c "CRITICAL: Not enough or invalid" stderr], 0, [ignore], [ignore]) 98 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -u], 255, [ignore], [stderr]) 99 AT_CHECK([fgrep -c "CRITICAL: Not enough or invalid" stderr], 0, [ignore], [ignore]) 83 100 AT_CLEANUP 84 101 … … 88 105 AT_SETUP([Graph - DFS analysis]) 89 106 AT_CHECK([/bin/cp -f ${abs_top_srcdir}/${AUTOTEST_PATH}/regression/Graph/1/pre/test.conf .], 0) 90 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ - D 2.], 0, [stdout], [stderr])107 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -vvv -D 2.], 0, [stdout], [stderr]) 91 108 AT_CHECK([fgrep -c "No rings were detected in the molecular structure." stdout], 0, [1 92 109 ], [ignore]) … … 134 151 AT_CHECK([file=ConvexEnvelope.dat; diff $file ${abs_top_srcdir}/${AUTOTEST_PATH}/regression/Tesselation/2/post/$file], 0, [ignore], [ignore]) 135 152 AT_CHECK([file=ConvexEnvelope.r3d; diff $file ${abs_top_srcdir}/${AUTOTEST_PATH}/regression/Tesselation/2/post/$file], 0, [ignore], [ignore]) 136 AT_CHECK([fgrep " RESULT: The summed volume is 16.401577angstrom^3" stdout], 0, [ignore], [ignore])153 AT_CHECK([fgrep "tesselated volume area is 16.4016 angstrom^3" stdout], 0, [ignore], [ignore]) 137 154 AT_CHECK([diff ConvexEnvelope.dat NonConvexEnvelope.dat], 0, [ignore], [ignore]) 138 155 AT_CLEANUP … … 152 169 #AT_CHECK([file=ConvexEnvelope.dat; diff $file ${abs_top_srcdir}/${AUTOTEST_PATH}/regression/Tesselation/4/post/$file], 0, [ignore], [ignore]) 153 170 #AT_CHECK([file=ConvexEnvelope.r3d; diff $file ${abs_top_srcdir}/${AUTOTEST_PATH}/regression/Tesselation/4/post/$file], 0, [ignore], [ignore]) 154 #AT_CHECK([fgrep " RESULT: The summed volume is 16.401577angstrom^3" stdout], 0, [ignore], [ignore])171 #AT_CHECK([fgrep "tesselated volume area is 16.4016 angstrom^3" stdout], 0, [ignore], [ignore]) 155 172 #AT_CLEANUP 156 173
Note:
See TracChangeset
for help on using the changeset viewer.