Ignore:
Timestamp:
Feb 2, 2010, 11:38:06 AM (16 years ago)
Author:
Tillmann Crueger <crueger@…>
Branches:
Action_Thermostats, Add_AtomRandomPerturbation, Add_FitFragmentPartialChargesAction, Add_RotateAroundBondAction, Add_SelectAtomByNameAction, Added_ParseSaveFragmentResults, AddingActions_SaveParseParticleParameters, Adding_Graph_to_ChangeBondActions, Adding_MD_integration_tests, Adding_ParticleName_to_Atom, Adding_StructOpt_integration_tests, AtomFragments, Automaking_mpqc_open, AutomationFragmentation_failures, Candidate_v1.5.4, Candidate_v1.6.0, Candidate_v1.6.1, Candidate_v1.7.0, ChangeBugEmailaddress, ChangingTestPorts, ChemicalSpaceEvaluator, CombiningParticlePotentialParsing, Combining_Subpackages, Debian_Package_split, Debian_package_split_molecuildergui_only, Disabling_MemDebug, Docu_Python_wait, EmpiricalPotential_contain_HomologyGraph, EmpiricalPotential_contain_HomologyGraph_documentation, Enable_parallel_make_install, Enhance_userguide, Enhanced_StructuralOptimization, Enhanced_StructuralOptimization_continued, Example_ManyWaysToTranslateAtom, Exclude_Hydrogens_annealWithBondGraph, FitPartialCharges_GlobalError, Fix_BoundInBox_CenterInBox_MoleculeActions, Fix_ChargeSampling_PBC, Fix_ChronosMutex, Fix_FitPartialCharges, Fix_FitPotential_needs_atomicnumbers, Fix_ForceAnnealing, Fix_IndependentFragmentGrids, Fix_ParseParticles, Fix_ParseParticles_split_forward_backward_Actions, Fix_PopActions, Fix_QtFragmentList_sorted_selection, Fix_Restrictedkeyset_FragmentMolecule, Fix_StatusMsg, Fix_StepWorldTime_single_argument, Fix_Verbose_Codepatterns, Fix_fitting_potentials, Fixes, ForceAnnealing_goodresults, ForceAnnealing_oldresults, ForceAnnealing_tocheck, ForceAnnealing_with_BondGraph, ForceAnnealing_with_BondGraph_continued, ForceAnnealing_with_BondGraph_continued_betteresults, ForceAnnealing_with_BondGraph_contraction-expansion, FragmentAction_writes_AtomFragments, FragmentMolecule_checks_bonddegrees, GeometryObjects, Gui_Fixes, Gui_displays_atomic_force_velocity, ImplicitCharges, IndependentFragmentGrids, IndependentFragmentGrids_IndividualZeroInstances, IndependentFragmentGrids_IntegrationTest, IndependentFragmentGrids_Sole_NN_Calculation, JobMarket_RobustOnKillsSegFaults, JobMarket_StableWorkerPool, JobMarket_unresolvable_hostname_fix, MoreRobust_FragmentAutomation, ODR_violation_mpqc_open, PartialCharges_OrthogonalSummation, PdbParser_setsAtomName, PythonUI_with_named_parameters, QtGui_reactivate_TimeChanged_changes, Recreated_GuiChecks, Rewrite_FitPartialCharges, RotateToPrincipalAxisSystem_UndoRedo, SaturateAtoms_findBestMatching, SaturateAtoms_singleDegree, StoppableMakroAction, Subpackage_CodePatterns, Subpackage_JobMarket, Subpackage_LinearAlgebra, Subpackage_levmar, Subpackage_mpqc_open, Subpackage_vmg, Switchable_LogView, ThirdParty_MPQC_rebuilt_buildsystem, TrajectoryDependenant_MaxOrder, TremoloParser_IncreasedPrecision, TremoloParser_MultipleTimesteps, TremoloParser_setsAtomName, Ubuntu_1604_changes, stable
Children:
7ba324
Parents:
9fe36b (diff), 2ededc2 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'MenuRefactoring' into QT4Refactoring

Conflicts:

molecuilder/src/Makefile.am
molecuilder/src/builder.cpp
molecuilder/src/unittests/Makefile.am

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/tesselation.cpp

    r9fe36b rb8d1aeb  
    99
    1010#include "helpers.hpp"
     11#include "info.hpp"
    1112#include "linkedcell.hpp"
    1213#include "log.hpp"
     
    2223/** Constructor of BoundaryPointSet.
    2324 */
    24 BoundaryPointSet::BoundaryPointSet()
    25 {
    26   LinesCount = 0;
    27   Nr = -1;
    28   value = 0.;
     25BoundaryPointSet::BoundaryPointSet() :
     26    LinesCount(0),
     27    value(0.),
     28    Nr(-1)
     29{
     30        Info FunctionInfo(__func__);
     31        Log() << Verbose(1) << "Adding noname." << endl;
    2932};
    3033
     
    3235 * \param *Walker TesselPoint this boundary point represents
    3336 */
    34 BoundaryPointSet::BoundaryPointSet(TesselPoint * Walker)
    35 {
    36   node = Walker;
    37   LinesCount = 0;
    38   Nr = Walker->nr;
    39   value = 0.;
     37BoundaryPointSet::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;
    4045};
    4146
     
    4651BoundaryPointSet::~BoundaryPointSet()
    4752{
    48   //Log() << Verbose(5) << "Erasing point nr. " << Nr << "." << endl;
     53        Info FunctionInfo(__func__);
     54  //Log() << Verbose(0) << "Erasing point nr. " << Nr << "." << endl;
    4955  if (!lines.empty())
    5056    eLog() << Verbose(2) << "Memory Leak! I " << *this << " am still connected to some lines." << endl;
     
    5561 * \param *line line to add
    5662 */
    57 void BoundaryPointSet::AddLine(class BoundaryLineSet *line)
    58 {
    59   Log() << Verbose(6) << "Adding " << *this << " to line " << *line << "."
     63void BoundaryPointSet::AddLine(BoundaryLineSet * const line)
     64{
     65        Info FunctionInfo(__func__);
     66  Log() << Verbose(1) << "Adding " << *this << " to line " << *line << "."
    6067      << endl;
    6168  if (line->endpoints[0] == this)
     
    8592/** Constructor of BoundaryLineSet.
    8693 */
    87 BoundaryLineSet::BoundaryLineSet()
    88 {
     94BoundaryLineSet::BoundaryLineSet() :
     95    Nr(-1)
     96{
     97        Info FunctionInfo(__func__);
    8998  for (int i = 0; i < 2; i++)
    9099    endpoints[i] = NULL;
    91   Nr = -1;
    92100};
    93101
     
    97105 * \param number number of the list
    98106 */
    99 BoundaryLineSet::BoundaryLineSet(class BoundaryPointSet *Point[2], const int number)
    100 {
     107BoundaryLineSet::BoundaryLineSet(BoundaryPointSet * const Point[2], const int number)
     108{
     109        Info FunctionInfo(__func__);
    101110  // set number
    102111  Nr = number;
     
    106115  Point[0]->AddLine(this); //Taken out, to check whether we can avoid unwanted double adding.
    107116  Point[1]->AddLine(this); //
     117  // set skipped to false
     118  skipped = false;
    108119  // 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 */
     129BoundaryLineSet::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;
    110143};
    111144
     
    116149BoundaryLineSet::~BoundaryLineSet()
    117150{
     151        Info FunctionInfo(__func__);
    118152  int Numbers[2];
    119153
     
    134168        for (LineMap::iterator Runner = erasor.first; Runner != erasor.second; Runner++)
    135169          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;
    137171            endpoints[i]->lines.erase(Runner);
    138172            break;
     
    140174      } else { // there's just a single line left
    141175        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;
    143177        }
    144178      }
    145179      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;
    147181        if (endpoints[i] != NULL) {
    148182          delete(endpoints[i]);
     
    159193 * \param *triangle to add
    160194 */
    161 void BoundaryLineSet::AddTriangle(class BoundaryTriangleSet *triangle)
    162 {
    163   Log() << Verbose(6) << "Add " << triangle->Nr << " to line " << *this << "." << endl;
     195void BoundaryLineSet::AddTriangle(BoundaryTriangleSet * const triangle)
     196{
     197        Info FunctionInfo(__func__);
     198  Log() << Verbose(0) << "Add " << triangle->Nr << " to line " << *this << "." << endl;
    164199  triangles.insert(TrianglePair(triangle->Nr, triangle));
    165200};
     
    169204 * \return true - common endpoint present, false - not connected
    170205 */
    171 bool BoundaryLineSet::IsConnectedTo(class BoundaryLineSet *line)
    172 {
     206bool BoundaryLineSet::IsConnectedTo(const BoundaryLineSet * const line) const
     207{
     208        Info FunctionInfo(__func__);
    173209  if ((endpoints[0] == line->endpoints[0]) || (endpoints[1] == line->endpoints[0]) || (endpoints[0] == line->endpoints[1]) || (endpoints[1] == line->endpoints[1]))
    174210    return true;
     
    183219 * \return true - triangles are convex, false - concave or less than two triangles connected
    184220 */
    185 bool BoundaryLineSet::CheckConvexityCriterion()
    186 {
     221bool BoundaryLineSet::CheckConvexityCriterion() const
     222{
     223        Info FunctionInfo(__func__);
    187224  Vector BaseLineCenter, BaseLineNormal, BaseLine, helper[2], NormalCheck;
    188225  // get the two triangles
    189226  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;
    191228    return true;
    192229  }
    193230  // check normal vectors
    194231  // 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;
    196233  BaseLineCenter.CopyVector(endpoints[0]->node->node);
    197234  BaseLineCenter.AddVector(endpoints[1]->node->node);
     
    199236  BaseLine.CopyVector(endpoints[0]->node->node);
    200237  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;
    202239
    203240  BaseLineNormal.Zero();
     
    206243  int i=0;
    207244  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;
    210247    NormalCheck.AddVector(&runner->second->NormalVector);
    211248    NormalCheck.Scale(sign);
     
    214251      BaseLineNormal.CopyVector(&runner->second->NormalVector);   // yes, copy second on top of first
    215252    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;
    218254    }
    219255    node = runner->second->GetThirdEndpoint(this);
    220256    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;
    222258      helper[i].CopyVector(node->node->node);
    223259      helper[i].SubtractVector(&BaseLineCenter);
    224260      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;
    226262      i++;
    227263    } 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;
    229265      return true;
    230266    }
    231267  }
    232   //Log() << Verbose(3) << "INFO: BaselineNormal is " << BaseLineNormal << "." << endl;
     268  //Log() << Verbose(0) << "INFO: BaselineNormal is " << BaseLineNormal << "." << endl;
    233269  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;
    235271    return true;
    236272  }
     
    238274  double angle = GetAngle(helper[0], helper[1], BaseLineNormal);
    239275  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;
    241277    return true;
    242278  } 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;
    244280    return false;
    245281  }
     
    250286 * \return true - point is of the line, false - is not
    251287 */
    252 bool BoundaryLineSet::ContainsBoundaryPoint(class BoundaryPointSet *point)
    253 {
     288bool BoundaryLineSet::ContainsBoundaryPoint(const BoundaryPointSet * const point) const
     289{
     290        Info FunctionInfo(__func__);
    254291  for(int i=0;i<2;i++)
    255292    if (point == endpoints[i])
     
    262299 * \return NULL - if endpoint not contained in BoundaryLineSet, or pointer to BoundaryPointSet otherwise
    263300 */
    264 class BoundaryPointSet *BoundaryLineSet::GetOtherEndpoint(class BoundaryPointSet *point)
    265 {
     301class BoundaryPointSet *BoundaryLineSet::GetOtherEndpoint(const BoundaryPointSet * const point) const
     302{
     303        Info FunctionInfo(__func__);
    266304  if (endpoints[0] == point)
    267305    return endpoints[1];
     
    286324/** Constructor for BoundaryTriangleSet.
    287325 */
    288 BoundaryTriangleSet::BoundaryTriangleSet()
    289 {
     326BoundaryTriangleSet::BoundaryTriangleSet() :
     327  Nr(-1)
     328{
     329        Info FunctionInfo(__func__);
    290330  for (int i = 0; i < 3; i++)
    291331    {
     
    293333      lines[i] = NULL;
    294334    }
    295   Nr = -1;
    296335};
    297336
     
    300339 * \param number number of triangle
    301340 */
    302 BoundaryTriangleSet::BoundaryTriangleSet(class BoundaryLineSet *line[3], int number)
    303 {
     341BoundaryTriangleSet::BoundaryTriangleSet(class BoundaryLineSet * const line[3], const int number) :
     342  Nr(number)
     343{
     344        Info FunctionInfo(__func__);
    304345  // set number
    305   Nr = number;
    306346  // 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  }
    313351  // get ascending order of endpoints
    314   map<int, class BoundaryPointSet *> OrderMap;
     352  PointMap OrderMap;
    315353  for (int i = 0; i < 3; i++)
    316354    // 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    }
    323360  // set endpoints
    324361  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  }
    339372};
    340373
     
    345378BoundaryTriangleSet::~BoundaryTriangleSet()
    346379{
     380        Info FunctionInfo(__func__);
    347381  for (int i = 0; i < 3; i++) {
    348382    if (lines[i] != NULL) {
    349383      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;
    351385      }
    352386      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;
    354388          delete (lines[i]);
    355389          lines[i] = NULL;
     
    357391    }
    358392  }
    359   //Log() << Verbose(5) << "Erasing triangle Nr." << Nr << " itself." << endl;
     393  //Log() << Verbose(0) << "Erasing triangle Nr." << Nr << " itself." << endl;
    360394};
    361395
     
    364398 * \param &OtherVector direction vector to make normal vector unique.
    365399 */
    366 void BoundaryTriangleSet::GetNormalVector(Vector &OtherVector)
    367 {
     400void BoundaryTriangleSet::GetNormalVector(const Vector &OtherVector)
     401{
     402        Info FunctionInfo(__func__);
    368403  // get normal vector
    369404  NormalVector.MakeNormalVector(endpoints[0]->node->node, endpoints[1]->node->node, endpoints[2]->node->node);
     
    372407  if (NormalVector.ScalarProduct(&OtherVector) > 0.)
    373408    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.
    377413 * We call Vector::GetIntersectionWithPlane() to receive the intersection point with the plane
    378  * This 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.
    379415 * The latter is done as follows: We calculate the cross point of one of the triangle's baseline with the line
    380416 * given by the intersection and the third basepoint. Then, we check whether it's on the baseline (i.e. between
     
    386422 * \return true - \a *Intersection contains intersection on plane defined by triangle, false - zero vector if outside of triangle.
    387423 */
    388 bool BoundaryTriangleSet::GetIntersectionInsideTriangle(Vector *MolCenter, Vector *x, Vector *Intersection)
    389 {
     424bool BoundaryTriangleSet::GetIntersectionInsideTriangle(const Vector * const MolCenter, const Vector * const x, Vector * const Intersection) const
     425{
     426  Info FunctionInfo(__func__);
    390427  Vector CrossPoint;
    391428  Vector helper;
    392429
    393430  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;
    395432    return false;
    396433  }
    397434
     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  }
    398449  // Calculate cross point between one baseline and the line from the third endpoint to intersection
    399450  int i=0;
     
    402453      helper.CopyVector(endpoints[(i+1)%3]->node->node);
    403454      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++;
    404464    } else
    405       i++;
    406     if (i>2)
    407465      break;
    408   } while (CrossPoint.NormSquared() < MYEPSILON);
     466  } while (i<3);
    409467  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;
    417469    return true;
    418   } else { // outside!
    419     Intersection->Zero();
     470  } else {
     471    Log() << Verbose(1) << "INFO: Crosspoint " << CrossPoint << " outside of triangle." << endl;
    420472    return false;
    421473  }
     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 */
     486double 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;
    422558};
    423559
     
    426562 * \return true - line is of the triangle, false - is not
    427563 */
    428 bool BoundaryTriangleSet::ContainsBoundaryLine(class BoundaryLineSet *line)
    429 {
     564bool BoundaryTriangleSet::ContainsBoundaryLine(const BoundaryLineSet * const line) const
     565{
     566        Info FunctionInfo(__func__);
    430567  for(int i=0;i<3;i++)
    431568    if (line == lines[i])
     
    438575 * \return true - point is of the triangle, false - is not
    439576 */
    440 bool BoundaryTriangleSet::ContainsBoundaryPoint(class BoundaryPointSet *point)
    441 {
     577bool BoundaryTriangleSet::ContainsBoundaryPoint(const BoundaryPointSet * const point) const
     578{
     579        Info FunctionInfo(__func__);
    442580  for(int i=0;i<3;i++)
    443581    if (point == endpoints[i])
     
    450588 * \return true - point is of the triangle, false - is not
    451589 */
    452 bool BoundaryTriangleSet::ContainsBoundaryPoint(class TesselPoint *point)
    453 {
     590bool BoundaryTriangleSet::ContainsBoundaryPoint(const TesselPoint * const point) const
     591{
     592        Info FunctionInfo(__func__);
    454593  for(int i=0;i<3;i++)
    455594    if (point == endpoints[i]->node)
     
    462601 * \return true - is the very triangle, false - is not
    463602 */
    464 bool BoundaryTriangleSet::IsPresentTupel(class BoundaryPointSet *Points[3])
    465 {
     603bool 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;
    466607  return (((endpoints[0] == Points[0])
    467608            || (endpoints[0] == Points[1])
     
    483624 * \return true - is the very triangle, false - is not
    484625 */
    485 bool BoundaryTriangleSet::IsPresentTupel(class BoundaryTriangleSet *T)
    486 {
     626bool BoundaryTriangleSet::IsPresentTupel(const BoundaryTriangleSet * const T) const
     627{
     628        Info FunctionInfo(__func__);
    487629  return (((endpoints[0] == T->endpoints[0])
    488630            || (endpoints[0] == T->endpoints[1])
     
    504646 * \return pointer third endpoint or NULL if line does not belong to triangle.
    505647 */
    506 class BoundaryPointSet *BoundaryTriangleSet::GetThirdEndpoint(class BoundaryLineSet *line)
    507 {
     648class BoundaryPointSet *BoundaryTriangleSet::GetThirdEndpoint(const BoundaryLineSet * const line) const
     649{
     650        Info FunctionInfo(__func__);
    508651  // sanity check
    509652  if (!ContainsBoundaryLine(line))
     
    520663 * \param *center central point on return.
    521664 */
    522 void BoundaryTriangleSet::GetCenter(Vector *center)
    523 {
     665void BoundaryTriangleSet::GetCenter(Vector * const center) const
     666{
     667        Info FunctionInfo(__func__);
    524668  center->Zero();
    525669  for(int i=0;i<3;i++)
    526670    center->AddVector(endpoints[i]->node->node);
    527671  center->Scale(1./3.);
     672  Log() << Verbose(1) << "INFO: Center is at " << *center << "." << endl;
    528673}
    529674
     
    534679ostream &operator <<(ostream &ost, const BoundaryTriangleSet &a)
    535680{
    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 << "]";
    538684  return ost;
    539685};
    540686
     687// ======================================== Polygons on Boundary =================================
     688
     689/** Constructor for BoundaryPolygonSet.
     690 */
     691BoundaryPolygonSet::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 */
     701BoundaryPolygonSet::~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 */
     713Vector * 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 */
     752void 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 */
     769bool 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 */
     779bool 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 */
     789bool 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 */
     807bool 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 */
     824bool 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 */
     846bool 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 */
     867bool 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 */
     875TriangleSet * 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 */
     900bool 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 */
     922ostream &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
    541935// =========================================================== class TESSELPOINT ===========================================
    542936
     
    545939TesselPoint::TesselPoint()
    546940{
     941  //Info FunctionInfo(__func__);
    547942  node = NULL;
    548943  nr = -1;
     
    554949TesselPoint::~TesselPoint()
    555950{
     951  //Info FunctionInfo(__func__);
    556952};
    557953
     
    568964ostream & TesselPoint::operator << (ostream &ost)
    569965{
    570   ost << "[" << (Name) << "|" << this << "]";
     966        Info FunctionInfo(__func__);
     967  ost << "[" << (nr) << "|" << this << "]";
    571968  return ost;
    572969};
     
    579976PointCloud::PointCloud()
    580977{
    581 
     978        //Info FunctionInfo(__func__);
    582979};
    583980
     
    586983PointCloud::~PointCloud()
    587984{
    588 
     985        //Info FunctionInfo(__func__);
    589986};
    590987
     
    593990/** Constructor of class CandidateForTesselation.
    594991 */
    595 CandidateForTesselation::CandidateForTesselation(TesselPoint *candidate, BoundaryLineSet* line, Vector OptCandidateCenter, Vector OtherOptCandidateCenter) {
    596   point = candidate;
    597   BaseLine = line;
     992CandidateForTesselation::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 */
     1003CandidateForTesselation::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__);
    5981009  OptCenter.CopyVector(&OptCandidateCenter);
    5991010  OtherOptCenter.CopyVector(&OtherOptCandidateCenter);
     
    6031014 */
    6041015CandidateForTesselation::~CandidateForTesselation() {
    605   point = NULL;
    6061016  BaseLine = NULL;
    6071017};
    6081018
     1019/** output operator for CandidateForTesselation.
     1020 * \param &ost output stream
     1021 * \param &a boundary line
     1022 */
     1023ostream & 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
    6091043// =========================================================== class TESSELATION ===========================================
    6101044
    6111045/** Constructor of class Tesselation.
    6121046 */
    613 Tesselation::Tesselation()
    614 {
    615   PointsOnBoundaryCount = 0;
    616   LinesOnBoundaryCount = 0;
    617   TrianglesOnBoundaryCount = 0;
    618   InternalPointer = PointsOnBoundary.begin();
    619   LastTriangle = NULL;
    620   TriangleFilesWritten = 0;
     1047Tesselation::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__);
    6211056}
    6221057;
     
    6271062Tesselation::~Tesselation()
    6281063{
    629   Log() << Verbose(1) << "Free'ing TesselStruct ... " << endl;
     1064        Info FunctionInfo(__func__);
     1065  Log() << Verbose(0) << "Free'ing TesselStruct ... " << endl;
    6301066  for (TriangleMap::iterator runner = TrianglesOnBoundary.begin(); runner != TrianglesOnBoundary.end(); runner++) {
    6311067    if (runner->second != NULL) {
     
    6351071      eLog() << Verbose(1) << "The triangle " << runner->first << " has already been free'd." << endl;
    6361072  }
    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;
    6381074}
    6391075;
     
    6441080Vector * Tesselation::GetCenter(ofstream *out) const
    6451081{
     1082        Info FunctionInfo(__func__);
    6461083  Vector *Center = new Vector(0.,0.,0.);
    6471084  int num=0;
     
    6591096TesselPoint * Tesselation::GetPoint() const
    6601097{
     1098        Info FunctionInfo(__func__);
    6611099  return (InternalPointer->second->node);
    6621100};
     
    6671105TesselPoint * Tesselation::GetTerminalPoint() const
    6681106{
     1107        Info FunctionInfo(__func__);
    6691108  PointMap::const_iterator Runner = PointsOnBoundary.end();
    6701109  Runner--;
     
    6771116void Tesselation::GoToNext() const
    6781117{
     1118        Info FunctionInfo(__func__);
    6791119  if (InternalPointer != PointsOnBoundary.end())
    6801120    InternalPointer++;
     
    6861126void Tesselation::GoToPrevious() const
    6871127{
     1128        Info FunctionInfo(__func__);
    6881129  if (InternalPointer != PointsOnBoundary.begin())
    6891130    InternalPointer--;
     
    6951136void Tesselation::GoToFirst() const
    6961137{
     1138        Info FunctionInfo(__func__);
    6971139  InternalPointer = PointsOnBoundary.begin();
    6981140};
     
    7031145void Tesselation::GoToLast() const
    7041146{
     1147        Info FunctionInfo(__func__);
    7051148  InternalPointer = PointsOnBoundary.end();
    7061149  InternalPointer--;
     
    7121155bool Tesselation::IsEmpty() const
    7131156{
     1157        Info FunctionInfo(__func__);
    7141158  return (PointsOnBoundary.empty());
    7151159};
     
    7201164bool Tesselation::IsEnd() const
    7211165{
     1166        Info FunctionInfo(__func__);
    7221167  return (InternalPointer == PointsOnBoundary.end());
    7231168};
     
    7291174 * \param PointsOnBoundary set of boundary points defining the convex envelope of the cluster
    7301175 */
    731 void
    732 Tesselation::GuessStartingTriangle()
    733 {
     1176void Tesselation::GuessStartingTriangle()
     1177{
     1178        Info FunctionInfo(__func__);
    7341179  // 4b. create a starting triangle
    7351180  // 4b1. create all distances
     
    7781223          baseline->second.first->second->node->node,
    7791224          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;
    7831226      // 4. loop over all points
    7841227      double sign = 0.;
     
    7961239          if (fabs(distance) < 1e-4) // we need to have a small epsilon around 0 which is still ok
    7971240            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;
    8001242          tmp = distance / fabs(distance);
    8011243          // 4b. Any have different sign to than before? (i.e. would lie outside convex hull with this starting triangle)
     
    8501292      if (checker == PointsOnBoundary.end())
    8511293        {
    852           Log() << Verbose(0) << "Looks like we have a candidate!" << endl;
     1294          Log() << Verbose(2) << "Looks like we have a candidate!" << endl;
    8531295          break;
    8541296        }
     
    8801322  else
    8811323    {
    882       Log() << Verbose(1) << "No starting triangle found." << endl;
    883       exit(255);
     1324      eLog() << Verbose(0) << "No starting triangle found." << endl;
    8841325    }
    8851326}
     
    9011342void Tesselation::TesselateOnBoundary(const PointCloud * const cloud)
    9021343{
     1344        Info FunctionInfo(__func__);
    9031345  bool flag;
    9041346  PointMap::iterator winner;
     
    9191361        // get peak point with respect to this base line's only triangle
    9201362        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;
    9221364        for (int i = 0; i < 3; i++)
    9231365          if ((BTS->endpoints[i] != baseline->second->endpoints[0]) && (BTS->endpoints[i] != baseline->second->endpoints[1]))
    9241366            peak = BTS->endpoints[i];
    925         Log() << Verbose(3) << " and has peak " << *peak << "." << endl;
     1367        Log() << Verbose(1) << " and has peak " << *peak << "." << endl;
    9261368
    9271369        // prepare some auxiliary vectors
     
    9381380          CenterVector.AddVector(BTS->endpoints[i]->node->node);
    9391381        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;
    9411383
    9421384        // normal vector of triangle
     
    9451387        BTS->GetNormalVector(NormalVector);
    9461388        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;
    9481390
    9491391        // vector in propagation direction (out of triangle)
     
    9521394        TempVector.CopyVector(&CenterVector);
    9531395        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;
    9551397        if (PropagationVector.ScalarProduct(&TempVector) > 0) // make sure normal propagation vector points outward from baseline
    9561398          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;
    9581400        winner = PointsOnBoundary.end();
    9591401
     
    9611403        for (PointMap::iterator target = PointsOnBoundary.begin(); target != PointsOnBoundary.end(); target++) {
    9621404          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;
    9641406
    9651407            // first check direction, so that triangles don't intersect
     
    9681410            VirtualNormalVector.ProjectOntoPlane(&NormalVector);
    9691411            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;
    9711413            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;
    9731415              continue;
    9741416            } 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;
    9761418
    9771419            // check first and second endpoint (if any connecting line goes to target has at least not more than 1 triangle)
     
    9791421            LineChecker[1] = baseline->second->endpoints[1]->lines.find(target->first);
    9801422            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;
    9821424              continue;
    9831425            }
    9841426            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;
    9861428              continue;
    9871429            }
     
    10001442            helper.ProjectOntoPlane(&TempVector);
    10011443            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;
    10031445              continue;
    10041446            }
     
    10171459            // calculate angle
    10181460            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;
    10201462            if ((SmallestAngle - TempAngle) > MYEPSILON) { // set to new possible winner
    10211463              SmallestAngle = TempAngle;
    10221464              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;
    10241466            } else if (fabs(SmallestAngle - TempAngle) < MYEPSILON) { // check the angle to propagation, both possible targets are in one plane! (their normals have same angle)
    10251467              // hence, check the angles to some normal direction from our base line but in this common plane of both targets...
     
    10391481                SmallestAngle = TempAngle;
    10401482                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;
    10421484              } 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;
    10441486            } 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;
    10461488          }
    10471489        } // end of loop over all boundary points
     
    10491491        // 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
    10501492        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;
    10521494          // create the lins of not yet present
    10531495          BLS[0] = baseline->second;
     
    10791521          TrianglesOnBoundaryCount++;
    10801522        } 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;
    10821524        }
    10831525
    10841526        // 5d. If the set of lines is not yet empty, go to 5. and continue
    10851527      } 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;
    10871529  } while (flag);
    10881530
     
    10991541bool Tesselation::InsertStraddlingPoints(const PointCloud *cloud, const LinkedCell *LC)
    11001542{
     1543        Info FunctionInfo(__func__);
    11011544  Vector Intersection, Normal;
    11021545  TesselPoint *Walker = NULL;
    11031546  Vector *Center = cloud->GetCenter();
    1104   list<BoundaryTriangleSet*> *triangles = NULL;
     1547  TriangleList *triangles = NULL;
    11051548  bool AddFlag = false;
    11061549  LinkedCell *BoundaryPoints = NULL;
    1107 
    1108   Log() << Verbose(1) << "Begin of InsertStraddlingPoints" << endl;
    11091550
    11101551  cloud->GoToFirst();
     
    11171558    }
    11181559    Walker = cloud->GetPoint();
    1119     Log() << Verbose(2) << "Current point is " << *Walker << "." << endl;
     1560    Log() << Verbose(0) << "Current point is " << *Walker << "." << endl;
    11201561    // get the next triangle
    1121     triangles = FindClosestTrianglesToPoint(Walker->node, BoundaryPoints);
     1562    triangles = FindClosestTrianglesToVector(Walker->node, BoundaryPoints);
    11221563    BTS = triangles->front();
    11231564    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;
    11251566      cloud->GoToNext();
    11261567      continue;
    11271568    } else {
    11281569    }
    1129     Log() << Verbose(2) << "Closest triangle is " << *BTS << "." << endl;
     1570    Log() << Verbose(0) << "Closest triangle is " << *BTS << "." << endl;
    11301571    // get the intersection point
    11311572    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;
    11331574      // we have the intersection, check whether in- or outside of boundary
    11341575      if ((Center->DistanceSquared(Walker->node) - Center->DistanceSquared(&Intersection)) < -MYEPSILON) {
    11351576        // inside, next!
    1136         Log() << Verbose(2) << *Walker << " is inside wrt triangle " << *BTS << "." << endl;
     1577        Log() << Verbose(0) << *Walker << " is inside wrt triangle " << *BTS << "." << endl;
    11371578      } else {
    11381579        // outside!
    1139         Log() << Verbose(2) << *Walker << " is outside wrt triangle " << *BTS << "." << endl;
     1580        Log() << Verbose(0) << *Walker << " is outside wrt triangle " << *BTS << "." << endl;
    11401581        class BoundaryLineSet *OldLines[3], *NewLines[3];
    11411582        class BoundaryPointSet *OldPoints[3], *NewPoint;
     
    11471588        Normal.CopyVector(&BTS->NormalVector);
    11481589        // add Walker to boundary points
    1149         Log() << Verbose(2) << "Adding " << *Walker << " to BoundaryPoints." << endl;
     1590        Log() << Verbose(0) << "Adding " << *Walker << " to BoundaryPoints." << endl;
    11501591        AddFlag = true;
    11511592        if (AddBoundaryPoint(Walker,0))
     
    11541595          continue;
    11551596        // remove triangle
    1156         Log() << Verbose(2) << "Erasing triangle " << *BTS << "." << endl;
     1597        Log() << Verbose(0) << "Erasing triangle " << *BTS << "." << endl;
    11571598        TrianglesOnBoundary.erase(BTS->Nr);
    11581599        delete(BTS);
     
    11621603          BPS[1] = OldPoints[i];
    11631604          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;
    11651606          LinesOnBoundary.insert(LinePair(LinesOnBoundaryCount, NewLines[i])); // no need for check for unique insertion as BPS[0] is definitely a new one
    11661607          LinesOnBoundaryCount++;
     
    11731614            if (NewLines[j]->IsConnectedTo(BLS[0])) {
    11741615              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;
    11761617                return false;
    11771618              } else
     
    11841625          BTS->GetNormalVector(Normal);
    11851626          Normal.Scale(-1.);
    1186           Log() << Verbose(2) << "Created new triangle " << *BTS << "." << endl;
     1627          Log() << Verbose(0) << "Created new triangle " << *BTS << "." << endl;
    11871628          TrianglesOnBoundary.insert(TrianglePair(TrianglesOnBoundaryCount, BTS));
    11881629          TrianglesOnBoundaryCount++;
     
    11981639  // exit
    11991640  delete(Center);
    1200   Log() << Verbose(1) << "End of InsertStraddlingPoints" << endl;
    12011641  return true;
    12021642};
     
    12091649bool Tesselation::AddBoundaryPoint(TesselPoint * Walker, const int n)
    12101650{
     1651        Info FunctionInfo(__func__);
    12111652  PointTestPair InsertUnique;
    12121653  BPS[n] = new class BoundaryPointSet(Walker);
     
    12301671void Tesselation::AddTesselationPoint(TesselPoint* Candidate, const int n)
    12311672{
     1673        Info FunctionInfo(__func__);
    12321674  PointTestPair InsertUnique;
    12331675  TPS[n] = new class BoundaryPointSet(Candidate);
     
    12371679  } else {
    12381680    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;
    12401682    TPS[n] = (InsertUnique.first)->second;
    12411683  }
     
    12501692void Tesselation::SetTesselationPoint(TesselPoint* Candidate, const int n) const
    12511693{
     1694        Info FunctionInfo(__func__);
    12521695  PointMap::const_iterator FindPoint = PointsOnBoundary.find(Candidate->nr);
    12531696  if (FindPoint != PointsOnBoundary.end())
     
    12671710  bool insertNewLine = true;
    12681711
    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
    12711716    pair<LineMap::iterator,LineMap::iterator> FindPair;
    12721717    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;
    12741718
    12751719    for (FindLine = FindPair.first; FindLine != FindPair.second; FindLine++) {
     
    12771721      if (FindLine->second->triangles.size() < 2) {
    12781722        insertNewLine = false;
    1279         Log() << Verbose(4) << "Using existing line " << *FindLine->second << endl;
     1723        Log() << Verbose(0) << "Using existing line " << *FindLine->second << endl;
    12801724
    12811725        BPS[0] = FindLine->second->endpoints[0];
    12821726        BPS[1] = FindLine->second->endpoints[1];
    12831727        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        }
    12841738
    12851739        break;
     
    13041758void Tesselation::AlwaysAddTesselationTriangleLine(class BoundaryPointSet *a, class BoundaryPointSet *b, const int n)
    13051759{
    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;
    13071762  BPS[0] = a;
    13081763  BPS[1] = b;
     
    13121767  // increase counter
    13131768  LinesOnBoundaryCount++;
     1769  // also add to open lines
     1770  CandidateForTesselation *CFT = new CandidateForTesselation(BLS[n]);
     1771  OpenLines.insert(pair< BoundaryLineSet *, CandidateForTesselation *> (BLS[n], CFT));
    13141772};
    13151773
     
    13191777void Tesselation::AddTesselationTriangle()
    13201778{
     1779        Info FunctionInfo(__func__);
    13211780  Log() << Verbose(1) << "Adding triangle to global TrianglesOnBoundary map." << endl;
    13221781
     
    13371796void Tesselation::AddTesselationTriangle(const int nr)
    13381797{
    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;
    13401800
    13411801  // add triangle to global map
     
    13551815void Tesselation::RemoveTesselationTriangle(class BoundaryTriangleSet *triangle)
    13561816{
     1817        Info FunctionInfo(__func__);
    13571818  if (triangle == NULL)
    13581819    return;
    13591820  for (int i = 0; i < 3; i++) {
    13601821    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;
    13621823      triangle->lines[i]->triangles.erase(triangle->Nr);
    13631824      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;
    13651826          RemoveTesselationLine(triangle->lines[i]);
    13661827      } 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));
    13681830        for(TriangleMap::iterator TriangleRunner = triangle->lines[i]->triangles.begin(); TriangleRunner != triangle->lines[i]->triangles.end(); TriangleRunner++)
    13691831          Log() << Verbose(0) << "[" << (TriangleRunner->second)->Nr << "|" << *((TriangleRunner->second)->endpoints[0]) << ", " << *((TriangleRunner->second)->endpoints[1]) << ", " << *((TriangleRunner->second)->endpoints[2]) << "] \t";
    13701832        Log() << Verbose(0) << endl;
    13711833//        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]) << ": ";
    13731835//          for(LineMap::iterator LineRunner = triangle->lines[i]->endpoints[j]->lines.begin(); LineRunner != triangle->lines[i]->endpoints[j]->lines.end(); LineRunner++)
    13741836//            Log() << Verbose(0) << "[" << *(LineRunner->second) << "] \t";
     
    13821844
    13831845  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;
    13851847  delete(triangle);
    13861848};
     
    13921854void Tesselation::RemoveTesselationLine(class BoundaryLineSet *line)
    13931855{
     1856        Info FunctionInfo(__func__);
    13941857  int Numbers[2];
    13951858
     
    14121875        for (LineMap::iterator Runner = erasor.first; Runner != erasor.second; Runner++)
    14131876          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;
    14151878            line->endpoints[i]->lines.erase(Runner);
    14161879            break;
     
    14181881      } else { // there's just a single line left
    14191882        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;
    14211884      }
    14221885      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;
    14241887        RemoveTesselationPoint(line->endpoints[i]);
    14251888      } 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: ";
    14271890        for(LineMap::iterator LineRunner = line->endpoints[i]->lines.begin(); LineRunner != line->endpoints[i]->lines.end(); LineRunner++)
    14281891          Log() << Verbose(0) << "[" << *(LineRunner->second) << "] \t";
     
    14371900
    14381901  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;
    14401903  delete(line);
    14411904};
     
    14481911void Tesselation::RemoveTesselationPoint(class BoundaryPointSet *point)
    14491912{
     1913        Info FunctionInfo(__func__);
    14501914  if (point == NULL)
    14511915    return;
    14521916  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;
    14541918  delete(point);
    14551919};
     
    14661930int Tesselation::CheckPresenceOfTriangle(TesselPoint *Candidates[3]) const
    14671931{
     1932        Info FunctionInfo(__func__);
    14681933  int adjacentTriangleCount = 0;
    14691934  class BoundaryPointSet *Points[3];
    14701935
    1471   Log() << Verbose(2) << "Begin of CheckPresenceOfTriangle" << endl;
    14721936  // builds a triangle point set (Points) of the end points
    14731937  for (int i = 0; i < 3; i++) {
     
    14881952          for (; (FindLine != Points[i]->lines.end()) && (FindLine->first == Points[j]->node->nr); FindLine++) {
    14891953            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;
    14911955            for (TriangleMap::const_iterator FindTriangle = triangles->begin(); FindTriangle != triangles->end(); FindTriangle++) {
    14921956              if (FindTriangle->second->IsPresentTupel(Points)) {
     
    14941958              }
    14951959            }
    1496             Log() << Verbose(3) << "end." << endl;
     1960            Log() << Verbose(1) << "end." << endl;
    14971961          }
    14981962          // 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;
    15001964          //return adjacentTriangleCount;
    15011965        }
     
    15041968  }
    15051969
    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;
    15081971  return adjacentTriangleCount;
    15091972};
     
    15191982class BoundaryTriangleSet * Tesselation::GetPresentTriangle(TesselPoint *Candidates[3])
    15201983{
     1984        Info FunctionInfo(__func__);
    15211985  class BoundaryTriangleSet *triangle = NULL;
    15221986  class BoundaryPointSet *Points[3];
     
    15482012          }
    15492013          // 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;
    15512015          //return adjacentTriangleCount;
    15522016        }
     
    15692033void Tesselation::FindStartingTriangle(const double RADIUS, const LinkedCell *LC)
    15702034{
    1571   Log() << Verbose(1) << "Begin of FindStartingTriangle\n";
     2035        Info FunctionInfo(__func__);
    15722036  int i = 0;
    1573   TesselPoint* FirstPoint = NULL;
    1574   TesselPoint* SecondPoint = NULL;
    15752037  TesselPoint* MaxPoint[NDIM];
     2038  TesselPoint* Temporary;
    15762039  double maxCoordinate[NDIM];
    1577   Vector Oben;
     2040  BoundaryLineSet BaseLine;
    15782041  Vector helper;
    15792042  Vector Chord;
    15802043  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();
    15832050
    15842051  for (i = 0; i < 3; i++) {
     
    15932060      for (LC->n[(i+2)%NDIM]=0;LC->n[(i+2)%NDIM]<LC->N[(i+2)%NDIM];LC->n[(i+2)%NDIM]++) {
    15942061        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;
    15962063        if (List != NULL) {
    15972064          for (LinkedNodes::const_iterator Runner = List->begin();Runner != List->end();Runner++) {
    15982065            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;
    16002067              maxCoordinate[i] = (*Runner)->node->x[i];
    16012068              MaxPoint[i] = (*Runner);
     
    16082075  }
    16092076
    1610   Log() << Verbose(2) << "Found maximum coordinates: ";
     2077  Log() << Verbose(1) << "Found maximum coordinates: ";
    16112078  for (int i=0;i<NDIM;i++)
    16122079    Log() << Verbose(0) << i << ": " << *MaxPoint[i] << "\t";
     
    16142081
    16152082  BTS = NULL;
    1616   CandidateList *OptCandidates = new CandidateList();
    16172083  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;
    16222088
    16232089    double ShortestAngle;
    1624     TesselPoint* OptCandidate = NULL;
    16252090    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.
    16262091
    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?
    16302094      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();
    16382111    ShortestAngle = 2.*M_PI; // This will indicate the quadrant.
    16392112
    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)
    16472117
    16482118    // look in one direction of baseline for initial candidate
    1649     SearchDirection.MakeNormalVector(&Chord, &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 ...
    16502120
    16512121    // 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
    16932138    if (BTS != NULL) // we have created one starting triangle
    16942139      break;
    16952140    else {
    16962141      // 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  }
    17142145};
    17152146
    17162147/** Checks for a given baseline and a third point candidate whether baselines of the found triangle don't have even better candidates.
    17172148 * This is supposed to prevent early closing of the tesselation.
    1718  * \param *BaseRay baseline, i.e. not \a *OptCandidate
     2149 * \param CandidateLine CandidateForTesselation with baseline and shortestangle , i.e. not \a *OptCandidate
    17192150 * \param *ThirdNode third point in triangle, not in BoundaryLineSet::endpoints
    1720  * \param ShortestAngle path length on this circle band for the current \a *ThirdNode
    17212151 * \param RADIUS radius of sphere
    17222152 * \param *LC LinkedCell structure
    17232153 * \return true - there is a better candidate (smaller angle than \a ShortestAngle), false - no better TesselPoint candidate found
    17242154 */
    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//};
    18592285
    18602286/** This function finds a triangle to a line, adjacent to an existing one.
    18612287 * @param out output stream for debugging
    1862  * @param Line current baseline to search from
     2288 * @param CandidateLine current cadndiate baseline to search from
    18632289 * @param T current triangle which \a Line is edge of
    18642290 * @param RADIUS radius of the rolling ball
     
    18662292 * @param *LC LinkedCell structure with neighbouring points
    18672293 */
    1868 bool Tesselation::FindNextSuitableTriangle(BoundaryLineSet &Line, BoundaryTriangleSet &T, const double& RADIUS, const LinkedCell *LC)
    1869 {
    1870   Log() << Verbose(0) << "Begin of FindNextSuitableTriangle\n";
     2294bool Tesselation::FindNextSuitableTriangle(CandidateForTesselation &CandidateLine, BoundaryTriangleSet &T, const double& RADIUS, const LinkedCell *LC)
     2295{
     2296        Info FunctionInfo(__func__);
    18712297  bool result = true;
    1872   CandidateList *OptCandidates = new CandidateList();
    18732298
    18742299  Vector CircleCenter;
    18752300  Vector CirclePlaneNormal;
    1876   Vector OldSphereCenter;
     2301  Vector RelativeSphereCenter;
    18772302  Vector SearchDirection;
    18782303  Vector helper;
    18792304  TesselPoint *ThirdNode = NULL;
    18802305  LineMap::iterator testline;
    1881   double ShortestAngle = 2.*M_PI; // This will indicate the quadrant.
    18822306  double radius, CircleRadius;
    18832307
    1884   Log() << Verbose(1) << "Current baseline is " << Line << " of triangle " << T << "." << endl;
    18852308  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)) {
    18872310      ThirdNode = T.endpoints[i]->node;
     2311      break;
     2312    }
     2313  Log() << Verbose(0) << "Current baseline is " << *CandidateLine.BaseLine << " with ThirdNode " << *ThirdNode << " of triangle " << T << "." << endl;
    18882314
    18892315  // 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);
    18922318  CircleCenter.Scale(0.5);
    18932319
    18942320  // 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);
    18972323
    18982324  // calculate squared radius of circle
    18992325  radius = CirclePlaneNormal.ScalarProduct(&CirclePlaneNormal);
    19002326  if (radius/4. < RADIUS*RADIUS) {
     2327    // construct relative sphere center with now known CircleCenter
     2328    RelativeSphereCenter.CopyVector(&T.SphereCenter);
     2329    RelativeSphereCenter.SubtractVector(&CircleCenter);
     2330
    19012331    CircleRadius = RADIUS*RADIUS - radius/4.;
    19022332    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);
    19172340    helper.SubtractVector(ThirdNode->node);
    19182341    if (helper.ScalarProduct(&SearchDirection) < -HULLEPSILON)// ohoh, SearchDirection points inwards!
    19192342      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) {
    19242345      // rotated the wrong way!
    19252346      eLog() << Verbose(1) << "SearchDirection and RelativeOldSphereCenter are still not orthogonal!" << endl;
     
    19272348
    19282349    // 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);
    19302351
    19312352  } 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()) {
    19362357    eLog() << Verbose(2) << "Could not find a suitable candidate." << endl;
    19372358    return false;
    19382359  }
    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);
    20432449  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 */
     2456void 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);
    20442503};
    20452504
     
    20532512class BoundaryPointSet *Tesselation::IsConvexRectangle(class BoundaryLineSet *Base)
    20542513{
     2514        Info FunctionInfo(__func__);
    20552515  class BoundaryPointSet *Spot = NULL;
    20562516  class BoundaryLineSet *OtherBase;
     
    20642524  OtherBase = new class BoundaryLineSet(BPS,-1);
    20652525
    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;
    20682528
    20692529  // get the closest point on each line to the other line
     
    20852545  delete(ClosestPoint);
    20862546  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;
    20882548    if (distance[0] < distance[1]) {
    20892549      Spot = Base->endpoints[0];
     
    20932553    return Spot;
    20942554  } 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;
    20962556    return NULL;
    20972557  }
     
    21012561void Tesselation::PrintAllBoundaryPoints(ofstream *out) const
    21022562{
     2563        Info FunctionInfo(__func__);
    21032564  // 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;
    21052566  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;
    21072568};
    21082569
    21092570void Tesselation::PrintAllBoundaryLines(ofstream *out) const
    21102571{
     2572        Info FunctionInfo(__func__);
    21112573  // 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;
    21132575  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;
    21152577};
    21162578
    21172579void Tesselation::PrintAllBoundaryTriangles(ofstream *out) const
    21182580{
     2581        Info FunctionInfo(__func__);
    21192582  // 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;
    21212584  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;
    21232586};
    21242587
     
    21302593double Tesselation::PickFarthestofTwoBaselines(class BoundaryLineSet *Base)
    21312594{
     2595        Info FunctionInfo(__func__);
    21322596  class BoundaryLineSet *OtherBase;
    21332597  Vector *ClosestPoint[2];
     
    21412605  OtherBase = new class BoundaryLineSet(BPS,-1);
    21422606
    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;
    21452609
    21462610  // get the closest point on each line to the other line
     
    21622626
    21632627  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;
    21652629    return false;
    21662630  } else { // check for sign against BaseLineNormal
     
    21722636    }
    21732637    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;
    21752639      BaseLineNormal.AddVector(&(runner->second->NormalVector));
    21762640    }
     
    21782642
    21792643    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;
    21812645      // calculate volume summand as a general tetraeder
    21822646      return volume;
    21832647    } 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;
    21852649      return 0.;
    21862650    }
     
    21972661class BoundaryLineSet * Tesselation::FlipBaseline(class BoundaryLineSet *Base)
    21982662{
     2663        Info FunctionInfo(__func__);
    21992664  class BoundaryLineSet *OldLines[4], *NewLine;
    22002665  class BoundaryPointSet *OldPoints[2];
     
    22032668  int i,m;
    22042669
    2205   Log() << Verbose(1) << "Begin of FlipBaseline" << endl;
    2206 
    22072670  // calculate NormalVector for later use
    22082671  BaseLineNormal.Zero();
     
    22122675  }
    22132676  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;
    22152678    BaseLineNormal.AddVector(&(runner->second->NormalVector));
    22162679  }
     
    22252688  i=0;
    22262689  m=0;
    2227   Log() << Verbose(3) << "The four old lines are: ";
     2690  Log() << Verbose(0) << "The four old lines are: ";
    22282691  for(TriangleMap::iterator runner = Base->triangles.begin(); runner != Base->triangles.end(); runner++)
    22292692    for (int j=0;j<3;j++) // all of their endpoints and baselines
     
    22332696      }
    22342697  Log() << Verbose(0) << endl;
    2235   Log() << Verbose(3) << "The two old points are: ";
     2698  Log() << Verbose(0) << "The two old points are: ";
    22362699  for(TriangleMap::iterator runner = Base->triangles.begin(); runner != Base->triangles.end(); runner++)
    22372700    for (int j=0;j<3;j++) // all of their endpoints and baselines
     
    22592722
    22602723  // 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;
    22622725  OldBaseLineNr = Base->Nr;
    22632726  m=0;
    22642727  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;
    22662729    OldTriangleNrs[m++] = runner->second->Nr;
    22672730    RemoveTesselationTriangle(runner->second);
     
    22732736  NewLine = new class BoundaryLineSet(BPS, OldBaseLineNr);
    22742737  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;
    22762739
    22772740  // construct new triangles with flipped baseline
     
    22882751    BTS->GetNormalVector(BaseLineNormal);
    22892752    AddTesselationTriangle(OldTriangleNrs[0]);
    2290     Log() << Verbose(3) << "INFO: Created new triangle " << *BTS << "." << endl;
     2753    Log() << Verbose(0) << "INFO: Created new triangle " << *BTS << "." << endl;
    22912754
    22922755    BLS[0] = (i==2 ? OldLines[3] : OldLines[2]);
     
    22962759    BTS->GetNormalVector(BaseLineNormal);
    22972760    AddTesselationTriangle(OldTriangleNrs[1]);
    2298     Log() << Verbose(3) << "INFO: Created new triangle " << *BTS << "." << endl;
     2761    Log() << Verbose(0) << "INFO: Created new triangle " << *BTS << "." << endl;
    22992762  } 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;
    23012764    return NULL;
    23022765  }
    23032766
    2304   Log() << Verbose(1) << "End of FlipBaseline" << endl;
    23052767  return NewLine;
    23062768};
     
    23172779void Tesselation::FindSecondPointForTesselation(TesselPoint* a, Vector Oben, TesselPoint*& OptCandidate, double Storage[3], double RADIUS, const LinkedCell *LC)
    23182780{
    2319   Log() << Verbose(2) << "Begin of FindSecondPointForTesselation" << endl;
     2781        Info FunctionInfo(__func__);
    23202782  Vector AngleCheck;
    23212783  class TesselPoint* Candidate = NULL;
     
    23382800    Nupper[i] = ((N[i]+1) < LC->N[i]) ? N[i]+1 : LC->N[i]-1;
    23392801  }
    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] << "] :"
    23412803    << " [" << Nlower[0] << "," << Nupper[0] << "], " << " [" << Nlower[1] << "," << Nupper[1] << "], " << " [" << Nlower[2] << "," << Nupper[2] << "], " << endl;
    23422804
     
    23452807      for (LC->n[2] = Nlower[2]; LC->n[2] <= Nupper[2]; LC->n[2]++) {
    23462808        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;
    23482810        if (List != NULL) {
    23492811          for (LinkedNodes::const_iterator Runner = List->begin(); Runner != List->end(); Runner++) {
     
    23762838                angle = AngleCheck.Angle(&Oben);
    23772839                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";
    23802842                  OptCandidate = Candidate;
    23812843                  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]);
    23832845                } 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;
    23852847                }
    23862848              } 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;
    23882850              }
    23892851            } 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;
    23912853            }
    23922854          }
    23932855        } else {
    2394           Log() << Verbose(3) << "Linked cell list is empty." << endl;
     2856          Log() << Verbose(0) << "Linked cell list is empty." << endl;
    23952857        }
    23962858      }
    2397   Log() << Verbose(2) << "End of FindSecondPointForTesselation" << endl;
    23982859};
    23992860
     
    24242885 * @param SearchDirection general direction where to search for the next point, relative to center of BaseLine
    24252886 * @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 line
     2887 * @param CandidateLine CandidateForTesselation with the current base line and list of candidates and ShortestAngle
    24272888 * @param ThirdNode third point to avoid in search
    2428  * @param candidates list of equally good candidates to return
    2429  * @param ShortestAngle the current path length on this circle band for the current OptCandidate
    24302889 * @param RADIUS radius of sphere
    24312890 * @param *LC LinkedCell structure with neighbouring points
    24322891 */
    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 {
     2892void 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__);
    24352895  Vector CircleCenter;  // center of the circle, i.e. of the band of sphere's centers
    24362896  Vector CirclePlaneNormal; // normal vector defining the plane this circle lives in
     
    24402900  Vector NewNormalVector;   // normal vector of the Candidate's triangle
    24412901  Vector helper, OptCandidateCenter, OtherOptCandidateCenter;
     2902  Vector RelativeOldSphereCenter;
     2903  Vector NewPlaneCenter;
    24422904  double CircleRadius; // radius of this circle
    24432905  double radius;
     2906  double otherradius;
    24442907  double alpha, Otheralpha; // angles (i.e. parameter for the circle).
    24452908  int N[NDIM], Nlower[NDIM], Nupper[NDIM];
    24462909  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;
    24522912
    24532913  // 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);
    24562916  CircleCenter.Scale(0.5);
    24572917
    24582918  // 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);
    24612924
    24622925  // 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;
    24662929    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;
    24682931
    24692932    // 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();
    24752938    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;
    24772940
    24782941      // 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!
    24812944        eLog() << Verbose(1) << "SearchDirection and RelativeOldSphereCenter are not orthogonal!" << endl;
    24822945      }
     
    24862949        for(int i=0;i<NDIM;i++) // store indices of this cell
    24872950        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;
    24892952      } else {
    24902953        eLog() << Verbose(1) << "Vector " << CircleCenter << " is outside of LinkedCell's bounding box." << endl;
     
    24922955      }
    24932956      // 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:";
    24952958      for (int i=0;i<NDIM;i++) {
    24962959        Nlower[i] = ((N[i]-1) >= 0) ? N[i]-1 : 0;
     
    25032966          for (LC->n[2] = Nlower[2]; LC->n[2] <= Nupper[2]; LC->n[2]++) {
    25042967            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;
    25062969            if (List != NULL) {
    25072970              for (LinkedNodes::const_iterator Runner = List->begin(); Runner != List->end(); Runner++) {
     
    25092972
    25102973                // 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 centers
    2515                   GetCenterofCircumcircle(&NewSphereCenter, *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)
    25202983                  ) {
    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;
    25242989                    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);
    25252998                      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;
    25273000                      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;
    25313002                      // OtherNewSphereCenter is created by the same vector just in the other direction
    25323003                      helper.Scale(-1.);
    25333004                      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;
    25363006
    25373007                      alpha = GetPathLengthonCircumCircle(CircleCenter, CirclePlaneNormal, CircleRadius, NewSphereCenter, OldSphereCenter, NormalVector, SearchDirection);
    25383008                      Otheralpha = GetPathLengthonCircumCircle(CircleCenter, CirclePlaneNormal, CircleRadius, OtherNewSphereCenter, OldSphereCenter, NormalVector, SearchDirection);
    25393009                      alpha = min(alpha, Otheralpha);
     3010
    25403011                      // if there is a better candidate, drop the current list and add the new candidate
    25413012                      // 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)) {
    25443014                        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);
    25473017                        } else {
    2548                           optCandidate->OptCenter.CopyVector(&OtherNewSphereCenter);
    2549                           optCandidate->OtherOptCenter.CopyVector(&NewSphereCenter);
     3018                          CandidateLine.OptCenter.CopyVector(&OtherNewSphereCenter);
     3019                          CandidateLine.OtherOptCenter.CopyVector(&NewSphereCenter);
    25503020                        }
    25513021                        // 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;
    25563026                        } else {
    25573027                          // 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;
    25673032                        }
    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;
    25703035                      } 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;
    25733038                        } 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;
    25753040                        }
    25763041                      }
    2577 
    25783042                    } 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;
    25803044                    }
    25813045                  } 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;
    25833047                  }
    25843048                } else {
    25853049                  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;
    25873051                  } 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;
    25893053                  }
    25903054                }
     
    25973061  } else {
    25983062    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;
    26003064    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  }
    26113073};
    26123074
     
    26183080class BoundaryPointSet *Tesselation::GetCommonEndpoint(const BoundaryLineSet * line1, const BoundaryLineSet * line2) const
    26193081{
     3082        Info FunctionInfo(__func__);
    26203083  const BoundaryLineSet * lines[2] = { line1, line2 };
    26213084  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;
    26243087  for (int i = 0; i < 2; i++)
    26253088    // for both lines
     
    26313094          { // if insertion fails, we have common endpoint
    26323095            node = OrderTest.first->second;
    2633             Log() << Verbose(5) << "Common endpoint of lines " << *line1
     3096            Log() << Verbose(1) << "Common endpoint of lines " << *line1
    26343097                << " and " << *line2 << " is: " << *node << "." << endl;
    26353098            j = 2;
     
    26413104};
    26423105
     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 */
     3111DistanceToPointMap * 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 */
     3163BoundaryLineSet * 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
    26433225/** Finds the triangle that is closest to a given Vector \a *x.
    26443226 * \param *out output stream for debugging
    26453227 * \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) const
    2649 {
    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 */
     3230TriangleList * 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;
    26563238    return NULL;
    26573239  }
    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;
    26643303    return NULL;
    26653304  }
    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;
    27213311};
    27223312
     
    27273317 * \return list of BoundaryTriangleSet of nearest triangles or NULL.
    27283318 */
    2729 class BoundaryTriangleSet * Tesselation::FindClosestTriangleToPoint(const Vector *x, const LinkedCell* LC) const
    2730 {
     3319class BoundaryTriangleSet * Tesselation::FindClosestTriangleToVector(const Vector *x, const LinkedCell* LC) const
     3320{
     3321        Info FunctionInfo(__func__);
    27313322  class BoundaryTriangleSet *result = NULL;
    2732   list<BoundaryTriangleSet*> *triangles = FindClosestTrianglesToPoint(x, LC);
     3323  TriangleList *triangles = FindClosestTrianglesToVector(x, LC);
     3324  TriangleList candidates;
    27333325  Vector Center;
    2734 
    2735   if (triangles == NULL)
     3326  Vector helper;
     3327
     3328  if ((triangles == NULL) || (triangles->empty()))
    27363329    return NULL;
    27373330
    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;
    27523344    }
    27533345  }
    27543346  delete(triangles);
     3347
    27553348  return result;
    27563349};
    27573350
    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 */
     3358bool 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!
    27593375 *
    27603376 * @param point of which to check the position
    27613377 * @param *LC LinkedCell structure
    27623378 *
    2763  * @return true if the point is inside the tesselation structure, false otherwise
    2764  */
    2765 bool Tesselation::IsInnerPoint(const Vector &Point, const LinkedCell* const LC) const
    2766 {
    2767   class BoundaryTriangleSet *result = FindClosestTriangleToPoint(&Point, LC);
     3379 * @return >0 if outside, ==0 if on surface, <0 if inside
     3380 */
     3381double Tesselation::GetDistanceSquaredToTriangle(const Vector &Point, const BoundaryTriangleSet* const triangle) const
     3382{
     3383  Info FunctionInfo(__func__);
    27683384  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.;
    27823393  } 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 */
     3440double 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};
    27993446
    28003447/** Gets all points connected to the provided point by triangulation lines.
     
    28043451 * @return set of the all points linked to the provided one
    28053452 */
    2806 set<TesselPoint*> * Tesselation::GetAllConnectedPoints(const TesselPoint* const Point) const
    2807 {
    2808   set<TesselPoint*> *connectedPoints = new set<TesselPoint*>;
     3453TesselPointSet * Tesselation::GetAllConnectedPoints(const TesselPoint* const Point) const
     3454{
     3455        Info FunctionInfo(__func__);
     3456        TesselPointSet *connectedPoints = new TesselPointSet;
    28093457  class BoundaryPointSet *ReferencePoint = NULL;
    28103458  TesselPoint* current;
    28113459  bool takePoint = false;
    2812 
    2813   Log() << Verbose(3) << "Begin of GetAllConnectedPoints" << endl;
    28143460
    28153461  // find the respective boundary point
     
    28183464    ReferencePoint = PointRunner->second;
    28193465  } 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;
    28213467    ReferencePoint = NULL;
    28223468  }
     
    28423488
    28433489   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;
    28453491     connectedPoints->insert(current);
    28463492   }
     
    28493495  }
    28503496
    2851   if (connectedPoints->size() == 0) { // if have not found any points
     3497  if (connectedPoints->empty()) { // if have not found any points
    28523498    eLog() << Verbose(1) << "We have not found any connected points to " << *Point<< "." << endl;
    28533499    return NULL;
    28543500  }
    28553501
    2856   Log() << Verbose(3) << "End of GetAllConnectedPoints" << endl;
    28573502  return connectedPoints;
    28583503};
     
    28663511 *
    28673512 * @param *out output stream for debugging
     3513 * @param *SetOfNeighbours all points for which the angle should be calculated
    28683514 * @param *Point of which get all connected points
    28693515 * @param *Reference Reference vector for zero angle or NULL for no preference
    28703516 * @return list of the all points linked to the provided one
    28713517 */
    2872 list<TesselPoint*> * Tesselation::GetCircleOfConnectedPoints(const TesselPoint* const Point, const Vector * const Reference) const
    2873 {
     3518TesselPointList * Tesselation::GetCircleOfConnectedTriangles(TesselPointSet *SetOfNeighbours, const TesselPoint* const Point, const Vector * const Reference) const
     3519{
     3520        Info FunctionInfo(__func__);
    28743521  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 */
     3600TesselPointList * 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;
    28773605  Vector center;
    28783606  Vector PlaneNormal;
     
    28813609  Vector helper;
    28823610
    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;
    28853613    delete(connectedCircle);
    28863614    return NULL;
    28873615  }
    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;
    28903625  // 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  }
    28933643  //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 points
    2899   PlaneNormal.CopyVector(Point->node);
    2900   PlaneNormal.SubtractVector(&center);
    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(&center);
     3651//  PlaneNormal.Normalize();
     3652  Log() << Verbose(1) << "INFO: Calculated plane normal of circle is " << PlaneNormal << "." << endl;
    29033653
    29043654  // construct one orthogonal vector
     
    29093659  }
    29103660  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);
    29133663    AngleZero.SubtractVector(Point->node);
    29143664    AngleZero.ProjectOntoPlane(&PlaneNormal);
     
    29183668    }
    29193669  }
    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;
    29213671  if (AngleZero.NormSquared() > MYEPSILON)
    29223672    OrthogonalVector.MakeNormalVector(&PlaneNormal, &AngleZero);
    29233673  else
    29243674    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;
    29263676
    29273677  // 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++) {
    29293680    helper.CopyVector((*listRunner)->node);
    29303681    helper.SubtractVector(Point->node);
    29313682    helper.ProjectOntoPlane(&PlaneNormal);
    29323683    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    }
    29353692  }
    29363693
     
    29383695    connectedCircle->push_back(AngleRunner->second);
    29393696  }
    2940 
    2941   delete(connectedPoints);
    2942 
    2943   Log() << Verbose(2) << "End of GetCircleOfConnectedPoints" << endl;
    29443697
    29453698  return connectedCircle;
     
    29523705 * @return list of the all points linked to the provided one
    29533706 */
    2954 list<list<TesselPoint*> *> * Tesselation::GetPathsOfConnectedPoints(const TesselPoint* const Point) const
    2955 {
     3707ListOfTesselPointList * Tesselation::GetPathsOfConnectedPoints(const TesselPoint* const Point) const
     3708{
     3709        Info FunctionInfo(__func__);
    29563710  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;
    29593713  Vector center;
    29603714  Vector PlaneNormal;
     
    29933747      } else if (!LineRunner->second) {
    29943748        LineRunner->second = true;
    2995         connectedPath = new list<TesselPoint*>;
     3749        connectedPath = new TesselPointList;
    29963750        triangle = NULL;
    29973751        CurrentLine = runner->second;
    29983752        StartLine = CurrentLine;
    29993753        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;
    30013755        do {
    30023756          // 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;
    30043758          connectedPath->push_back(CurrentPoint->node);
    30053759
    30063760          // find next triangle
    30073761          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;
    30093763            if ((Runner->second != triangle)) { // look for first triangle not equal to old one
    30103764              triangle = Runner->second;
     
    30133767                if (!TriangleRunner->second) {
    30143768                  TriangleRunner->second = true;
    3015                   Log() << Verbose(3) << "INFO: Connecting triangle is " << *triangle << "." << endl;
     3769                  Log() << Verbose(1) << "INFO: Connecting triangle is " << *triangle << "." << endl;
    30163770                  break;
    30173771                } 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;
    30193773                  triangle = NULL;
    30203774                }
     
    30313785            if ((triangle->lines[i] != CurrentLine) && (triangle->lines[i]->ContainsBoundaryPoint(ReferencePoint))) { // not the current line and still containing Point
    30323786              CurrentLine = triangle->lines[i];
    3033               Log() << Verbose(3) << "INFO: Connecting line is " << *CurrentLine << "." << endl;
     3787              Log() << Verbose(1) << "INFO: Connecting line is " << *CurrentLine << "." << endl;
    30343788              break;
    30353789            }
     
    30453799        } while (CurrentLine != StartLine);
    30463800        // 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;
    30483802        if (StartLine->GetOtherEndpoint(ReferencePoint)->node != connectedPath->back())
    30493803          connectedPath->push_back(StartLine->GetOtherEndpoint(ReferencePoint)->node);
     
    30513805        ListOfPaths->push_back(connectedPath);
    30523806      } 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;
    30543808      }
    30553809    }
     
    30673821 * @return list of the closed paths
    30683822 */
    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;
     3823ListOfTesselPointList * 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;
    30753830  int count = 0;
    30763831
    30773832
    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++) {
    30823837    connectedPath = *ListRunner;
    30833838
    3084     Log() << Verbose(2) << "INFO: Current path is " << connectedPath << "." << endl;
     3839    Log() << Verbose(1) << "INFO: Current path is " << connectedPath << "." << endl;
    30853840
    30863841    // go through list, look for reappearance of starting Point and count
     
    30883843
    30893844    // go through list, look for reappearance of starting Point and create list
    3090     list<TesselPoint*>::iterator Marker = CircleStart;
     3845    TesselPointList::iterator Marker = CircleStart;
    30913846    for (CircleRunner = CircleStart; CircleRunner != connectedPath->end(); CircleRunner++) {
    30923847      if ((*CircleRunner == *CircleStart) && (CircleRunner != CircleStart)) { // is not the very first point
    30933848        // 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;
    30973852        for (; CircleSprinter != CircleRunner; CircleSprinter++) {
    30983853          newPath->push_back(*CircleSprinter);
     
    31083863    }
    31093864  }
    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;
    31113866
    31123867  // delete list of paths
     
    31283883 * \return pointer to allocated list of triangles
    31293884 */
    3130 set<BoundaryTriangleSet*> *Tesselation::GetAllTriangles(const BoundaryPointSet * const Point) const
    3131 {
    3132   set<BoundaryTriangleSet*> *connectedTriangles = new set<BoundaryTriangleSet*>;
     3885TriangleSet *Tesselation::GetAllTriangles(const BoundaryPointSet * const Point) const
     3886{
     3887        Info FunctionInfo(__func__);
     3888        TriangleSet *connectedTriangles = new TriangleSet;
    31333889
    31343890  if (Point == NULL) {
     
    31683924    return 0.;
    31693925  } else
    3170     Log() << Verbose(2) << "Removing point " << *point << " from tesselated boundary ..." << endl;
     3926    Log() << Verbose(0) << "Removing point " << *point << " from tesselated boundary ..." << endl;
    31713927
    31723928  // copy old location for the volume
     
    31793935  }
    31803936
    3181   list<list<TesselPoint*> *> *ListOfClosedPaths = GetClosedPathsOfConnectedPoints(point->node);
    3182   list<TesselPoint*> *connectedPath = NULL;
     3937  list<TesselPointList *> *ListOfClosedPaths = GetClosedPathsOfConnectedPoints(point->node);
     3938  TesselPointList *connectedPath = NULL;
    31833939
    31843940  // gather all triangles
    31853941  for (LineMap::iterator LineRunner = point->lines.begin(); LineRunner != point->lines.end(); LineRunner++)
    31863942    count+=LineRunner->second->triangles.size();
    3187   map<class BoundaryTriangleSet *, int> Candidates;
     3943  TriangleMap Candidates;
    31883944  for (LineMap::iterator LineRunner = point->lines.begin(); LineRunner != point->lines.end(); LineRunner++) {
    31893945    line = LineRunner->second;
    31903946    for (TriangleMap::iterator TriangleRunner = line->triangles.begin(); TriangleRunner != line->triangles.end(); TriangleRunner++) {
    31913947      triangle = TriangleRunner->second;
    3192       Candidates.insert( pair<class BoundaryTriangleSet *, int> (triangle, triangle->Nr) );
     3948      Candidates.insert( TrianglePair (triangle->Nr, triangle) );
    31933949    }
    31943950  }
     
    31973953  count=0;
    31983954  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 inward
    3202     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);
    32033959    count++;
    32043960  }
    32053961  Log() << Verbose(1) << count << " triangles were removed." << endl;
    32063962
    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;
    32113967  double angle;
    32123968  double smallestangle;
     
    32223978
    32233979      // re-create all triangles by going through connected points list
    3224       list<class BoundaryLineSet *> NewLines;
     3980      LineList NewLines;
    32253981      for (;!connectedPath->empty();) {
    32263982        // search middle node with widest angle to next neighbours
     
    32283984        smallestangle = 0.;
    32293985        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;
    32313987          // construct vectors to next and previous neighbour
    32323988          StartNode = MiddleNode;
     
    32564012        MiddleNode = EndNode;
    32574013        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();
    32604016        }
    32614017        StartNode = MiddleNode;
     
    32664022        if (EndNode == connectedPath->end())
    32674023          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;
    32724028        TriangleCandidates[0] = *StartNode;
    32734029        TriangleCandidates[1] = *MiddleNode;
     
    32754031        triangle = GetPresentTriangle(TriangleCandidates);
    32764032        if (triangle != NULL) {
    3277           eLog() << Verbose(2) << "New triangle already present, skipping!" << endl;
     4033          eLog() << Verbose(0) << "New triangle already present, skipping!" << endl;
    32784034          StartNode++;
    32794035          MiddleNode++;
     
    32874043          continue;
    32884044        }
    3289         Log() << Verbose(5) << "Adding new triangle points."<< endl;
     4045        Log() << Verbose(3) << "Adding new triangle points."<< endl;
    32904046        AddTesselationPoint(*StartNode, 0);
    32914047        AddTesselationPoint(*MiddleNode, 1);
    32924048        AddTesselationPoint(*EndNode, 2);
    3293         Log() << Verbose(5) << "Adding new triangle lines."<< endl;
     4049        Log() << Verbose(3) << "Adding new triangle lines."<< endl;
    32944050        AddTesselationLine(TPS[0], TPS[1], 0);
    32954051        AddTesselationLine(TPS[0], TPS[2], 1);
     
    33064062        // prepare nodes for next triangle
    33074063        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;
    33094065        connectedPath->remove(*MiddleNode); // remove the middle node (it is surrounded by triangles)
    33104066        if (connectedPath->size() == 2) { // we are done
     
    33134069          break;
    33144070        } 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();
    33174073        } else {
    33184074          MiddleNode = StartNode;
     
    33284084      // maximize the inner lines (we preferentially created lines with a huge angle, which is for the tesselation not wanted though useful for the closing)
    33294085      if (NewLines.size() > 1) {
    3330         list<class BoundaryLineSet *>::iterator Candidate;
     4086        LineList::iterator Candidate;
    33314087        class BoundaryLineSet *OtherBase = NULL;
    33324088        double tmp, maxgain;
    33334089        do {
    33344090          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++) {
    33364092            tmp = PickFarthestofTwoBaselines(*Runner);
    33374093            if (maxgain < tmp) {
     
    33424098          if (maxgain != 0) {
    33434099            volume += maxgain;
    3344             Log() << Verbose(3) << "Flipping baseline with highest volume" << **Candidate << "." << endl;
     4100            Log() << Verbose(1) << "Flipping baseline with highest volume" << **Candidate << "." << endl;
    33454101            OtherBase = FlipBaseline(*Candidate);
    33464102            NewLines.erase(Candidate);
     
    33534109      delete(connectedPath);
    33544110    }
    3355     Log() << Verbose(1) << count << " triangles were created." << endl;
     4111    Log() << Verbose(0) << count << " triangles were created." << endl;
    33564112  } else {
    33574113    while (!ListOfClosedPaths->empty()) {
     
    33614117      delete(connectedPath);
    33624118    }
    3363     Log() << Verbose(1) << "No need to create any triangles." << endl;
     4119    Log() << Verbose(0) << "No need to create any triangles." << endl;
    33644120  }
    33654121  delete(ListOfClosedPaths);
    33664122
    3367   Log() << Verbose(1) << "Removed volume is " << volume << "." << endl;
     4123  Log() << Verbose(0) << "Removed volume is " << volume << "." << endl;
    33684124
    33694125  return volume;
     
    33754131 * Finds triangles belonging to the three provided points.
    33764132 *
    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)
    33784134 *
    33794135 * @return triangles which belong to the provided points, will be empty if there are none,
    33804136 *         will usually be one, in case of degeneration, there will be two
    33814137 */
    3382 list<BoundaryTriangleSet*> *Tesselation::FindTriangles(const TesselPoint* const Points[3]) const
    3383 {
    3384   list<BoundaryTriangleSet*> *result = new list<BoundaryTriangleSet*>;
     4138TriangleList *Tesselation::FindTriangles(const TesselPoint* const Points[3]) const
     4139{
     4140        Info FunctionInfo(__func__);
     4141        TriangleList *result = new TriangleList;
    33854142  LineMap::const_iterator FindLine;
    33864143  TriangleMap::const_iterator FindTriangle;
    33874144  class BoundaryPointSet *TrianglePoints[3];
     4145  size_t NoOfWildcards = 0;
    33884146
    33894147  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;
    33934151    } 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                }
    34114177              }
     4178              // Is it sufficient to consider one of the triangle lines for this.
     4179              return result;
    34124180            }
    34134181          }
    3414           // Is it sufficient to consider one of the triangle lines for this.
    3415           return result;
    34164182        }
    34174183      }
    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;
    34194227  }
    34204228
    34214229  return result;
    34224230}
     4231
     4232struct 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>
    34234262
    34244263/**
     
    34284267 *         in the list, once as key and once as value
    34294268 */
    3430 map<int, int> * Tesselation::FindAllDegeneratedLines()
    3431 {
    3432   map<int, class BoundaryLineSet *> AllLines;
    3433   map<int, int> * DegeneratedLines = new map<int, int>;
     4269IndexToIndex * Tesselation::FindAllDegeneratedLines()
     4270{
     4271        Info FunctionInfo(__func__);
     4272        UniqueLines AllLines;
     4273  IndexToIndex * DegeneratedLines = new IndexToIndex;
    34344274
    34354275  // sanity check
    34364276  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.";
    34384278    return DegeneratedLines;
    34394279  }
    34404280
    34414281  LineMap::iterator LineRunner1;
    3442   pair<LineMap::iterator, bool> tester;
     4282  pair< UniqueLines::iterator, bool> tester;
    34434283  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 line
    3446       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) );
    34484288    }
    34494289  }
     
    34514291  AllLines.clear();
    34524292
    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  }
    34574303
    34584304  return DegeneratedLines;
     
    34654311 *         in the list, once as key and once as value
    34664312 */
    3467 map<int, int> * Tesselation::FindAllDegeneratedTriangles()
    3468 {
    3469   map<int, int> * DegeneratedLines = FindAllDegeneratedLines();
    3470   map<int, int> * DegeneratedTriangles = new map<int, int>;
     4313IndexToIndex * Tesselation::FindAllDegeneratedTriangles()
     4314{
     4315        Info FunctionInfo(__func__);
     4316  IndexToIndex * DegeneratedLines = FindAllDegeneratedLines();
     4317  IndexToIndex * DegeneratedTriangles = new IndexToIndex;
    34714318
    34724319  TriangleMap::iterator TriangleRunner1, TriangleRunner2;
     
    34744321  class BoundaryLineSet *line1 = NULL, *line2 = NULL;
    34754322
    3476   for (map<int, int>::iterator LineRunner = DegeneratedLines->begin(); LineRunner != DegeneratedLines->end(); ++LineRunner) {
     4323  for (IndexToIndex::iterator LineRunner = DegeneratedLines->begin(); LineRunner != DegeneratedLines->end(); ++LineRunner) {
    34774324    // run over both lines' triangles
    34784325    Liner = LinesOnBoundary.find(LineRunner->first);
     
    34944341  delete(DegeneratedLines);
    34954342
    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;
    34984345  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;
    35004347
    35014348  return DegeneratedTriangles;
     
    35084355void Tesselation::RemoveDegeneratedTriangles()
    35094356{
    3510   map<int, int> * DegeneratedTriangles = FindAllDegeneratedTriangles();
     4357        Info FunctionInfo(__func__);
     4358  IndexToIndex * DegeneratedTriangles = FindAllDegeneratedTriangles();
    35114359  TriangleMap::iterator finder;
    35124360  BoundaryTriangleSet *triangle = NULL, *partnerTriangle = NULL;
    35134361  int count  = 0;
    35144362
    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();
    35184364    TriangleKeyRunner != DegeneratedTriangles->end(); ++TriangleKeyRunner
    35194365  ) {
     
    35724418      // erase the pair
    35734419      count += (int) DegeneratedTriangles->erase(triangle->Nr);
    3574       Log() << Verbose(1) << "RemoveDegeneratedTriangles() removes triangle " << *triangle << "." << endl;
     4420      Log() << Verbose(0) << "RemoveDegeneratedTriangles() removes triangle " << *triangle << "." << endl;
    35754421      RemoveTesselationTriangle(triangle);
    35764422      count += (int) DegeneratedTriangles->erase(partnerTriangle->Nr);
    3577       Log() << Verbose(1) << "RemoveDegeneratedTriangles() removes triangle " << *partnerTriangle << "." << endl;
     4423      Log() << Verbose(0) << "RemoveDegeneratedTriangles() removes triangle " << *partnerTriangle << "." << endl;
    35784424      RemoveTesselationTriangle(partnerTriangle);
    35794425    } else {
    3580       Log() << Verbose(1) << "RemoveDegeneratedTriangles() does not remove triangle " << *triangle
     4426      Log() << Verbose(0) << "RemoveDegeneratedTriangles() does not remove triangle " << *triangle
    35814427        << " and its partner " << *partnerTriangle << " because it is essential for at"
    35824428        << " least one of the endpoints to be kept in the tesselation structure." << endl;
     
    35844430  }
    35854431  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;
    35894436}
    35904437
     
    35994446void Tesselation::AddBoundaryPointByDegeneratedTriangle(class TesselPoint *point, LinkedCell *LC)
    36004447{
    3601   Log() << Verbose(2) << "Begin of AddBoundaryPointByDegeneratedTriangle" << endl;
    3602 
     4448        Info FunctionInfo(__func__);
    36034449  // find nearest boundary point
    36044450  class TesselPoint *BackupPoint = NULL;
    3605   class TesselPoint *NearestPoint = FindClosestPoint(point->node, BackupPoint, LC);
     4451  class TesselPoint *NearestPoint = FindClosestTesselPoint(point->node, BackupPoint, LC);
    36064452  class BoundaryPointSet *NearestBoundaryPoint = NULL;
    36074453  PointMap::iterator PointRunner;
     
    36164462    return;
    36174463  }
    3618   Log() << Verbose(2) << "Nearest point on boundary is " << NearestPoint->Name << "." << endl;
     4464  Log() << Verbose(0) << "Nearest point on boundary is " << NearestPoint->Name << "." << endl;
    36194465
    36204466  // go through its lines and find the best one to split
     
    36494495
    36504496  // 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;
    36524498  AddTesselationPoint((BestLine->endpoints[0]->node), 0);
    36534499  AddTesselationPoint((BestLine->endpoints[1]->node), 1);
    36544500  AddTesselationPoint(point, 2);
    3655   Log() << Verbose(5) << "Adding new triangle lines."<< endl;
     4501  Log() << Verbose(2) << "Adding new triangle lines."<< endl;
    36564502  AddTesselationLine(TPS[0], TPS[1], 0);
    36574503  AddTesselationLine(TPS[0], TPS[2], 1);
     
    36604506  BTS->GetNormalVector(TempTriangle->NormalVector);
    36614507  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;
    36634509  AddTesselationTriangle();
    36644510
    36654511  // 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;
    36674513  AddTesselationPoint((BestLine->endpoints[0]->node), 0);
    36684514  AddTesselationPoint((BestLine->endpoints[1]->node), 1);
    36694515  AddTesselationPoint(point, 2);
    3670   Log() << Verbose(5) << "Adding new triangle lines."<< endl;
     4516  Log() << Verbose(2) << "Adding new triangle lines."<< endl;
    36714517  AddTesselationLine(TPS[0], TPS[1], 0);
    36724518  AddTesselationLine(TPS[0], TPS[2], 1);
     
    36744520  BTS = new class BoundaryTriangleSet(BLS, TrianglesOnBoundaryCount);
    36754521  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;
    36774523  AddTesselationTriangle();
    36784524
     
    36814527    if ((BTS->lines[i]->ContainsBoundaryPoint(BestLine->endpoints[0])) && (BTS->lines[i]->ContainsBoundaryPoint(BestLine->endpoints[1]))) {
    36824528      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();
    36854531      }
    36864532      BTS->lines[i]->triangles.insert( pair<int, class BoundaryTriangleSet *> (TempTriangle->Nr, TempTriangle) );
     
    36894535    }
    36904536  }
    3691 
    3692   // exit
    3693   Log() << Verbose(2) << "End of AddBoundaryPointByDegeneratedTriangle" << endl;
    36944537};
    36954538
     
    37014544void Tesselation::Output(const char *filename, const PointCloud * const cloud)
    37024545{
     4546        Info FunctionInfo(__func__);
    37034547  ofstream *tempstream = NULL;
    37044548  string NameofTempFile;
     
    37134557      NameofTempFile.erase(npos, 1);
    37144558      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";
    37164560      tempstream = new ofstream(NameofTempFile.c_str(), ios::trunc);
    37174561      WriteTecplotFile(tempstream, this, cloud, TriangleFilesWritten);
     
    37274571      NameofTempFile.erase(npos, 1);
    37284572      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";
    37304574      tempstream = new ofstream(NameofTempFile.c_str(), ios::trunc);
    37314575      WriteRaster3dFile(tempstream, this, cloud);
     
    37394583    TriangleFilesWritten++;
    37404584};
     4585
     4586struct 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 */
     4613int 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};
Note: See TracChangeset for help on using the changeset viewer.