Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/tesselation.cpp

    re359a8 r125b3c  
    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 * 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;
     
    5763void BoundaryPointSet::AddLine(class BoundaryLineSet *line)
    5864{
    59   Log() << Verbose(6) << "Adding " << *this << " to line " << *line << "."
     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
     
    99107BoundaryLineSet::BoundaryLineSet(class BoundaryPointSet *Point[2], const int number)
    100108{
     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;
    110121};
    111122
     
    116127BoundaryLineSet::~BoundaryLineSet()
    117128{
     129        Info FunctionInfo(__func__);
    118130  int Numbers[2];
    119131
     
    134146        for (LineMap::iterator Runner = erasor.first; Runner != erasor.second; Runner++)
    135147          if ((*Runner).second == this) {
    136             //Log() << Verbose(5) << "Removing Line Nr. " << Nr << " in boundary point " << *endpoints[i] << "." << endl;
     148            //Log() << Verbose(0) << "Removing Line Nr. " << Nr << " in boundary point " << *endpoints[i] << "." << endl;
    137149            endpoints[i]->lines.erase(Runner);
    138150            break;
     
    140152      } else { // there's just a single line left
    141153        if (endpoints[i]->lines.erase(Nr)) {
    142           //Log() << Verbose(5) << "Removing Line Nr. " << Nr << " in boundary point " << *endpoints[i] << "." << endl;
     154          //Log() << Verbose(0) << "Removing Line Nr. " << Nr << " in boundary point " << *endpoints[i] << "." << endl;
    143155        }
    144156      }
    145157      if (endpoints[i]->lines.empty()) {
    146         //Log() << Verbose(5) << *endpoints[i] << " has no more lines it's attached to, erasing." << endl;
     158        //Log() << Verbose(0) << *endpoints[i] << " has no more lines it's attached to, erasing." << endl;
    147159        if (endpoints[i] != NULL) {
    148160          delete(endpoints[i]);
     
    161173void BoundaryLineSet::AddTriangle(class BoundaryTriangleSet *triangle)
    162174{
    163   Log() << Verbose(6) << "Add " << triangle->Nr << " to line " << *this << "." << endl;
     175        Info FunctionInfo(__func__);
     176  Log() << Verbose(0) << "Add " << triangle->Nr << " to line " << *this << "." << endl;
    164177  triangles.insert(TrianglePair(triangle->Nr, triangle));
    165178};
     
    171184bool BoundaryLineSet::IsConnectedTo(class BoundaryLineSet *line)
    172185{
     186        Info FunctionInfo(__func__);
    173187  if ((endpoints[0] == line->endpoints[0]) || (endpoints[1] == line->endpoints[0]) || (endpoints[0] == line->endpoints[1]) || (endpoints[1] == line->endpoints[1]))
    174188    return true;
     
    185199bool BoundaryLineSet::CheckConvexityCriterion()
    186200{
     201        Info FunctionInfo(__func__);
    187202  Vector BaseLineCenter, BaseLineNormal, BaseLine, helper[2], NormalCheck;
    188203  // get the two triangles
    189204  if (triangles.size() != 2) {
    190     eLog() << Verbose(1) << "Baseline " << *this << " is connected to less than two triangles, Tesselation incomplete!" << endl;
     205    eLog() << Verbose(0) << "Baseline " << *this << " is connected to less than two triangles, Tesselation incomplete!" << endl;
    191206    return true;
    192207  }
    193208  // check normal vectors
    194209  // 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;
     210  //Log() << Verbose(0) << "INFO: " << *this << " has vectors at " << *(endpoints[0]->node->node) << " and at " << *(endpoints[1]->node->node) << "." << endl;
    196211  BaseLineCenter.CopyVector(endpoints[0]->node->node);
    197212  BaseLineCenter.AddVector(endpoints[1]->node->node);
     
    199214  BaseLine.CopyVector(endpoints[0]->node->node);
    200215  BaseLine.SubtractVector(endpoints[1]->node->node);
    201   //Log() << Verbose(3) << "INFO: Baseline is " << BaseLine << " and its center is at " << BaseLineCenter << "." << endl;
     216  //Log() << Verbose(0) << "INFO: Baseline is " << BaseLine << " and its center is at " << BaseLineCenter << "." << endl;
    202217
    203218  BaseLineNormal.Zero();
     
    207222  class BoundaryPointSet *node = NULL;
    208223  for(TriangleMap::iterator runner = triangles.begin(); runner != triangles.end(); runner++) {
    209     //Log() << Verbose(3) << "INFO: NormalVector of " << *(runner->second) << " is " << runner->second->NormalVector << "." << endl;
     224    //Log() << Verbose(0) << "INFO: NormalVector of " << *(runner->second) << " is " << runner->second->NormalVector << "." << endl;
    210225    NormalCheck.AddVector(&runner->second->NormalVector);
    211226    NormalCheck.Scale(sign);
     
    214229      BaseLineNormal.CopyVector(&runner->second->NormalVector);   // yes, copy second on top of first
    215230    else {
    216       Log() << Verbose(1) << "CRITICAL: Triangle " << *runner->second << " has zero normal vector!" << endl;
    217       exit(255);
     231      eLog() << Verbose(0) << "Triangle " << *runner->second << " has zero normal vector!" << endl;
    218232    }
    219233    node = runner->second->GetThirdEndpoint(this);
    220234    if (node != NULL) {
    221       //Log() << Verbose(3) << "INFO: Third node for triangle " << *(runner->second) << " is " << *node << " at " << *(node->node->node) << "." << endl;
     235      //Log() << Verbose(0) << "INFO: Third node for triangle " << *(runner->second) << " is " << *node << " at " << *(node->node->node) << "." << endl;
    222236      helper[i].CopyVector(node->node->node);
    223237      helper[i].SubtractVector(&BaseLineCenter);
    224238      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;
     239      //Log() << Verbose(0) << "INFO: Height vector with respect to baseline is " << helper[i] << "." << endl;
    226240      i++;
    227241    } else {
    228       //eLog() << Verbose(1) << "I cannot find third node in triangle, something's wrong." << endl;
     242      eLog() << Verbose(1) << "I cannot find third node in triangle, something's wrong." << endl;
    229243      return true;
    230244    }
    231245  }
    232   //Log() << Verbose(3) << "INFO: BaselineNormal is " << BaseLineNormal << "." << endl;
     246  //Log() << Verbose(0) << "INFO: BaselineNormal is " << BaseLineNormal << "." << endl;
    233247  if (NormalCheck.NormSquared() < MYEPSILON) {
    234     Log() << Verbose(3) << "ACCEPT: Normalvectors of both triangles are the same: convex." << endl;
     248    Log() << Verbose(0) << "ACCEPT: Normalvectors of both triangles are the same: convex." << endl;
    235249    return true;
    236250  }
     
    238252  double angle = GetAngle(helper[0], helper[1], BaseLineNormal);
    239253  if ((angle - M_PI) > -MYEPSILON) {
    240     Log() << Verbose(3) << "ACCEPT: Angle is greater than pi: convex." << endl;
     254    Log() << Verbose(0) << "ACCEPT: Angle is greater than pi: convex." << endl;
    241255    return true;
    242256  } else {
    243     Log() << Verbose(3) << "REJECT: Angle is less than pi: concave." << endl;
     257    Log() << Verbose(0) << "REJECT: Angle is less than pi: concave." << endl;
    244258    return false;
    245259  }
     
    252266bool BoundaryLineSet::ContainsBoundaryPoint(class BoundaryPointSet *point)
    253267{
     268        Info FunctionInfo(__func__);
    254269  for(int i=0;i<2;i++)
    255270    if (point == endpoints[i])
     
    264279class BoundaryPointSet *BoundaryLineSet::GetOtherEndpoint(class BoundaryPointSet *point)
    265280{
     281        Info FunctionInfo(__func__);
    266282  if (endpoints[0] == point)
    267283    return endpoints[1];
     
    286302/** Constructor for BoundaryTriangleSet.
    287303 */
    288 BoundaryTriangleSet::BoundaryTriangleSet()
    289 {
     304BoundaryTriangleSet::BoundaryTriangleSet() :
     305  Nr(-1)
     306{
     307        Info FunctionInfo(__func__);
    290308  for (int i = 0; i < 3; i++)
    291309    {
     
    293311      lines[i] = NULL;
    294312    }
    295   Nr = -1;
    296313};
    297314
     
    300317 * \param number number of triangle
    301318 */
    302 BoundaryTriangleSet::BoundaryTriangleSet(class BoundaryLineSet *line[3], int number)
    303 {
     319BoundaryTriangleSet::BoundaryTriangleSet(class BoundaryLineSet *line[3], int number) :
     320  Nr(number)
     321{
     322        Info FunctionInfo(__func__);
    304323  // set number
    305   Nr = number;
    306324  // 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     }
     325  for (int i = 0; i < 3; i++) {
     326    lines[i] = line[i];
     327    lines[i]->AddTriangle(this);
     328  }
    313329  // get ascending order of endpoints
    314   map<int, class BoundaryPointSet *> OrderMap;
     330  PointMap OrderMap;
    315331  for (int i = 0; i < 3; i++)
    316332    // 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       }
     333    for (int j = 0; j < 2; j++) { // for both endpoints
     334      OrderMap.insert(pair<int, class BoundaryPointSet *> (
     335          line[i]->endpoints[j]->Nr, line[i]->endpoints[j]));
     336      // and we don't care whether insertion fails
     337    }
    323338  // set endpoints
    324339  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;
     340  Log() << Verbose(0) << "New triangle " << Nr << " with end points: " << endl;
     341  for (PointMap::iterator runner = OrderMap.begin(); runner != OrderMap.end(); runner++) {
     342    endpoints[Counter] = runner->second;
     343    Log() << Verbose(0) << " " << *endpoints[Counter] << endl;
     344    Counter++;
     345  }
     346  if (Counter < 3) {
     347    eLog() << Verbose(0) << "We have a triangle with only two distinct endpoints!" << endl;
     348    performCriticalExit();
     349  }
    339350};
    340351
     
    345356BoundaryTriangleSet::~BoundaryTriangleSet()
    346357{
     358        Info FunctionInfo(__func__);
    347359  for (int i = 0; i < 3; i++) {
    348360    if (lines[i] != NULL) {
    349361      if (lines[i]->triangles.erase(Nr)) {
    350         //Log() << Verbose(5) << "Triangle Nr." << Nr << " erased in line " << *lines[i] << "." << endl;
     362        //Log() << Verbose(0) << "Triangle Nr." << Nr << " erased in line " << *lines[i] << "." << endl;
    351363      }
    352364      if (lines[i]->triangles.empty()) {
    353           //Log() << Verbose(5) << *lines[i] << " is no more attached to any triangle, erasing." << endl;
     365          //Log() << Verbose(0) << *lines[i] << " is no more attached to any triangle, erasing." << endl;
    354366          delete (lines[i]);
    355367          lines[i] = NULL;
     
    357369    }
    358370  }
    359   //Log() << Verbose(5) << "Erasing triangle Nr." << Nr << " itself." << endl;
     371  //Log() << Verbose(0) << "Erasing triangle Nr." << Nr << " itself." << endl;
    360372};
    361373
     
    366378void BoundaryTriangleSet::GetNormalVector(Vector &OtherVector)
    367379{
     380        Info FunctionInfo(__func__);
    368381  // get normal vector
    369382  NormalVector.MakeNormalVector(endpoints[0]->node->node, endpoints[1]->node->node, endpoints[2]->node->node);
     
    372385  if (NormalVector.ScalarProduct(&OtherVector) > 0.)
    373386    NormalVector.Scale(-1.);
     387  Log() << Verbose(1) << "Normal Vector is " << NormalVector << "." << endl;
    374388};
    375389
     
    388402bool BoundaryTriangleSet::GetIntersectionInsideTriangle(Vector *MolCenter, Vector *x, Vector *Intersection)
    389403{
     404        Info FunctionInfo(__func__);
    390405  Vector CrossPoint;
    391406  Vector helper;
    392407
    393408  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;
     409    eLog() << Verbose(1) << "Alas! Intersection with plane failed - at least numerically - the intersection is not on the plane!" << endl;
    395410    return false;
    396411  }
     
    408423  } while (CrossPoint.NormSquared() < MYEPSILON);
    409424  if (i==3) {
    410     eLog() << Verbose(1) << "Could not find any cross points, something's utterly wrong here!" << endl;
    411     exit(255);
     425    eLog() << Verbose(0) << "Could not find any cross points, something's utterly wrong here!" << endl;
    412426  }
    413427  CrossPoint.SubtractVector(endpoints[i%3]->node->node);  // cross point was returned as absolute vector
     
    428442bool BoundaryTriangleSet::ContainsBoundaryLine(class BoundaryLineSet *line)
    429443{
     444        Info FunctionInfo(__func__);
    430445  for(int i=0;i<3;i++)
    431446    if (line == lines[i])
     
    440455bool BoundaryTriangleSet::ContainsBoundaryPoint(class BoundaryPointSet *point)
    441456{
     457        Info FunctionInfo(__func__);
    442458  for(int i=0;i<3;i++)
    443459    if (point == endpoints[i])
     
    452468bool BoundaryTriangleSet::ContainsBoundaryPoint(class TesselPoint *point)
    453469{
     470        Info FunctionInfo(__func__);
    454471  for(int i=0;i<3;i++)
    455472    if (point == endpoints[i]->node)
     
    464481bool BoundaryTriangleSet::IsPresentTupel(class BoundaryPointSet *Points[3])
    465482{
     483        Info FunctionInfo(__func__);
    466484  return (((endpoints[0] == Points[0])
    467485            || (endpoints[0] == Points[1])
     
    485503bool BoundaryTriangleSet::IsPresentTupel(class BoundaryTriangleSet *T)
    486504{
     505        Info FunctionInfo(__func__);
    487506  return (((endpoints[0] == T->endpoints[0])
    488507            || (endpoints[0] == T->endpoints[1])
     
    506525class BoundaryPointSet *BoundaryTriangleSet::GetThirdEndpoint(class BoundaryLineSet *line)
    507526{
     527        Info FunctionInfo(__func__);
    508528  // sanity check
    509529  if (!ContainsBoundaryLine(line))
     
    522542void BoundaryTriangleSet::GetCenter(Vector *center)
    523543{
     544        Info FunctionInfo(__func__);
    524545  center->Zero();
    525546  for(int i=0;i<3;i++)
     
    534555ostream &operator <<(ostream &ost, const BoundaryTriangleSet &a)
    535556{
    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 << "]";
     557  ost << "[" << a.Nr << "|" << a.endpoints[0]->node->Name << "," << a.endpoints[1]->node->Name << "," << a.endpoints[2]->node->Name << "]";
     558//  ost << "[" << a.Nr << "|" << a.endpoints[0]->node->Name << " at " << *a.endpoints[0]->node->node << ","
     559//      << a.endpoints[1]->node->Name << " at " << *a.endpoints[1]->node->node << "," << a.endpoints[2]->node->Name << " at " << *a.endpoints[2]->node->node << "]";
    538560  return ost;
    539561};
    540562
     563// ======================================== Polygons on Boundary =================================
     564
     565/** Constructor for BoundaryPolygonSet.
     566 */
     567BoundaryPolygonSet::BoundaryPolygonSet() :
     568  Nr(-1)
     569{
     570  Info FunctionInfo(__func__);
     571};
     572
     573/** Destructor of BoundaryPolygonSet.
     574 * Just clears endpoints.
     575 * \note When removing triangles from a class Tesselation, use RemoveTesselationTriangle()
     576 */
     577BoundaryPolygonSet::~BoundaryPolygonSet()
     578{
     579  Info FunctionInfo(__func__);
     580  endpoints.clear();
     581  Log() << Verbose(1) << "Erasing polygon Nr." << Nr << " itself." << endl;
     582};
     583
     584/** Calculates the normal vector for this triangle.
     585 * Is made unique by comparison with \a OtherVector to point in the other direction.
     586 * \param &OtherVector direction vector to make normal vector unique.
     587 * \return allocated vector in normal direction
     588 */
     589Vector * BoundaryPolygonSet::GetNormalVector(const Vector &OtherVector) const
     590{
     591  Info FunctionInfo(__func__);
     592  // get normal vector
     593  Vector TemporaryNormal;
     594  Vector *TotalNormal = new Vector;
     595  PointSet::const_iterator Runner[3];
     596  for (int i=0;i<3; i++) {
     597    Runner[i] = endpoints.begin();
     598    for (int j = 0; j<i; j++) { // go as much further
     599      Runner[i]++;
     600      if (Runner[i] == endpoints.end()) {
     601        eLog() << Verbose(0) << "There are less than three endpoints in the polygon!" << endl;
     602        performCriticalExit();
     603      }
     604    }
     605  }
     606  TotalNormal->Zero();
     607  int counter=0;
     608  for (; Runner[2] != endpoints.end(); ) {
     609    TemporaryNormal.MakeNormalVector((*Runner[0])->node->node, (*Runner[1])->node->node, (*Runner[2])->node->node);
     610    for (int i=0;i<3;i++) // increase each of them
     611      Runner[i]++;
     612    TotalNormal->AddVector(&TemporaryNormal);
     613  }
     614  TotalNormal->Scale(1./(double)counter);
     615
     616  // make it always point inward (any offset vector onto plane projected onto normal vector suffices)
     617  if (TotalNormal->ScalarProduct(&OtherVector) > 0.)
     618    TotalNormal->Scale(-1.);
     619  Log() << Verbose(1) << "Normal Vector is " << *TotalNormal << "." << endl;
     620
     621  return TotalNormal;
     622};
     623
     624/** Calculates the center point of the triangle.
     625 * Is third of the sum of all endpoints.
     626 * \param *center central point on return.
     627 */
     628void BoundaryPolygonSet::GetCenter(Vector * const center) const
     629{
     630  Info FunctionInfo(__func__);
     631  center->Zero();
     632  int counter = 0;
     633  for(PointSet::const_iterator Runner = endpoints.begin(); Runner != endpoints.end(); Runner++) {
     634    center->AddVector((*Runner)->node->node);
     635    counter++;
     636  }
     637  center->Scale(1./(double)counter);
     638  Log() << Verbose(1) << "Center is at " << *center << "." << endl;
     639}
     640
     641/** Checks whether the polygons contains all three endpoints of the triangle.
     642 * \param *triangle triangle to test
     643 * \return true - triangle is contained polygon, false - is not
     644 */
     645bool BoundaryPolygonSet::ContainsBoundaryTriangle(const BoundaryTriangleSet * const triangle) const
     646{
     647  Info FunctionInfo(__func__);
     648  return ContainsPresentTupel(triangle->endpoints, 3);
     649};
     650
     651/** Checks whether the polygons contains both endpoints of the line.
     652 * \param *line line to test
     653 * \return true - line is of the triangle, false - is not
     654 */
     655bool BoundaryPolygonSet::ContainsBoundaryLine(const BoundaryLineSet * const line) const
     656{
     657  Info FunctionInfo(__func__);
     658  return ContainsPresentTupel(line->endpoints, 2);
     659};
     660
     661/** Checks whether point is any of the three endpoints this triangle contains.
     662 * \param *point point to test
     663 * \return true - point is of the triangle, false - is not
     664 */
     665bool BoundaryPolygonSet::ContainsBoundaryPoint(const BoundaryPointSet * const point) const
     666{
     667  Info FunctionInfo(__func__);
     668  for(PointSet::const_iterator Runner = endpoints.begin(); Runner != endpoints.end(); Runner++) {
     669    Log() << Verbose(0) << "Checking against " << **Runner << endl;
     670    if (point == (*Runner)) {
     671      Log() << Verbose(0) << " Contained." << endl;
     672      return true;
     673    }
     674  }
     675  Log() << Verbose(0) << " Not contained." << endl;
     676  return false;
     677};
     678
     679/** Checks whether point is any of the three endpoints this triangle contains.
     680 * \param *point TesselPoint to test
     681 * \return true - point is of the triangle, false - is not
     682 */
     683bool BoundaryPolygonSet::ContainsBoundaryPoint(const TesselPoint * const point) const
     684{
     685  Info FunctionInfo(__func__);
     686  for(PointSet::const_iterator Runner = endpoints.begin(); Runner != endpoints.end(); Runner++)
     687    if (point == (*Runner)->node) {
     688      Log() << Verbose(0) << " Contained." << endl;
     689      return true;
     690    }
     691  Log() << Verbose(0) << " Not contained." << endl;
     692  return false;
     693};
     694
     695/** Checks whether given array of \a *Points coincide with polygons's endpoints.
     696 * \param **Points pointer to an array of BoundaryPointSet
     697 * \param dim dimension of array
     698 * \return true - set of points is contained in polygon, false - is not
     699 */
     700bool BoundaryPolygonSet::ContainsPresentTupel(const BoundaryPointSet * const * Points, const int dim) const
     701{
     702  Info FunctionInfo(__func__);
     703  int counter = 0;
     704  Log() << Verbose(1) << "Polygon is " << *this << endl;
     705  for(int i=0;i<dim;i++) {
     706    Log() << Verbose(1) << " Testing endpoint " << *Points[i] << endl;
     707    if (ContainsBoundaryPoint(Points[i])) {
     708      counter++;
     709    }
     710  }
     711
     712  if (counter == dim)
     713    return true;
     714  else
     715    return false;
     716};
     717
     718/** Checks whether given PointList coincide with polygons's endpoints.
     719 * \param &endpoints PointList
     720 * \return true - set of points is contained in polygon, false - is not
     721 */
     722bool BoundaryPolygonSet::ContainsPresentTupel(const PointSet &endpoints) const
     723{
     724  Info FunctionInfo(__func__);
     725  size_t counter = 0;
     726  Log() << Verbose(1) << "Polygon is " << *this << endl;
     727  for(PointSet::const_iterator Runner = endpoints.begin(); Runner != endpoints.end(); Runner++) {
     728    Log() << Verbose(1) << " Testing endpoint " << **Runner << endl;
     729    if (ContainsBoundaryPoint(*Runner))
     730      counter++;
     731  }
     732
     733  if (counter == endpoints.size())
     734    return true;
     735  else
     736    return false;
     737};
     738
     739/** Checks whether given set of \a *Points coincide with polygons's endpoints.
     740 * \param *P pointer to BoundaryPolygonSet
     741 * \return true - is the very triangle, false - is not
     742 */
     743bool BoundaryPolygonSet::ContainsPresentTupel(const BoundaryPolygonSet * const P) const
     744{
     745  return ContainsPresentTupel((const PointSet)P->endpoints);
     746};
     747
     748/** Gathers all the endpoints' triangles in a unique set.
     749 * \return set of all triangles
     750 */
     751TriangleSet * BoundaryPolygonSet::GetAllContainedTrianglesFromEndpoints() const
     752{
     753  Info FunctionInfo(__func__);
     754  pair <TriangleSet::iterator, bool> Tester;
     755  TriangleSet *triangles = new TriangleSet;
     756
     757  for(PointSet::const_iterator Runner = endpoints.begin(); Runner != endpoints.end(); Runner++)
     758    for(LineMap::const_iterator Walker = (*Runner)->lines.begin(); Walker != (*Runner)->lines.end(); Walker++)
     759      for(TriangleMap::const_iterator Sprinter = (Walker->second)->triangles.begin(); Sprinter != (Walker->second)->triangles.end(); Sprinter++) {
     760        //Log() << Verbose(0) << " Testing triangle " << *(Sprinter->second) << endl;
     761        if (ContainsBoundaryTriangle(Sprinter->second)) {
     762          Tester = triangles->insert(Sprinter->second);
     763          if (Tester.second)
     764            Log() << Verbose(0) << "Adding triangle " << *(Sprinter->second) << endl;
     765        }
     766      }
     767
     768  Log() << Verbose(1) << "The Polygon of " << endpoints.size() << " endpoints has " << triangles->size() << " unique triangles in total." << endl;
     769  return triangles;
     770};
     771
     772/** Fills the endpoints of this polygon from the triangles attached to \a *line.
     773 * \param *line lines with triangles attached
     774 * \return true - polygon contains endpoints, false - line was NULL
     775 */
     776bool BoundaryPolygonSet::FillPolygonFromTrianglesOfLine(const BoundaryLineSet * const line)
     777{
     778  Info FunctionInfo(__func__);
     779  pair <PointSet::iterator, bool> Tester;
     780  if (line == NULL)
     781    return false;
     782  Log() << Verbose(1) << "Filling polygon from line " << *line << endl;
     783  for(TriangleMap::const_iterator Runner = line->triangles.begin(); Runner != line->triangles.end(); Runner++) {
     784    for (int i=0;i<3;i++) {
     785      Tester = endpoints.insert((Runner->second)->endpoints[i]);
     786      if (Tester.second)
     787        Log() << Verbose(1) << "  Inserting endpoint " << *((Runner->second)->endpoints[i]) << endl;
     788    }
     789  }
     790
     791  return true;
     792};
     793
     794/** output operator for BoundaryPolygonSet.
     795 * \param &ost output stream
     796 * \param &a boundary polygon
     797 */
     798ostream &operator <<(ostream &ost, const BoundaryPolygonSet &a)
     799{
     800  ost << "[" << a.Nr << "|";
     801  for(PointSet::const_iterator Runner = a.endpoints.begin(); Runner != a.endpoints.end();) {
     802   ost << (*Runner)->node->Name;
     803   Runner++;
     804   if (Runner != a.endpoints.end())
     805     ost << ",";
     806  }
     807  ost<< "]";
     808  return ost;
     809};
     810
    541811// =========================================================== class TESSELPOINT ===========================================
    542812
     
    545815TesselPoint::TesselPoint()
    546816{
     817  Info FunctionInfo(__func__);
    547818  node = NULL;
    548819  nr = -1;
     
    554825TesselPoint::~TesselPoint()
    555826{
     827  Info FunctionInfo(__func__);
    556828};
    557829
     
    568840ostream & TesselPoint::operator << (ostream &ost)
    569841{
    570   ost << "[" << (Name) << "|" << this << "]";
     842        Info FunctionInfo(__func__);
     843  ost << "[" << (nr) << "|" << this << "]";
    571844  return ost;
    572845};
     
    579852PointCloud::PointCloud()
    580853{
    581 
     854        Info FunctionInfo(__func__);
    582855};
    583856
     
    586859PointCloud::~PointCloud()
    587860{
    588 
     861        Info FunctionInfo(__func__);
    589862};
    590863
     
    593866/** Constructor of class CandidateForTesselation.
    594867 */
    595 CandidateForTesselation::CandidateForTesselation(TesselPoint *candidate, BoundaryLineSet* line, Vector OptCandidateCenter, Vector OtherOptCandidateCenter) {
    596   point = candidate;
    597   BaseLine = line;
     868CandidateForTesselation::CandidateForTesselation (BoundaryLineSet* line) :
     869  BaseLine(line),
     870  ShortestAngle(2.*M_PI),
     871  OtherShortestAngle(2.*M_PI)
     872{
     873        Info FunctionInfo(__func__);
     874};
     875
     876
     877/** Constructor of class CandidateForTesselation.
     878 */
     879CandidateForTesselation::CandidateForTesselation (TesselPoint *candidate, BoundaryLineSet* line, Vector OptCandidateCenter, Vector OtherOptCandidateCenter) :
     880    BaseLine(line),
     881    ShortestAngle(2.*M_PI),
     882    OtherShortestAngle(2.*M_PI)
     883{
     884        Info FunctionInfo(__func__);
    598885  OptCenter.CopyVector(&OptCandidateCenter);
    599886  OtherOptCenter.CopyVector(&OtherOptCandidateCenter);
     
    603890 */
    604891CandidateForTesselation::~CandidateForTesselation() {
    605   point = NULL;
    606892  BaseLine = NULL;
    607893};
    608894
     895/** output operator for CandidateForTesselation.
     896 * \param &ost output stream
     897 * \param &a boundary line
     898 */
     899ostream & operator <<(ostream &ost, const  CandidateForTesselation &a)
     900{
     901  ost << "[" << a.BaseLine->Nr << "|" << a.BaseLine->endpoints[0]->node->Name << "," << a.BaseLine->endpoints[1]->node->Name << "] with ";
     902  if (a.pointlist.empty())
     903    ost << "no candidate.";
     904  else {
     905    ost << "candidate";
     906    if (a.pointlist.size() != 1)
     907      ost << "s ";
     908    else
     909      ost << " ";
     910    for (TesselPointList::const_iterator Runner = a.pointlist.begin(); Runner != a.pointlist.end(); Runner++)
     911      ost << *(*Runner) << " ";
     912    ost << " at angle " << (a.ShortestAngle)<< ".";
     913  }
     914
     915  return ost;
     916};
     917
     918
    609919// =========================================================== class TESSELATION ===========================================
    610920
    611921/** Constructor of class Tesselation.
    612922 */
    613 Tesselation::Tesselation()
    614 {
    615   PointsOnBoundaryCount = 0;
    616   LinesOnBoundaryCount = 0;
    617   TrianglesOnBoundaryCount = 0;
    618   InternalPointer = PointsOnBoundary.begin();
    619   LastTriangle = NULL;
    620   TriangleFilesWritten = 0;
     923Tesselation::Tesselation() :
     924  PointsOnBoundaryCount(0),
     925  LinesOnBoundaryCount(0),
     926  TrianglesOnBoundaryCount(0),
     927  LastTriangle(NULL),
     928  TriangleFilesWritten(0),
     929  InternalPointer(PointsOnBoundary.begin())
     930{
     931        Info FunctionInfo(__func__);
    621932}
    622933;
     
    627938Tesselation::~Tesselation()
    628939{
    629   Log() << Verbose(1) << "Free'ing TesselStruct ... " << endl;
     940        Info FunctionInfo(__func__);
     941  Log() << Verbose(0) << "Free'ing TesselStruct ... " << endl;
    630942  for (TriangleMap::iterator runner = TrianglesOnBoundary.begin(); runner != TrianglesOnBoundary.end(); runner++) {
    631943    if (runner->second != NULL) {
     
    635947      eLog() << Verbose(1) << "The triangle " << runner->first << " has already been free'd." << endl;
    636948  }
    637   Log() << Verbose(1) << "This envelope was written to file " << TriangleFilesWritten << " times(s)." << endl;
     949  Log() << Verbose(0) << "This envelope was written to file " << TriangleFilesWritten << " times(s)." << endl;
    638950}
    639951;
     
    644956Vector * Tesselation::GetCenter(ofstream *out) const
    645957{
     958        Info FunctionInfo(__func__);
    646959  Vector *Center = new Vector(0.,0.,0.);
    647960  int num=0;
     
    659972TesselPoint * Tesselation::GetPoint() const
    660973{
     974        Info FunctionInfo(__func__);
    661975  return (InternalPointer->second->node);
    662976};
     
    667981TesselPoint * Tesselation::GetTerminalPoint() const
    668982{
     983        Info FunctionInfo(__func__);
    669984  PointMap::const_iterator Runner = PointsOnBoundary.end();
    670985  Runner--;
     
    677992void Tesselation::GoToNext() const
    678993{
     994        Info FunctionInfo(__func__);
    679995  if (InternalPointer != PointsOnBoundary.end())
    680996    InternalPointer++;
     
    6861002void Tesselation::GoToPrevious() const
    6871003{
     1004        Info FunctionInfo(__func__);
    6881005  if (InternalPointer != PointsOnBoundary.begin())
    6891006    InternalPointer--;
     
    6951012void Tesselation::GoToFirst() const
    6961013{
     1014        Info FunctionInfo(__func__);
    6971015  InternalPointer = PointsOnBoundary.begin();
    6981016};
     
    7031021void Tesselation::GoToLast() const
    7041022{
     1023        Info FunctionInfo(__func__);
    7051024  InternalPointer = PointsOnBoundary.end();
    7061025  InternalPointer--;
     
    7121031bool Tesselation::IsEmpty() const
    7131032{
     1033        Info FunctionInfo(__func__);
    7141034  return (PointsOnBoundary.empty());
    7151035};
     
    7201040bool Tesselation::IsEnd() const
    7211041{
     1042        Info FunctionInfo(__func__);
    7221043  return (InternalPointer == PointsOnBoundary.end());
    7231044};
     
    7321053Tesselation::GuessStartingTriangle()
    7331054{
     1055        Info FunctionInfo(__func__);
    7341056  // 4b. create a starting triangle
    7351057  // 4b1. create all distances
     
    7781100          baseline->second.first->second->node->node,
    7791101          baseline->second.second->second->node->node);
    780       Log() << Verbose(2) << "Plane vector of candidate triangle is ";
    781       PlaneVector.Output();
    782       Log() << Verbose(0) << endl;
     1102      Log() << Verbose(2) << "Plane vector of candidate triangle is " << PlaneVector << endl;
    7831103      // 4. loop over all points
    7841104      double sign = 0.;
     
    7961116          if (fabs(distance) < 1e-4) // we need to have a small epsilon around 0 which is still ok
    7971117            continue;
    798           Log() << Verbose(3) << "Projection of " << checker->second->node->Name
    799               << " yields distance of " << distance << "." << endl;
     1118          Log() << Verbose(2) << "Projection of " << checker->second->node->Name << " yields distance of " << distance << "." << endl;
    8001119          tmp = distance / fabs(distance);
    8011120          // 4b. Any have different sign to than before? (i.e. would lie outside convex hull with this starting triangle)
     
    8501169      if (checker == PointsOnBoundary.end())
    8511170        {
    852           Log() << Verbose(0) << "Looks like we have a candidate!" << endl;
     1171          Log() << Verbose(2) << "Looks like we have a candidate!" << endl;
    8531172          break;
    8541173        }
     
    8801199  else
    8811200    {
    882       Log() << Verbose(1) << "No starting triangle found." << endl;
    883       exit(255);
     1201      eLog() << Verbose(0) << "No starting triangle found." << endl;
    8841202    }
    8851203}
     
    9011219void Tesselation::TesselateOnBoundary(const PointCloud * const cloud)
    9021220{
     1221        Info FunctionInfo(__func__);
    9031222  bool flag;
    9041223  PointMap::iterator winner;
     
    9191238        // get peak point with respect to this base line's only triangle
    9201239        BTS = baseline->second->triangles.begin()->second; // there is only one triangle so far
    921         Log() << Verbose(2) << "Current baseline is between " << *(baseline->second) << "." << endl;
     1240        Log() << Verbose(0) << "Current baseline is between " << *(baseline->second) << "." << endl;
    9221241        for (int i = 0; i < 3; i++)
    9231242          if ((BTS->endpoints[i] != baseline->second->endpoints[0]) && (BTS->endpoints[i] != baseline->second->endpoints[1]))
    9241243            peak = BTS->endpoints[i];
    925         Log() << Verbose(3) << " and has peak " << *peak << "." << endl;
     1244        Log() << Verbose(1) << " and has peak " << *peak << "." << endl;
    9261245
    9271246        // prepare some auxiliary vectors
     
    9381257          CenterVector.AddVector(BTS->endpoints[i]->node->node);
    9391258        CenterVector.Scale(1. / 3.);
    940         Log() << Verbose(4) << "CenterVector of base triangle is " << CenterVector << endl;
     1259        Log() << Verbose(2) << "CenterVector of base triangle is " << CenterVector << endl;
    9411260
    9421261        // normal vector of triangle
     
    9451264        BTS->GetNormalVector(NormalVector);
    9461265        NormalVector.CopyVector(&BTS->NormalVector);
    947         Log() << Verbose(4) << "NormalVector of base triangle is " << NormalVector << endl;
     1266        Log() << Verbose(2) << "NormalVector of base triangle is " << NormalVector << endl;
    9481267
    9491268        // vector in propagation direction (out of triangle)
     
    9521271        TempVector.CopyVector(&CenterVector);
    9531272        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;
     1273        //Log() << Verbose(0) << "Projection of propagation onto temp: " << PropagationVector.Projection(&TempVector) << "." << endl;
    9551274        if (PropagationVector.ScalarProduct(&TempVector) > 0) // make sure normal propagation vector points outward from baseline
    9561275          PropagationVector.Scale(-1.);
    957         Log() << Verbose(4) << "PropagationVector of base triangle is " << PropagationVector << endl;
     1276        Log() << Verbose(2) << "PropagationVector of base triangle is " << PropagationVector << endl;
    9581277        winner = PointsOnBoundary.end();
    9591278
     
    9611280        for (PointMap::iterator target = PointsOnBoundary.begin(); target != PointsOnBoundary.end(); target++) {
    9621281          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;
     1282            Log() << Verbose(1) << "Target point is " << *(target->second) << ":" << endl;
    9641283
    9651284            // first check direction, so that triangles don't intersect
     
    9681287            VirtualNormalVector.ProjectOntoPlane(&NormalVector);
    9691288            TempAngle = VirtualNormalVector.Angle(&PropagationVector);
    970             Log() << Verbose(4) << "VirtualNormalVector is " << VirtualNormalVector << " and PropagationVector is " << PropagationVector << "." << endl;
     1289            Log() << Verbose(2) << "VirtualNormalVector is " << VirtualNormalVector << " and PropagationVector is " << PropagationVector << "." << endl;
    9711290            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;
     1291              Log() << Verbose(2) << "Angle on triangle plane between propagation direction and base line to " << *(target->second) << " is " << TempAngle << ", bad direction!" << endl;
    9731292              continue;
    9741293            } else
    975               Log() << Verbose(4) << "Angle on triangle plane between propagation direction and base line to " << *(target->second) << " is " << TempAngle << ", good direction!" << endl;
     1294              Log() << Verbose(2) << "Angle on triangle plane between propagation direction and base line to " << *(target->second) << " is " << TempAngle << ", good direction!" << endl;
    9761295
    9771296            // check first and second endpoint (if any connecting line goes to target has at least not more than 1 triangle)
     
    9791298            LineChecker[1] = baseline->second->endpoints[1]->lines.find(target->first);
    9801299            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;
     1300              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;
    9821301              continue;
    9831302            }
    9841303            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;
     1304              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;
    9861305              continue;
    9871306            }
     
    10001319            helper.ProjectOntoPlane(&TempVector);
    10011320            if (fabs(helper.NormSquared()) < MYEPSILON) {
    1002               Log() << Verbose(4) << "Chosen set of vectors is linear dependent." << endl;
     1321              Log() << Verbose(2) << "Chosen set of vectors is linear dependent." << endl;
    10031322              continue;
    10041323            }
     
    10171336            // calculate angle
    10181337            TempAngle = NormalVector.Angle(&VirtualNormalVector);
    1019             Log() << Verbose(4) << "NormalVector is " << VirtualNormalVector << " and the angle is " << TempAngle << "." << endl;
     1338            Log() << Verbose(2) << "NormalVector is " << VirtualNormalVector << " and the angle is " << TempAngle << "." << endl;
    10201339            if ((SmallestAngle - TempAngle) > MYEPSILON) { // set to new possible winner
    10211340              SmallestAngle = TempAngle;
    10221341              winner = target;
    1023               Log() << Verbose(4) << "New winner " << *winner->second->node << " due to smaller angle between normal vectors." << endl;
     1342              Log() << Verbose(2) << "New winner " << *winner->second->node << " due to smaller angle between normal vectors." << endl;
    10241343            } else if (fabs(SmallestAngle - TempAngle) < MYEPSILON) { // check the angle to propagation, both possible targets are in one plane! (their normals have same angle)
    10251344              // hence, check the angles to some normal direction from our base line but in this common plane of both targets...
     
    10391358                SmallestAngle = TempAngle;
    10401359                winner = target;
    1041                 Log() << Verbose(4) << "New winner " << *winner->second->node << " due to smaller angle " << TempAngle << " to propagation direction." << endl;
     1360                Log() << Verbose(2) << "New winner " << *winner->second->node << " due to smaller angle " << TempAngle << " to propagation direction." << endl;
    10421361              } else
    1043                 Log() << Verbose(4) << "Keeping old winner " << *winner->second->node << " due to smaller angle to propagation direction." << endl;
     1362                Log() << Verbose(2) << "Keeping old winner " << *winner->second->node << " due to smaller angle to propagation direction." << endl;
    10441363            } else
    1045               Log() << Verbose(4) << "Keeping old winner " << *winner->second->node << " due to smaller angle between normal vectors." << endl;
     1364              Log() << Verbose(2) << "Keeping old winner " << *winner->second->node << " due to smaller angle between normal vectors." << endl;
    10461365          }
    10471366        } // end of loop over all boundary points
     
    10491368        // 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
    10501369        if (winner != PointsOnBoundary.end()) {
    1051           Log() << Verbose(2) << "Winning target point is " << *(winner->second) << " with angle " << SmallestAngle << "." << endl;
     1370          Log() << Verbose(0) << "Winning target point is " << *(winner->second) << " with angle " << SmallestAngle << "." << endl;
    10521371          // create the lins of not yet present
    10531372          BLS[0] = baseline->second;
     
    10791398          TrianglesOnBoundaryCount++;
    10801399        } else {
    1081           Log() << Verbose(1) << "I could not determine a winner for this baseline " << *(baseline->second) << "." << endl;
     1400          eLog() << Verbose(2) << "I could not determine a winner for this baseline " << *(baseline->second) << "." << endl;
    10821401        }
    10831402
    10841403        // 5d. If the set of lines is not yet empty, go to 5. and continue
    10851404      } else
    1086         Log() << Verbose(2) << "Baseline candidate " << *(baseline->second) << " has a triangle count of " << baseline->second->triangles.size() << "." << endl;
     1405        Log() << Verbose(0) << "Baseline candidate " << *(baseline->second) << " has a triangle count of " << baseline->second->triangles.size() << "." << endl;
    10871406  } while (flag);
    10881407
     
    10991418bool Tesselation::InsertStraddlingPoints(const PointCloud *cloud, const LinkedCell *LC)
    11001419{
     1420        Info FunctionInfo(__func__);
    11011421  Vector Intersection, Normal;
    11021422  TesselPoint *Walker = NULL;
     
    11051425  bool AddFlag = false;
    11061426  LinkedCell *BoundaryPoints = NULL;
    1107 
    1108   Log() << Verbose(1) << "Begin of InsertStraddlingPoints" << endl;
    11091427
    11101428  cloud->GoToFirst();
     
    11171435    }
    11181436    Walker = cloud->GetPoint();
    1119     Log() << Verbose(2) << "Current point is " << *Walker << "." << endl;
     1437    Log() << Verbose(0) << "Current point is " << *Walker << "." << endl;
    11201438    // get the next triangle
    11211439    triangles = FindClosestTrianglesToPoint(Walker->node, BoundaryPoints);
    11221440    BTS = triangles->front();
    11231441    if ((triangles == NULL) || (BTS->ContainsBoundaryPoint(Walker))) {
    1124       Log() << Verbose(2) << "No triangles found, probably a tesselation point itself." << endl;
     1442      Log() << Verbose(0) << "No triangles found, probably a tesselation point itself." << endl;
    11251443      cloud->GoToNext();
    11261444      continue;
    11271445    } else {
    11281446    }
    1129     Log() << Verbose(2) << "Closest triangle is " << *BTS << "." << endl;
     1447    Log() << Verbose(0) << "Closest triangle is " << *BTS << "." << endl;
    11301448    // get the intersection point
    11311449    if (BTS->GetIntersectionInsideTriangle(Center, Walker->node, &Intersection)) {
    1132       Log() << Verbose(2) << "We have an intersection at " << Intersection << "." << endl;
     1450      Log() << Verbose(0) << "We have an intersection at " << Intersection << "." << endl;
    11331451      // we have the intersection, check whether in- or outside of boundary
    11341452      if ((Center->DistanceSquared(Walker->node) - Center->DistanceSquared(&Intersection)) < -MYEPSILON) {
    11351453        // inside, next!
    1136         Log() << Verbose(2) << *Walker << " is inside wrt triangle " << *BTS << "." << endl;
     1454        Log() << Verbose(0) << *Walker << " is inside wrt triangle " << *BTS << "." << endl;
    11371455      } else {
    11381456        // outside!
    1139         Log() << Verbose(2) << *Walker << " is outside wrt triangle " << *BTS << "." << endl;
     1457        Log() << Verbose(0) << *Walker << " is outside wrt triangle " << *BTS << "." << endl;
    11401458        class BoundaryLineSet *OldLines[3], *NewLines[3];
    11411459        class BoundaryPointSet *OldPoints[3], *NewPoint;
     
    11471465        Normal.CopyVector(&BTS->NormalVector);
    11481466        // add Walker to boundary points
    1149         Log() << Verbose(2) << "Adding " << *Walker << " to BoundaryPoints." << endl;
     1467        Log() << Verbose(0) << "Adding " << *Walker << " to BoundaryPoints." << endl;
    11501468        AddFlag = true;
    11511469        if (AddBoundaryPoint(Walker,0))
     
    11541472          continue;
    11551473        // remove triangle
    1156         Log() << Verbose(2) << "Erasing triangle " << *BTS << "." << endl;
     1474        Log() << Verbose(0) << "Erasing triangle " << *BTS << "." << endl;
    11571475        TrianglesOnBoundary.erase(BTS->Nr);
    11581476        delete(BTS);
     
    11621480          BPS[1] = OldPoints[i];
    11631481          NewLines[i] = new class BoundaryLineSet(BPS, LinesOnBoundaryCount);
    1164           Log() << Verbose(3) << "Creating new line " << *NewLines[i] << "." << endl;
     1482          Log() << Verbose(1) << "Creating new line " << *NewLines[i] << "." << endl;
    11651483          LinesOnBoundary.insert(LinePair(LinesOnBoundaryCount, NewLines[i])); // no need for check for unique insertion as BPS[0] is definitely a new one
    11661484          LinesOnBoundaryCount++;
     
    11731491            if (NewLines[j]->IsConnectedTo(BLS[0])) {
    11741492              if (n>2) {
    1175                 Log() << Verbose(1) << BLS[0] << " connects to all of the new lines?!" << endl;
     1493                eLog() << Verbose(2) << BLS[0] << " connects to all of the new lines?!" << endl;
    11761494                return false;
    11771495              } else
     
    11841502          BTS->GetNormalVector(Normal);
    11851503          Normal.Scale(-1.);
    1186           Log() << Verbose(2) << "Created new triangle " << *BTS << "." << endl;
     1504          Log() << Verbose(0) << "Created new triangle " << *BTS << "." << endl;
    11871505          TrianglesOnBoundary.insert(TrianglePair(TrianglesOnBoundaryCount, BTS));
    11881506          TrianglesOnBoundaryCount++;
     
    11981516  // exit
    11991517  delete(Center);
    1200   Log() << Verbose(1) << "End of InsertStraddlingPoints" << endl;
    12011518  return true;
    12021519};
     
    12091526bool Tesselation::AddBoundaryPoint(TesselPoint * Walker, const int n)
    12101527{
     1528        Info FunctionInfo(__func__);
    12111529  PointTestPair InsertUnique;
    12121530  BPS[n] = new class BoundaryPointSet(Walker);
     
    12301548void Tesselation::AddTesselationPoint(TesselPoint* Candidate, const int n)
    12311549{
     1550        Info FunctionInfo(__func__);
    12321551  PointTestPair InsertUnique;
    12331552  TPS[n] = new class BoundaryPointSet(Candidate);
     
    12371556  } else {
    12381557    delete TPS[n];
    1239     Log() << Verbose(4) << "Node " << *((InsertUnique.first)->second->node) << " is already present in PointsOnBoundary." << endl;
     1558    Log() << Verbose(0) << "Node " << *((InsertUnique.first)->second->node) << " is already present in PointsOnBoundary." << endl;
    12401559    TPS[n] = (InsertUnique.first)->second;
    12411560  }
     
    12501569void Tesselation::SetTesselationPoint(TesselPoint* Candidate, const int n) const
    12511570{
     1571        Info FunctionInfo(__func__);
    12521572  PointMap::const_iterator FindPoint = PointsOnBoundary.find(Candidate->nr);
    12531573  if (FindPoint != PointsOnBoundary.end())
     
    12671587  bool insertNewLine = true;
    12681588
    1269   if (a->lines.find(b->node->nr) != a->lines.end()) {
    1270     LineMap::iterator FindLine = a->lines.find(b->node->nr);
     1589  LineMap::iterator FindLine = a->lines.find(b->node->nr);
     1590  if (FindLine != a->lines.end()) {
     1591    Log() << Verbose(1) << "INFO: There is at least one line between " << *a << " and " << *b << ": " << *(FindLine->second) << "." << endl;
     1592
    12711593    pair<LineMap::iterator,LineMap::iterator> FindPair;
    12721594    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;
    12741595
    12751596    for (FindLine = FindPair.first; FindLine != FindPair.second; FindLine++) {
     
    12771598      if (FindLine->second->triangles.size() < 2) {
    12781599        insertNewLine = false;
    1279         Log() << Verbose(4) << "Using existing line " << *FindLine->second << endl;
     1600        Log() << Verbose(0) << "Using existing line " << *FindLine->second << endl;
    12801601
    12811602        BPS[0] = FindLine->second->endpoints[0];
    12821603        BPS[1] = FindLine->second->endpoints[1];
    12831604        BLS[n] = FindLine->second;
     1605
     1606        // remove existing line from OpenLines
     1607        CandidateMap::iterator CandidateLine = OpenLines.find(BLS[n]);
     1608        if (CandidateLine != OpenLines.end()) {
     1609          Log() << Verbose(1) << " Removing line from OpenLines." << endl;
     1610          delete(CandidateLine->second);
     1611          OpenLines.erase(CandidateLine);
     1612        } else {
     1613          eLog() << Verbose(1) << "Line exists and is attached to less than two triangles, but not in OpenLines!" << endl;
     1614        }
    12841615
    12851616        break;
     
    13041635void Tesselation::AlwaysAddTesselationTriangleLine(class BoundaryPointSet *a, class BoundaryPointSet *b, const int n)
    13051636{
    1306   Log() << Verbose(4) << "Adding line [" << LinesOnBoundaryCount << "|" << *(a->node) << " and " << *(b->node) << "." << endl;
     1637        Info FunctionInfo(__func__);
     1638  Log() << Verbose(0) << "Adding open line [" << LinesOnBoundaryCount << "|" << *(a->node) << " and " << *(b->node) << "." << endl;
    13071639  BPS[0] = a;
    13081640  BPS[1] = b;
     
    13121644  // increase counter
    13131645  LinesOnBoundaryCount++;
     1646  // also add to open lines
     1647  CandidateForTesselation *CFT = new CandidateForTesselation(BLS[n]);
     1648  OpenLines.insert(pair< BoundaryLineSet *, CandidateForTesselation *> (BLS[n], CFT));
    13141649};
    13151650
     
    13191654void Tesselation::AddTesselationTriangle()
    13201655{
     1656        Info FunctionInfo(__func__);
    13211657  Log() << Verbose(1) << "Adding triangle to global TrianglesOnBoundary map." << endl;
    13221658
     
    13371673void Tesselation::AddTesselationTriangle(const int nr)
    13381674{
    1339   Log() << Verbose(1) << "Adding triangle to global TrianglesOnBoundary map." << endl;
     1675        Info FunctionInfo(__func__);
     1676  Log() << Verbose(0) << "Adding triangle to global TrianglesOnBoundary map." << endl;
    13401677
    13411678  // add triangle to global map
     
    13551692void Tesselation::RemoveTesselationTriangle(class BoundaryTriangleSet *triangle)
    13561693{
     1694        Info FunctionInfo(__func__);
    13571695  if (triangle == NULL)
    13581696    return;
    13591697  for (int i = 0; i < 3; i++) {
    13601698    if (triangle->lines[i] != NULL) {
    1361       Log() << Verbose(5) << "Removing triangle Nr." << triangle->Nr << " in line " << *triangle->lines[i] << "." << endl;
     1699      Log() << Verbose(0) << "Removing triangle Nr." << triangle->Nr << " in line " << *triangle->lines[i] << "." << endl;
    13621700      triangle->lines[i]->triangles.erase(triangle->Nr);
    13631701      if (triangle->lines[i]->triangles.empty()) {
    1364           Log() << Verbose(5) << *triangle->lines[i] << " is no more attached to any triangle, erasing." << endl;
     1702          Log() << Verbose(0) << *triangle->lines[i] << " is no more attached to any triangle, erasing." << endl;
    13651703          RemoveTesselationLine(triangle->lines[i]);
    13661704      } else {
    1367         Log() << Verbose(5) << *triangle->lines[i] << " is still attached to another triangle: ";
     1705        Log() << Verbose(0) << *triangle->lines[i] << " is still attached to another triangle: ";
     1706        OpenLines.insert(pair< BoundaryLineSet *, CandidateForTesselation *> (triangle->lines[i], NULL));
    13681707        for(TriangleMap::iterator TriangleRunner = triangle->lines[i]->triangles.begin(); TriangleRunner != triangle->lines[i]->triangles.end(); TriangleRunner++)
    13691708          Log() << Verbose(0) << "[" << (TriangleRunner->second)->Nr << "|" << *((TriangleRunner->second)->endpoints[0]) << ", " << *((TriangleRunner->second)->endpoints[1]) << ", " << *((TriangleRunner->second)->endpoints[2]) << "] \t";
    13701709        Log() << Verbose(0) << endl;
    13711710//        for (int j=0;j<2;j++) {
    1372 //          Log() << Verbose(5) << "Lines of endpoint " << *(triangle->lines[i]->endpoints[j]) << ": ";
     1711//          Log() << Verbose(0) << "Lines of endpoint " << *(triangle->lines[i]->endpoints[j]) << ": ";
    13731712//          for(LineMap::iterator LineRunner = triangle->lines[i]->endpoints[j]->lines.begin(); LineRunner != triangle->lines[i]->endpoints[j]->lines.end(); LineRunner++)
    13741713//            Log() << Verbose(0) << "[" << *(LineRunner->second) << "] \t";
     
    13821721
    13831722  if (TrianglesOnBoundary.erase(triangle->Nr))
    1384     Log() << Verbose(5) << "Removing triangle Nr. " << triangle->Nr << "." << endl;
     1723    Log() << Verbose(0) << "Removing triangle Nr. " << triangle->Nr << "." << endl;
    13851724  delete(triangle);
    13861725};
     
    13921731void Tesselation::RemoveTesselationLine(class BoundaryLineSet *line)
    13931732{
     1733        Info FunctionInfo(__func__);
    13941734  int Numbers[2];
    13951735
     
    14121752        for (LineMap::iterator Runner = erasor.first; Runner != erasor.second; Runner++)
    14131753          if ((*Runner).second == line) {
    1414             Log() << Verbose(5) << "Removing Line Nr. " << line->Nr << " in boundary point " << *line->endpoints[i] << "." << endl;
     1754            Log() << Verbose(0) << "Removing Line Nr. " << line->Nr << " in boundary point " << *line->endpoints[i] << "." << endl;
    14151755            line->endpoints[i]->lines.erase(Runner);
    14161756            break;
     
    14181758      } else { // there's just a single line left
    14191759        if (line->endpoints[i]->lines.erase(line->Nr))
    1420           Log() << Verbose(5) << "Removing Line Nr. " << line->Nr << " in boundary point " << *line->endpoints[i] << "." << endl;
     1760          Log() << Verbose(0) << "Removing Line Nr. " << line->Nr << " in boundary point " << *line->endpoints[i] << "." << endl;
    14211761      }
    14221762      if (line->endpoints[i]->lines.empty()) {
    1423         Log() << Verbose(5) << *line->endpoints[i] << " has no more lines it's attached to, erasing." << endl;
     1763        Log() << Verbose(0) << *line->endpoints[i] << " has no more lines it's attached to, erasing." << endl;
    14241764        RemoveTesselationPoint(line->endpoints[i]);
    14251765      } else {
    1426         Log() << Verbose(5) << *line->endpoints[i] << " has still lines it's attached to: ";
     1766        Log() << Verbose(0) << *line->endpoints[i] << " has still lines it's attached to: ";
    14271767        for(LineMap::iterator LineRunner = line->endpoints[i]->lines.begin(); LineRunner != line->endpoints[i]->lines.end(); LineRunner++)
    14281768          Log() << Verbose(0) << "[" << *(LineRunner->second) << "] \t";
     
    14371777
    14381778  if (LinesOnBoundary.erase(line->Nr))
    1439     Log() << Verbose(5) << "Removing line Nr. " << line->Nr << "." << endl;
     1779    Log() << Verbose(0) << "Removing line Nr. " << line->Nr << "." << endl;
    14401780  delete(line);
    14411781};
     
    14481788void Tesselation::RemoveTesselationPoint(class BoundaryPointSet *point)
    14491789{
     1790        Info FunctionInfo(__func__);
    14501791  if (point == NULL)
    14511792    return;
    14521793  if (PointsOnBoundary.erase(point->Nr))
    1453     Log() << Verbose(5) << "Removing point Nr. " << point->Nr << "." << endl;
     1794    Log() << Verbose(0) << "Removing point Nr. " << point->Nr << "." << endl;
    14541795  delete(point);
    14551796};
     
    14661807int Tesselation::CheckPresenceOfTriangle(TesselPoint *Candidates[3]) const
    14671808{
     1809        Info FunctionInfo(__func__);
    14681810  int adjacentTriangleCount = 0;
    14691811  class BoundaryPointSet *Points[3];
    14701812
    1471   Log() << Verbose(2) << "Begin of CheckPresenceOfTriangle" << endl;
    14721813  // builds a triangle point set (Points) of the end points
    14731814  for (int i = 0; i < 3; i++) {
     
    14881829          for (; (FindLine != Points[i]->lines.end()) && (FindLine->first == Points[j]->node->nr); FindLine++) {
    14891830            TriangleMap *triangles = &FindLine->second->triangles;
    1490             Log() << Verbose(3) << "Current line is " << FindLine->first << ": " << *(FindLine->second) << " with triangles " << triangles << "." << endl;
     1831            Log() << Verbose(1) << "Current line is " << FindLine->first << ": " << *(FindLine->second) << " with triangles " << triangles << "." << endl;
    14911832            for (TriangleMap::const_iterator FindTriangle = triangles->begin(); FindTriangle != triangles->end(); FindTriangle++) {
    14921833              if (FindTriangle->second->IsPresentTupel(Points)) {
     
    14941835              }
    14951836            }
    1496             Log() << Verbose(3) << "end." << endl;
     1837            Log() << Verbose(1) << "end." << endl;
    14971838          }
    14981839          // 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;
     1840          //Log() << Verbose(0) << "Found " << adjacentTriangleCount << " adjacent triangles for the point set." << endl;
    15001841          //return adjacentTriangleCount;
    15011842        }
     
    15041845  }
    15051846
    1506   Log() << Verbose(2) << "Found " << adjacentTriangleCount << " adjacent triangles for the point set." << endl;
    1507   Log() << Verbose(2) << "End of CheckPresenceOfTriangle" << endl;
     1847  Log() << Verbose(0) << "Found " << adjacentTriangleCount << " adjacent triangles for the point set." << endl;
    15081848  return adjacentTriangleCount;
    15091849};
     
    15191859class BoundaryTriangleSet * Tesselation::GetPresentTriangle(TesselPoint *Candidates[3])
    15201860{
     1861        Info FunctionInfo(__func__);
    15211862  class BoundaryTriangleSet *triangle = NULL;
    15221863  class BoundaryPointSet *Points[3];
     
    15481889          }
    15491890          // 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;
     1891          //Log() << Verbose(0) << "Found " << adjacentTriangleCount << " adjacent triangles for the point set." << endl;
    15511892          //return adjacentTriangleCount;
    15521893        }
     
    15691910void Tesselation::FindStartingTriangle(const double RADIUS, const LinkedCell *LC)
    15701911{
    1571   Log() << Verbose(1) << "Begin of FindStartingTriangle\n";
     1912        Info FunctionInfo(__func__);
    15721913  int i = 0;
    1573   TesselPoint* FirstPoint = NULL;
    1574   TesselPoint* SecondPoint = NULL;
    15751914  TesselPoint* MaxPoint[NDIM];
     1915  TesselPoint* Temporary;
    15761916  double maxCoordinate[NDIM];
    1577   Vector Oben;
     1917  BoundaryLineSet BaseLine;
    15781918  Vector helper;
    15791919  Vector Chord;
    15801920  Vector SearchDirection;
    1581 
    1582   Oben.Zero();
     1921  Vector CircleCenter;  // center of the circle, i.e. of the band of sphere's centers
     1922  Vector CirclePlaneNormal; // normal vector defining the plane this circle lives in
     1923  Vector SphereCenter;
     1924  Vector NormalVector;
     1925
     1926  NormalVector.Zero();
    15831927
    15841928  for (i = 0; i < 3; i++) {
     
    15931937      for (LC->n[(i+2)%NDIM]=0;LC->n[(i+2)%NDIM]<LC->N[(i+2)%NDIM];LC->n[(i+2)%NDIM]++) {
    15941938        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;
     1939        //Log() << Verbose(1) << "Current cell is " << LC->n[0] << ", " << LC->n[1] << ", " << LC->n[2] << " with No. " << LC->index << "." << endl;
    15961940        if (List != NULL) {
    15971941          for (LinkedNodes::const_iterator Runner = List->begin();Runner != List->end();Runner++) {
    15981942            if ((*Runner)->node->x[i] > maxCoordinate[i]) {
    1599               Log() << Verbose(2) << "New maximal for axis " << i << " node is " << *(*Runner) << " at " << *(*Runner)->node << "." << endl;
     1943              Log() << Verbose(1) << "New maximal for axis " << i << " node is " << *(*Runner) << " at " << *(*Runner)->node << "." << endl;
    16001944              maxCoordinate[i] = (*Runner)->node->x[i];
    16011945              MaxPoint[i] = (*Runner);
     
    16081952  }
    16091953
    1610   Log() << Verbose(2) << "Found maximum coordinates: ";
     1954  Log() << Verbose(1) << "Found maximum coordinates: ";
    16111955  for (int i=0;i<NDIM;i++)
    16121956    Log() << Verbose(0) << i << ": " << *MaxPoint[i] << "\t";
     
    16141958
    16151959  BTS = NULL;
    1616   CandidateList *OptCandidates = new CandidateList();
    16171960  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;
     1961    NormalVector.Zero();
     1962    NormalVector.x[k] = 1.;
     1963    BaseLine.endpoints[0] = new BoundaryPointSet(MaxPoint[k]);
     1964    Log() << Verbose(0) << "Coordinates of start node at " << *BaseLine.endpoints[0]->node << "." << endl;
    16221965
    16231966    double ShortestAngle;
    1624     TesselPoint* OptCandidate = NULL;
    16251967    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.
    16261968
    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?
     1969    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_...
     1970    if (Temporary == NULL)  // have we found a second point?
    16301971      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);
     1972    BaseLine.endpoints[1] = new BoundaryPointSet(Temporary);
     1973
     1974    // construct center of circle
     1975    CircleCenter.CopyVector(BaseLine.endpoints[0]->node->node);
     1976    CircleCenter.AddVector(BaseLine.endpoints[1]->node->node);
     1977    CircleCenter.Scale(0.5);
     1978
     1979    // construct normal vector of circle
     1980    CirclePlaneNormal.CopyVector(BaseLine.endpoints[0]->node->node);
     1981    CirclePlaneNormal.SubtractVector(BaseLine.endpoints[1]->node->node);
     1982
     1983    double radius = CirclePlaneNormal.NormSquared();
     1984    double CircleRadius = sqrt(RADIUS*RADIUS - radius/4.);
     1985
     1986    NormalVector.ProjectOntoPlane(&CirclePlaneNormal);
     1987    NormalVector.Normalize();
    16381988    ShortestAngle = 2.*M_PI; // This will indicate the quadrant.
    16391989
    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)
     1990    SphereCenter.CopyVector(&NormalVector);
     1991    SphereCenter.Scale(CircleRadius);
     1992    SphereCenter.AddVector(&CircleCenter);
     1993    // Now, NormalVector and SphereCenter are two orthonormalized vectors in the plane defined by CirclePlaneNormal (not normalized)
    16471994
    16481995    // 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 ...
     1996    SearchDirection.MakeNormalVector(&CirclePlaneNormal, &NormalVector);  // whether we look "left" first or "right" first is not important ...
    16501997
    16511998    // 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     }
     1999    Log() << Verbose(0) << "Coordinates of start node at " << *BaseLine.endpoints[0]->node << "." << endl;
     2000    Log() << Verbose(0) << "Found second point is at " << *BaseLine.endpoints[1]->node << ".\n";
     2001
     2002    //Log() << Verbose(1) << "INFO: OldSphereCenter is at " << helper << ".\n";
     2003    CandidateForTesselation OptCandidates(&BaseLine);
     2004    FindThirdPointForTesselation(NormalVector, SearchDirection, SphereCenter, OptCandidates, NULL, RADIUS, LC);
     2005    Log() << Verbose(0) << "List of third Points is:" << endl;
     2006    for (TesselPointList::iterator it = OptCandidates.pointlist.begin(); it != OptCandidates.pointlist.end(); it++) {
     2007        Log() << Verbose(0) << " " << *(*it) << endl;
     2008    }
     2009
     2010    BTS = NULL;
     2011    AddCandidateTriangle(OptCandidates);
     2012//    delete(BaseLine.endpoints[0]);
     2013//    delete(BaseLine.endpoints[1]);
     2014
    16932015    if (BTS != NULL) // we have created one starting triangle
    16942016      break;
    16952017    else {
    16962018      // 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";
     2019      OptCandidates.pointlist.clear();
     2020    }
     2021  }
    17142022};
    17152023
    17162024/** Checks for a given baseline and a third point candidate whether baselines of the found triangle don't have even better candidates.
    17172025 * This is supposed to prevent early closing of the tesselation.
    1718  * \param *BaseRay baseline, i.e. not \a *OptCandidate
     2026 * \param CandidateLine CandidateForTesselation with baseline and shortestangle , i.e. not \a *OptCandidate
    17192027 * \param *ThirdNode third point in triangle, not in BoundaryLineSet::endpoints
    1720  * \param ShortestAngle path length on this circle band for the current \a *ThirdNode
    17212028 * \param RADIUS radius of sphere
    17222029 * \param *LC LinkedCell structure
    17232030 * \return true - there is a better candidate (smaller angle than \a ShortestAngle), false - no better TesselPoint candidate found
    17242031 */
    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 };
     2032//bool Tesselation::HasOtherBaselineBetterCandidate(CandidateForTesselation &CandidateLine, const TesselPoint * const ThirdNode, double RADIUS, const LinkedCell * const LC) const
     2033//{
     2034//      Info FunctionInfo(__func__);
     2035//  bool result = false;
     2036//  Vector CircleCenter;
     2037//  Vector CirclePlaneNormal;
     2038//  Vector OldSphereCenter;
     2039//  Vector SearchDirection;
     2040//  Vector helper;
     2041//  TesselPoint *OtherOptCandidate = NULL;
     2042//  double OtherShortestAngle = 2.*M_PI; // This will indicate the quadrant.
     2043//  double radius, CircleRadius;
     2044//  BoundaryLineSet *Line = NULL;
     2045//  BoundaryTriangleSet *T = NULL;
     2046//
     2047//  // check both other lines
     2048//  PointMap::const_iterator FindPoint = PointsOnBoundary.find(ThirdNode->nr);
     2049//  if (FindPoint != PointsOnBoundary.end()) {
     2050//    for (int i=0;i<2;i++) {
     2051//      LineMap::const_iterator FindLine = (FindPoint->second)->lines.find(BaseRay->endpoints[0]->node->nr);
     2052//      if (FindLine != (FindPoint->second)->lines.end()) {
     2053//        Line = FindLine->second;
     2054//        Log() << Verbose(0) << "Found line " << *Line << "." << endl;
     2055//        if (Line->triangles.size() == 1) {
     2056//          T = Line->triangles.begin()->second;
     2057//          // construct center of circle
     2058//          CircleCenter.CopyVector(Line->endpoints[0]->node->node);
     2059//          CircleCenter.AddVector(Line->endpoints[1]->node->node);
     2060//          CircleCenter.Scale(0.5);
     2061//
     2062//          // construct normal vector of circle
     2063//          CirclePlaneNormal.CopyVector(Line->endpoints[0]->node->node);
     2064//          CirclePlaneNormal.SubtractVector(Line->endpoints[1]->node->node);
     2065//
     2066//          // calculate squared radius of circle
     2067//          radius = CirclePlaneNormal.ScalarProduct(&CirclePlaneNormal);
     2068//          if (radius/4. < RADIUS*RADIUS) {
     2069//            CircleRadius = RADIUS*RADIUS - radius/4.;
     2070//            CirclePlaneNormal.Normalize();
     2071//            //Log() << Verbose(1) << "INFO: CircleCenter is at " << CircleCenter << ", CirclePlaneNormal is " << CirclePlaneNormal << " with circle radius " << sqrt(CircleRadius) << "." << endl;
     2072//
     2073//            // construct old center
     2074//            GetCenterofCircumcircle(&OldSphereCenter, *T->endpoints[0]->node->node, *T->endpoints[1]->node->node, *T->endpoints[2]->node->node);
     2075//            helper.CopyVector(&T->NormalVector);  // normal vector ensures that this is correct center of the two possible ones
     2076//            radius = Line->endpoints[0]->node->node->DistanceSquared(&OldSphereCenter);
     2077//            helper.Scale(sqrt(RADIUS*RADIUS - radius));
     2078//            OldSphereCenter.AddVector(&helper);
     2079//            OldSphereCenter.SubtractVector(&CircleCenter);
     2080//            //Log() << Verbose(1) << "INFO: OldSphereCenter is at " << OldSphereCenter << "." << endl;
     2081//
     2082//            // construct SearchDirection
     2083//            SearchDirection.MakeNormalVector(&T->NormalVector, &CirclePlaneNormal);
     2084//            helper.CopyVector(Line->endpoints[0]->node->node);
     2085//            helper.SubtractVector(ThirdNode->node);
     2086//            if (helper.ScalarProduct(&SearchDirection) < -HULLEPSILON)// ohoh, SearchDirection points inwards!
     2087//              SearchDirection.Scale(-1.);
     2088//            SearchDirection.ProjectOntoPlane(&OldSphereCenter);
     2089//            SearchDirection.Normalize();
     2090//            Log() << Verbose(1) << "INFO: SearchDirection is " << SearchDirection << "." << endl;
     2091//            if (fabs(OldSphereCenter.ScalarProduct(&SearchDirection)) > HULLEPSILON) {
     2092//              // rotated the wrong way!
     2093//              eLog() << Verbose(1) << "SearchDirection and RelativeOldSphereCenter are still not orthogonal!" << endl;
     2094//            }
     2095//
     2096//            // add third point
     2097//            FindThirdPointForTesselation(T->NormalVector, SearchDirection, OldSphereCenter, OptCandidates, ThirdNode, RADIUS, LC);
     2098//            for (TesselPointList::iterator it = OptCandidates.pointlist.begin(); it != OptCandidates.pointlist.end(); ++it) {
     2099//              if (((*it) == BaseRay->endpoints[0]->node) || ((*it) == BaseRay->endpoints[1]->node)) // skip if it's the same triangle than suggested
     2100//                continue;
     2101//              Log() << Verbose(0) << " Third point candidate is " << (*it)
     2102//              << " with circumsphere's center at " << (*it)->OptCenter << "." << endl;
     2103//              Log() << Verbose(0) << " Baseline is " << *BaseRay << endl;
     2104//
     2105//              // check whether all edges of the new triangle still have space for one more triangle (i.e. TriangleCount <2)
     2106//              TesselPoint *PointCandidates[3];
     2107//              PointCandidates[0] = (*it);
     2108//              PointCandidates[1] = BaseRay->endpoints[0]->node;
     2109//              PointCandidates[2] = BaseRay->endpoints[1]->node;
     2110//              bool check=false;
     2111//              int existentTrianglesCount = CheckPresenceOfTriangle(PointCandidates);
     2112//              // If there is no triangle, add it regularly.
     2113//              if (existentTrianglesCount == 0) {
     2114//                SetTesselationPoint((*it), 0);
     2115//                SetTesselationPoint(BaseRay->endpoints[0]->node, 1);
     2116//                SetTesselationPoint(BaseRay->endpoints[1]->node, 2);
     2117//
     2118//                if (CheckLineCriteriaForDegeneratedTriangle((const BoundaryPointSet ** const )TPS)) {
     2119//                  OtherOptCandidate = (*it);
     2120//                  check = true;
     2121//                }
     2122//              } else if ((existentTrianglesCount >= 1) && (existentTrianglesCount <= 3)) { // If there is a planar region within the structure, we need this triangle a second time.
     2123//                SetTesselationPoint((*it), 0);
     2124//                SetTesselationPoint(BaseRay->endpoints[0]->node, 1);
     2125//                SetTesselationPoint(BaseRay->endpoints[1]->node, 2);
     2126//
     2127//                // 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)
     2128//                // i.e. at least one of the three lines must be present with TriangleCount <= 1
     2129//                if (CheckLineCriteriaForDegeneratedTriangle((const BoundaryPointSet ** const)TPS)) {
     2130//                  OtherOptCandidate = (*it);
     2131//                  check = true;
     2132//                }
     2133//              }
     2134//
     2135//              if (check) {
     2136//                if (ShortestAngle > OtherShortestAngle) {
     2137//                  Log() << Verbose(0) << "There is a better candidate than " << *ThirdNode << " with " << ShortestAngle << " from baseline " << *Line << ": " << *OtherOptCandidate << " with " << OtherShortestAngle << "." << endl;
     2138//                  result = true;
     2139//                  break;
     2140//                }
     2141//              }
     2142//            }
     2143//            delete(OptCandidates);
     2144//            if (result)
     2145//              break;
     2146//          } else {
     2147//            Log() << Verbose(0) << "Circumcircle for base line " << *Line << " and base triangle " << T << " is too big!" << endl;
     2148//          }
     2149//        } else {
     2150//          eLog() << Verbose(2) << "Baseline is connected to two triangles already?" << endl;
     2151//        }
     2152//      } else {
     2153//        Log() << Verbose(1) << "No present baseline between " << BaseRay->endpoints[0] << " and candidate " << *ThirdNode << "." << endl;
     2154//      }
     2155//    }
     2156//  } else {
     2157//    eLog() << Verbose(1) << "Could not find the TesselPoint " << *ThirdNode << "." << endl;
     2158//  }
     2159//
     2160//  return result;
     2161//};
    18592162
    18602163/** This function finds a triangle to a line, adjacent to an existing one.
    18612164 * @param out output stream for debugging
    1862  * @param Line current baseline to search from
     2165 * @param CandidateLine current cadndiate baseline to search from
    18632166 * @param T current triangle which \a Line is edge of
    18642167 * @param RADIUS radius of the rolling ball
     
    18662169 * @param *LC LinkedCell structure with neighbouring points
    18672170 */
    1868 bool Tesselation::FindNextSuitableTriangle(BoundaryLineSet &Line, BoundaryTriangleSet &T, const double& RADIUS, const LinkedCell *LC)
    1869 {
    1870   Log() << Verbose(0) << "Begin of FindNextSuitableTriangle\n";
     2171bool Tesselation::FindNextSuitableTriangle(CandidateForTesselation &CandidateLine, BoundaryTriangleSet &T, const double& RADIUS, const LinkedCell *LC)
     2172{
     2173        Info FunctionInfo(__func__);
    18712174  bool result = true;
    1872   CandidateList *OptCandidates = new CandidateList();
    18732175
    18742176  Vector CircleCenter;
    18752177  Vector CirclePlaneNormal;
    1876   Vector OldSphereCenter;
     2178  Vector RelativeSphereCenter;
    18772179  Vector SearchDirection;
    18782180  Vector helper;
    18792181  TesselPoint *ThirdNode = NULL;
    18802182  LineMap::iterator testline;
    1881   double ShortestAngle = 2.*M_PI; // This will indicate the quadrant.
    18822183  double radius, CircleRadius;
    18832184
    1884   Log() << Verbose(1) << "Current baseline is " << Line << " of triangle " << T << "." << endl;
    18852185  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))
     2186    if ((T.endpoints[i]->node != CandidateLine.BaseLine->endpoints[0]->node) && (T.endpoints[i]->node != CandidateLine.BaseLine->endpoints[1]->node)) {
    18872187      ThirdNode = T.endpoints[i]->node;
     2188      break;
     2189    }
     2190  Log() << Verbose(0) << "Current baseline is " << *CandidateLine.BaseLine << " with ThirdNode " << *ThirdNode << " of triangle " << T << "." << endl;
    18882191
    18892192  // construct center of circle
    1890   CircleCenter.CopyVector(Line.endpoints[0]->node->node);
    1891   CircleCenter.AddVector(Line.endpoints[1]->node->node);
     2193  CircleCenter.CopyVector(CandidateLine.BaseLine->endpoints[0]->node->node);
     2194  CircleCenter.AddVector(CandidateLine.BaseLine->endpoints[1]->node->node);
    18922195  CircleCenter.Scale(0.5);
    18932196
    18942197  // construct normal vector of circle
    1895   CirclePlaneNormal.CopyVector(Line.endpoints[0]->node->node);
    1896   CirclePlaneNormal.SubtractVector(Line.endpoints[1]->node->node);
     2198  CirclePlaneNormal.CopyVector(CandidateLine.BaseLine->endpoints[0]->node->node);
     2199  CirclePlaneNormal.SubtractVector(CandidateLine.BaseLine->endpoints[1]->node->node);
    18972200
    18982201  // calculate squared radius of circle
    18992202  radius = CirclePlaneNormal.ScalarProduct(&CirclePlaneNormal);
    19002203  if (radius/4. < RADIUS*RADIUS) {
     2204    // construct relative sphere center with now known CircleCenter
     2205    RelativeSphereCenter.CopyVector(&T.SphereCenter);
     2206    RelativeSphereCenter.SubtractVector(&CircleCenter);
     2207
    19012208    CircleRadius = RADIUS*RADIUS - radius/4.;
    19022209    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);
     2210    Log() << Verbose(1) << "INFO: CircleCenter is at " << CircleCenter << ", CirclePlaneNormal is " << CirclePlaneNormal << " with circle radius " << sqrt(CircleRadius) << "." << endl;
     2211
     2212    Log() << Verbose(1) << "INFO: OldSphereCenter is at " << T.SphereCenter << "." << endl;
     2213
     2214    // construct SearchDirection and an "outward pointer"
     2215    SearchDirection.MakeNormalVector(&RelativeSphereCenter, &CirclePlaneNormal);
     2216    helper.CopyVector(&CircleCenter);
    19172217    helper.SubtractVector(ThirdNode->node);
    19182218    if (helper.ScalarProduct(&SearchDirection) < -HULLEPSILON)// ohoh, SearchDirection points inwards!
    19192219      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) {
     2220    Log() << Verbose(1) << "INFO: SearchDirection is " << SearchDirection << "." << endl;
     2221    if (fabs(RelativeSphereCenter.ScalarProduct(&SearchDirection)) > HULLEPSILON) {
    19242222      // rotated the wrong way!
    19252223      eLog() << Verbose(1) << "SearchDirection and RelativeOldSphereCenter are still not orthogonal!" << endl;
     
    19272225
    19282226    // add third point
    1929     FindThirdPointForTesselation(T.NormalVector, SearchDirection, OldSphereCenter, &Line, ThirdNode, OptCandidates, &ShortestAngle, RADIUS, LC);
     2227    FindThirdPointForTesselation(T.NormalVector, SearchDirection, T.SphereCenter, CandidateLine, ThirdNode, RADIUS, LC);
    19302228
    19312229  } 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()) {
     2230    Log() << Verbose(0) << "Circumcircle for base line " << *CandidateLine.BaseLine << " and base triangle " << T << " is too big!" << endl;
     2231  }
     2232
     2233  if (CandidateLine.pointlist.empty()) {
    19362234    eLog() << Verbose(2) << "Could not find a suitable candidate." << endl;
    19372235    return false;
    19382236  }
    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";
     2237  Log() << Verbose(0) << "Third Points are: " << endl;
     2238  for (TesselPointList::iterator it = CandidateLine.pointlist.begin(); it != CandidateLine.pointlist.end(); ++it) {
     2239    Log() << Verbose(0) << " " << *(*it) << endl;
     2240  }
     2241
     2242  return true;
     2243
     2244//  BoundaryLineSet *BaseRay = CandidateLine.BaseLine;
     2245//  for (CandidateList::iterator it = OptCandidates->begin(); it != OptCandidates->end(); ++it) {
     2246//    Log() << Verbose(0) << "Third point candidate is " << *(*it)->point
     2247//    << " with circumsphere's center at " << (*it)->OptCenter << "." << endl;
     2248//    Log() << Verbose(0) << "Baseline is " << *BaseRay << endl;
     2249//
     2250//    // check whether all edges of the new triangle still have space for one more triangle (i.e. TriangleCount <2)
     2251//    TesselPoint *PointCandidates[3];
     2252//    PointCandidates[0] = (*it)->point;
     2253//    PointCandidates[1] = BaseRay->endpoints[0]->node;
     2254//    PointCandidates[2] = BaseRay->endpoints[1]->node;
     2255//    int existentTrianglesCount = CheckPresenceOfTriangle(PointCandidates);
     2256//
     2257//    BTS = NULL;
     2258//    // check for present edges and whether we reach better candidates from them
     2259//    //if (HasOtherBaselineBetterCandidate(BaseRay, (*it)->point, ShortestAngle, RADIUS, LC) ) {
     2260//    if (0) {
     2261//      result = false;
     2262//      break;
     2263//    } else {
     2264//      // If there is no triangle, add it regularly.
     2265//      if (existentTrianglesCount == 0) {
     2266//        AddTesselationPoint((*it)->point, 0);
     2267//        AddTesselationPoint(BaseRay->endpoints[0]->node, 1);
     2268//        AddTesselationPoint(BaseRay->endpoints[1]->node, 2);
     2269//
     2270//        if (CheckLineCriteriaForDegeneratedTriangle((const BoundaryPointSet ** const )TPS)) {
     2271//          CandidateLine.point = (*it)->point;
     2272//          CandidateLine.OptCenter.CopyVector(&((*it)->OptCenter));
     2273//          CandidateLine.OtherOptCenter.CopyVector(&((*it)->OtherOptCenter));
     2274//          CandidateLine.ShortestAngle = ShortestAngle;
     2275//        } else {
     2276////          eLog() << Verbose(1) << "This triangle consisting of ";
     2277////          Log() << Verbose(0) << *(*it)->point << ", ";
     2278////          Log() << Verbose(0) << *BaseRay->endpoints[0]->node << " and ";
     2279////          Log() << Verbose(0) << *BaseRay->endpoints[1]->node << " ";
     2280////          Log() << Verbose(0) << "exists and is not added, as it 0x80000000006fc150(does not seem helpful!" << endl;
     2281//          result = false;
     2282//        }
     2283//      } else if ((existentTrianglesCount >= 1) && (existentTrianglesCount <= 3)) { // If there is a planar region within the structure, we need this triangle a second time.
     2284//          AddTesselationPoint((*it)->point, 0);
     2285//          AddTesselationPoint(BaseRay->endpoints[0]->node, 1);
     2286//          AddTesselationPoint(BaseRay->endpoints[1]->node, 2);
     2287//
     2288//          // 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)
     2289//          // i.e. at least one of the three lines must be present with TriangleCount <= 1
     2290//          if (CheckLineCriteriaForDegeneratedTriangle((const BoundaryPointSet ** const)TPS) || CandidateLine.BaseLine->skipped) {
     2291//            CandidateLine.point = (*it)->point;
     2292//            CandidateLine.OptCenter.CopyVector(&(*it)->OptCenter);
     2293//            CandidateLine.OtherOptCenter.CopyVector(&(*it)->OtherOptCenter);
     2294//            CandidateLine.ShortestAngle = ShortestAngle+2.*M_PI;
     2295//
     2296//          } else {
     2297////            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;
     2298//            result = false;
     2299//          }
     2300//      } else {
     2301////        Log() << Verbose(1) << "This triangle consisting of ";
     2302////        Log() << Verbose(0) << *(*it)->point << ", ";
     2303////        Log() << Verbose(0) << *BaseRay->endpoints[0]->node << " and ";
     2304////        Log() << Verbose(0) << *BaseRay->endpoints[1]->node << " ";
     2305////        Log() << Verbose(0) << "is invalid!" << endl;
     2306//        result = false;
     2307//      }
     2308//    }
     2309//
     2310//    // set baseline to new ray from ref point (here endpoints[0]->node) to current candidate (here (*it)->point))
     2311//    BaseRay = BLS[0];
     2312//    if ((BTS != NULL) && (BTS->NormalVector.NormSquared() < MYEPSILON)) {
     2313//      eLog() << Verbose(1) << "Triangle " << *BTS << " has zero normal vector!" << endl;
     2314//      exit(255);
     2315//    }
     2316//
     2317//  }
     2318//
     2319//  // remove all candidates from the list and then the list itself
     2320//  class CandidateForTesselation *remover = NULL;
     2321//  for (CandidateList::iterator it = OptCandidates->begin(); it != OptCandidates->end(); ++it) {
     2322//    remover = *it;
     2323//    delete(remover);
     2324//  }
     2325//  delete(OptCandidates);
    20432326  return result;
     2327};
     2328
     2329/** Adds the present line and candidate point from \a &CandidateLine to the Tesselation.
     2330 * \param CandidateLine triangle to add
     2331 * \NOTE we need the copy operator here as the original CandidateForTesselation is removed in AddTesselationLine()
     2332 */
     2333void Tesselation::AddCandidateTriangle(CandidateForTesselation CandidateLine)
     2334{
     2335        Info FunctionInfo(__func__);
     2336  Vector Center;
     2337  TesselPoint * const TurningPoint = CandidateLine.BaseLine->endpoints[0]->node;
     2338
     2339  // fill the set of neighbours
     2340  Center.CopyVector(CandidateLine.BaseLine->endpoints[1]->node->node);
     2341  Center.SubtractVector(TurningPoint->node);
     2342  set<TesselPoint*> SetOfNeighbours;
     2343  SetOfNeighbours.insert(CandidateLine.BaseLine->endpoints[1]->node);
     2344  for (TesselPointList::iterator Runner = CandidateLine.pointlist.begin(); Runner != CandidateLine.pointlist.end(); Runner++)
     2345    SetOfNeighbours.insert(*Runner);
     2346  TesselPointList *connectedClosestPoints = GetCircleOfSetOfPoints(&SetOfNeighbours, TurningPoint, &Center);
     2347
     2348  // go through all angle-sorted candidates (in degenerate n-nodes case we may have to add multiple triangles)
     2349  TesselPointList::iterator Runner = connectedClosestPoints->begin();
     2350  TesselPointList::iterator Sprinter = Runner;
     2351  Sprinter++;
     2352  while(Sprinter != connectedClosestPoints->end()) {
     2353    // add the points
     2354    AddTesselationPoint(TurningPoint, 0);
     2355    AddTesselationPoint((*Runner), 1);
     2356    AddTesselationPoint((*Sprinter), 2);
     2357
     2358
     2359    // add the lines
     2360    AddTesselationLine(TPS[0], TPS[1], 0);
     2361    AddTesselationLine(TPS[0], TPS[2], 1);
     2362    AddTesselationLine(TPS[1], TPS[2], 2);
     2363
     2364    // add the triangles
     2365    BTS = new class BoundaryTriangleSet(BLS, TrianglesOnBoundaryCount);
     2366    AddTesselationTriangle();
     2367    BTS->GetCenter(&Center);
     2368    Center.SubtractVector(&CandidateLine.OptCenter);
     2369    BTS->SphereCenter.CopyVector(&CandidateLine.OptCenter);
     2370    BTS->GetNormalVector(Center);
     2371
     2372    Log() << Verbose(0) << "--> New triangle with " << *BTS << " and normal vector " << BTS->NormalVector << "." << endl;
     2373    Runner = Sprinter;
     2374    Sprinter++;
     2375  }
     2376  delete(connectedClosestPoints);
    20442377};
    20452378
     
    20532386class BoundaryPointSet *Tesselation::IsConvexRectangle(class BoundaryLineSet *Base)
    20542387{
     2388        Info FunctionInfo(__func__);
    20552389  class BoundaryPointSet *Spot = NULL;
    20562390  class BoundaryLineSet *OtherBase;
     
    20642398  OtherBase = new class BoundaryLineSet(BPS,-1);
    20652399
    2066   Log() << Verbose(3) << "INFO: Current base line is " << *Base << "." << endl;
    2067   Log() << Verbose(3) << "INFO: Other base line is " << *OtherBase << "." << endl;
     2400  Log() << Verbose(1) << "INFO: Current base line is " << *Base << "." << endl;
     2401  Log() << Verbose(1) << "INFO: Other base line is " << *OtherBase << "." << endl;
    20682402
    20692403  // get the closest point on each line to the other line
     
    20852419  delete(ClosestPoint);
    20862420  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;
     2421    Log() << Verbose(1) << "REJECT: Both SKPs have same sign: " << distance[0] << " and " << distance[1]  << ". " << *Base << "' rectangle is concave." << endl;
    20882422    if (distance[0] < distance[1]) {
    20892423      Spot = Base->endpoints[0];
     
    20932427    return Spot;
    20942428  } else {  // different sign, i.e. we are in between
    2095     Log() << Verbose(3) << "ACCEPT: Rectangle of triangles of base line " << *Base << " is convex." << endl;
     2429    Log() << Verbose(0) << "ACCEPT: Rectangle of triangles of base line " << *Base << " is convex." << endl;
    20962430    return NULL;
    20972431  }
     
    21012435void Tesselation::PrintAllBoundaryPoints(ofstream *out) const
    21022436{
     2437        Info FunctionInfo(__func__);
    21032438  // print all lines
    2104   Log() << Verbose(1) << "Printing all boundary points for debugging:" << endl;
     2439  Log() << Verbose(0) << "Printing all boundary points for debugging:" << endl;
    21052440  for (PointMap::const_iterator PointRunner = PointsOnBoundary.begin();PointRunner != PointsOnBoundary.end(); PointRunner++)
    2106     Log() << Verbose(2) << *(PointRunner->second) << endl;
     2441    Log() << Verbose(0) << *(PointRunner->second) << endl;
    21072442};
    21082443
    21092444void Tesselation::PrintAllBoundaryLines(ofstream *out) const
    21102445{
     2446        Info FunctionInfo(__func__);
    21112447  // print all lines
    2112   Log() << Verbose(1) << "Printing all boundary lines for debugging:" << endl;
     2448  Log() << Verbose(0) << "Printing all boundary lines for debugging:" << endl;
    21132449  for (LineMap::const_iterator LineRunner = LinesOnBoundary.begin(); LineRunner != LinesOnBoundary.end(); LineRunner++)
    2114     Log() << Verbose(2) << *(LineRunner->second) << endl;
     2450    Log() << Verbose(0) << *(LineRunner->second) << endl;
    21152451};
    21162452
    21172453void Tesselation::PrintAllBoundaryTriangles(ofstream *out) const
    21182454{
     2455        Info FunctionInfo(__func__);
    21192456  // print all triangles
    2120   Log() << Verbose(1) << "Printing all boundary triangles for debugging:" << endl;
     2457  Log() << Verbose(0) << "Printing all boundary triangles for debugging:" << endl;
    21212458  for (TriangleMap::const_iterator TriangleRunner = TrianglesOnBoundary.begin(); TriangleRunner != TrianglesOnBoundary.end(); TriangleRunner++)
    2122     Log() << Verbose(2) << *(TriangleRunner->second) << endl;
     2459    Log() << Verbose(0) << *(TriangleRunner->second) << endl;
    21232460};
    21242461
     
    21302467double Tesselation::PickFarthestofTwoBaselines(class BoundaryLineSet *Base)
    21312468{
     2469        Info FunctionInfo(__func__);
    21322470  class BoundaryLineSet *OtherBase;
    21332471  Vector *ClosestPoint[2];
     
    21412479  OtherBase = new class BoundaryLineSet(BPS,-1);
    21422480
    2143   Log() << Verbose(3) << "INFO: Current base line is " << *Base << "." << endl;
    2144   Log() << Verbose(3) << "INFO: Other base line is " << *OtherBase << "." << endl;
     2481  Log() << Verbose(0) << "INFO: Current base line is " << *Base << "." << endl;
     2482  Log() << Verbose(0) << "INFO: Other base line is " << *OtherBase << "." << endl;
    21452483
    21462484  // get the closest point on each line to the other line
     
    21622500
    21632501  if (Distance.NormSquared() < MYEPSILON) { // check for intersection
    2164     Log() << Verbose(3) << "REJECT: Both lines have an intersection: Nothing to do." << endl;
     2502    Log() << Verbose(0) << "REJECT: Both lines have an intersection: Nothing to do." << endl;
    21652503    return false;
    21662504  } else { // check for sign against BaseLineNormal
     
    21722510    }
    21732511    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;
     2512      Log() << Verbose(1) << "INFO: Adding NormalVector " << runner->second->NormalVector << " of triangle " << *(runner->second) << "." << endl;
    21752513      BaseLineNormal.AddVector(&(runner->second->NormalVector));
    21762514    }
     
    21782516
    21792517    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;
     2518      Log() << Verbose(0) << "ACCEPT: Other base line would be higher: Flipping baseline." << endl;
    21812519      // calculate volume summand as a general tetraeder
    21822520      return volume;
    21832521    } else {  // Base higher than OtherBase -> do nothing
    2184       Log() << Verbose(2) << "REJECT: Base line is higher: Nothing to do." << endl;
     2522      Log() << Verbose(0) << "REJECT: Base line is higher: Nothing to do." << endl;
    21852523      return 0.;
    21862524    }
     
    21972535class BoundaryLineSet * Tesselation::FlipBaseline(class BoundaryLineSet *Base)
    21982536{
     2537        Info FunctionInfo(__func__);
    21992538  class BoundaryLineSet *OldLines[4], *NewLine;
    22002539  class BoundaryPointSet *OldPoints[2];
     
    22032542  int i,m;
    22042543
    2205   Log() << Verbose(1) << "Begin of FlipBaseline" << endl;
    2206 
    22072544  // calculate NormalVector for later use
    22082545  BaseLineNormal.Zero();
     
    22122549  }
    22132550  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;
     2551    Log() << Verbose(1) << "INFO: Adding NormalVector " << runner->second->NormalVector << " of triangle " << *(runner->second) << "." << endl;
    22152552    BaseLineNormal.AddVector(&(runner->second->NormalVector));
    22162553  }
     
    22252562  i=0;
    22262563  m=0;
    2227   Log() << Verbose(3) << "The four old lines are: ";
     2564  Log() << Verbose(0) << "The four old lines are: ";
    22282565  for(TriangleMap::iterator runner = Base->triangles.begin(); runner != Base->triangles.end(); runner++)
    22292566    for (int j=0;j<3;j++) // all of their endpoints and baselines
     
    22332570      }
    22342571  Log() << Verbose(0) << endl;
    2235   Log() << Verbose(3) << "The two old points are: ";
     2572  Log() << Verbose(0) << "The two old points are: ";
    22362573  for(TriangleMap::iterator runner = Base->triangles.begin(); runner != Base->triangles.end(); runner++)
    22372574    for (int j=0;j<3;j++) // all of their endpoints and baselines
     
    22592596
    22602597  // remove triangles and baseline removes itself
    2261   Log() << Verbose(3) << "INFO: Deleting baseline " << *Base << " from global list." << endl;
     2598  Log() << Verbose(0) << "INFO: Deleting baseline " << *Base << " from global list." << endl;
    22622599  OldBaseLineNr = Base->Nr;
    22632600  m=0;
    22642601  for(TriangleMap::iterator runner = Base->triangles.begin(); runner != Base->triangles.end(); runner++) {
    2265     Log() << Verbose(3) << "INFO: Deleting triangle " << *(runner->second) << "." << endl;
     2602    Log() << Verbose(0) << "INFO: Deleting triangle " << *(runner->second) << "." << endl;
    22662603    OldTriangleNrs[m++] = runner->second->Nr;
    22672604    RemoveTesselationTriangle(runner->second);
     
    22732610  NewLine = new class BoundaryLineSet(BPS, OldBaseLineNr);
    22742611  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;
     2612  Log() << Verbose(0) << "INFO: Created new baseline " << *NewLine << "." << endl;
    22762613
    22772614  // construct new triangles with flipped baseline
     
    22882625    BTS->GetNormalVector(BaseLineNormal);
    22892626    AddTesselationTriangle(OldTriangleNrs[0]);
    2290     Log() << Verbose(3) << "INFO: Created new triangle " << *BTS << "." << endl;
     2627    Log() << Verbose(0) << "INFO: Created new triangle " << *BTS << "." << endl;
    22912628
    22922629    BLS[0] = (i==2 ? OldLines[3] : OldLines[2]);
     
    22962633    BTS->GetNormalVector(BaseLineNormal);
    22972634    AddTesselationTriangle(OldTriangleNrs[1]);
    2298     Log() << Verbose(3) << "INFO: Created new triangle " << *BTS << "." << endl;
     2635    Log() << Verbose(0) << "INFO: Created new triangle " << *BTS << "." << endl;
    22992636  } else {
    2300     Log() << Verbose(1) << "The four old lines do not connect, something's utterly wrong here!" << endl;
     2637    eLog() << Verbose(0) << "The four old lines do not connect, something's utterly wrong here!" << endl;
    23012638    return NULL;
    23022639  }
    23032640
    2304   Log() << Verbose(1) << "End of FlipBaseline" << endl;
    23052641  return NewLine;
    23062642};
     
    23172653void Tesselation::FindSecondPointForTesselation(TesselPoint* a, Vector Oben, TesselPoint*& OptCandidate, double Storage[3], double RADIUS, const LinkedCell *LC)
    23182654{
    2319   Log() << Verbose(2) << "Begin of FindSecondPointForTesselation" << endl;
     2655        Info FunctionInfo(__func__);
    23202656  Vector AngleCheck;
    23212657  class TesselPoint* Candidate = NULL;
     
    23382674    Nupper[i] = ((N[i]+1) < LC->N[i]) ? N[i]+1 : LC->N[i]-1;
    23392675  }
    2340   Log() << Verbose(3) << "LC Intervals from [" << N[0] << "<->" << LC->N[0] << ", " << N[1] << "<->" << LC->N[1] << ", " << N[2] << "<->" << LC->N[2] << "] :"
     2676  Log() << Verbose(0) << "LC Intervals from [" << N[0] << "<->" << LC->N[0] << ", " << N[1] << "<->" << LC->N[1] << ", " << N[2] << "<->" << LC->N[2] << "] :"
    23412677    << " [" << Nlower[0] << "," << Nupper[0] << "], " << " [" << Nlower[1] << "," << Nupper[1] << "], " << " [" << Nlower[2] << "," << Nupper[2] << "], " << endl;
    23422678
     
    23452681      for (LC->n[2] = Nlower[2]; LC->n[2] <= Nupper[2]; LC->n[2]++) {
    23462682        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;
     2683        //Log() << Verbose(1) << "Current cell is " << LC->n[0] << ", " << LC->n[1] << ", " << LC->n[2] << " with No. " << LC->index << "." << endl;
    23482684        if (List != NULL) {
    23492685          for (LinkedNodes::const_iterator Runner = List->begin(); Runner != List->end(); Runner++) {
     
    23762712                angle = AngleCheck.Angle(&Oben);
    23772713                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";
     2714                  //Log() << Verbose(1) << "Old values of Storage: %lf %lf \n", Storage[0], Storage[1]);
     2715                  Log() << Verbose(1) << "Current candidate is " << *Candidate << ": Is a better candidate with distance " << norm << " and angle " << angle << " to oben " << Oben << ".\n";
    23802716                  OptCandidate = Candidate;
    23812717                  Storage[0] = angle;
    2382                   //Log() << Verbose(3) << "Changing something in Storage: %lf %lf. \n", Storage[0], Storage[2]);
     2718                  //Log() << Verbose(1) << "Changing something in Storage: %lf %lf. \n", Storage[0], Storage[2]);
    23832719                } else {
    2384                   //Log() << Verbose(3) << "Current candidate is " << *Candidate << ": Looses with angle " << angle << " to a better candidate " << *OptCandidate << endl;
     2720                  //Log() << Verbose(1) << "Current candidate is " << *Candidate << ": Looses with angle " << angle << " to a better candidate " << *OptCandidate << endl;
    23852721                }
    23862722              } else {
    2387                 //Log() << Verbose(3) << "Current candidate is " << *Candidate << ": Refused due to Radius " << norm << endl;
     2723                //Log() << Verbose(1) << "Current candidate is " << *Candidate << ": Refused due to Radius " << norm << endl;
    23882724              }
    23892725            } else {
    2390               //Log() << Verbose(3) << "Current candidate is " << *Candidate << ": Candidate is equal to first endpoint." << *a << "." << endl;
     2726              //Log() << Verbose(1) << "Current candidate is " << *Candidate << ": Candidate is equal to first endpoint." << *a << "." << endl;
    23912727            }
    23922728          }
    23932729        } else {
    2394           Log() << Verbose(3) << "Linked cell list is empty." << endl;
     2730          Log() << Verbose(0) << "Linked cell list is empty." << endl;
    23952731        }
    23962732      }
    2397   Log() << Verbose(2) << "End of FindSecondPointForTesselation" << endl;
    23982733};
    23992734
     
    24242759 * @param SearchDirection general direction where to search for the next point, relative to center of BaseLine
    24252760 * @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
     2761 * @param CandidateLine CandidateForTesselation with the current base line and list of candidates and ShortestAngle
    24272762 * @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
    24302763 * @param RADIUS radius of sphere
    24312764 * @param *LC LinkedCell structure with neighbouring points
    24322765 */
    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 {
     2766void Tesselation::FindThirdPointForTesselation(Vector &NormalVector, Vector &SearchDirection, Vector &OldSphereCenter, CandidateForTesselation &CandidateLine, const class TesselPoint  * const ThirdNode, const double RADIUS, const LinkedCell *LC) const
     2767{
     2768        Info FunctionInfo(__func__);
    24352769  Vector CircleCenter;  // center of the circle, i.e. of the band of sphere's centers
    24362770  Vector CirclePlaneNormal; // normal vector defining the plane this circle lives in
     
    24402774  Vector NewNormalVector;   // normal vector of the Candidate's triangle
    24412775  Vector helper, OptCandidateCenter, OtherOptCandidateCenter;
     2776  Vector RelativeOldSphereCenter;
     2777  Vector NewPlaneCenter;
    24422778  double CircleRadius; // radius of this circle
    24432779  double radius;
     2780  double otherradius;
    24442781  double alpha, Otheralpha; // angles (i.e. parameter for the circle).
    24452782  int N[NDIM], Nlower[NDIM], Nupper[NDIM];
    24462783  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;
     2784
     2785  Log() << Verbose(1) << "INFO: NormalVector of BaseTriangle is " << NormalVector << "." << endl;
    24522786
    24532787  // construct center of circle
    2454   CircleCenter.CopyVector(BaseLine->endpoints[0]->node->node);
    2455   CircleCenter.AddVector(BaseLine->endpoints[1]->node->node);
     2788  CircleCenter.CopyVector(CandidateLine.BaseLine->endpoints[0]->node->node);
     2789  CircleCenter.AddVector(CandidateLine.BaseLine->endpoints[1]->node->node);
    24562790  CircleCenter.Scale(0.5);
    24572791
    24582792  // construct normal vector of circle
    2459   CirclePlaneNormal.CopyVector(BaseLine->endpoints[0]->node->node);
    2460   CirclePlaneNormal.SubtractVector(BaseLine->endpoints[1]->node->node);
     2793  CirclePlaneNormal.CopyVector(CandidateLine.BaseLine->endpoints[0]->node->node);
     2794  CirclePlaneNormal.SubtractVector(CandidateLine.BaseLine->endpoints[1]->node->node);
     2795
     2796  RelativeOldSphereCenter.CopyVector(&OldSphereCenter);
     2797  RelativeOldSphereCenter.SubtractVector(&CircleCenter);
    24612798
    24622799  // calculate squared radius TesselPoint *ThirdNode,f circle
    2463   radius = CirclePlaneNormal.ScalarProduct(&CirclePlaneNormal);
    2464   if (radius/4. < RADIUS*RADIUS) {
    2465     CircleRadius = RADIUS*RADIUS - radius/4.;
     2800  radius = CirclePlaneNormal.NormSquared()/4.;
     2801  if (radius < RADIUS*RADIUS) {
     2802    CircleRadius = RADIUS*RADIUS - radius;
    24662803    CirclePlaneNormal.Normalize();
    2467     //Log() << Verbose(2) << "INFO: CircleCenter is at " << CircleCenter << ", CirclePlaneNormal is " << CirclePlaneNormal << " with circle radius " << sqrt(CircleRadius) << "." << endl;
     2804    Log() << Verbose(1) << "INFO: CircleCenter is at " << CircleCenter << ", CirclePlaneNormal is " << CirclePlaneNormal << " with circle radius " << sqrt(CircleRadius) << "." << endl;
    24682805
    24692806    // 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);
     2807    if (fabs(RelativeOldSphereCenter.ScalarProduct(&CirclePlaneNormal)) > HULLEPSILON) {
     2808      eLog() << Verbose(1) << "Something's very wrong here: RelativeOldSphereCenter is not on the band's plane as desired by " << fabs(RelativeOldSphereCenter.ScalarProduct(&CirclePlaneNormal)) << "!" << endl;
     2809      RelativeOldSphereCenter.ProjectOntoPlane(&CirclePlaneNormal);
     2810    }
     2811    radius = RelativeOldSphereCenter.NormSquared();
    24752812    if (fabs(radius - CircleRadius) < HULLEPSILON) {
    2476       //Log() << Verbose(2) << "INFO: OldSphereCenter is at " << OldSphereCenter << "." << endl;
     2813      Log() << Verbose(1) << "INFO: RelativeOldSphereCenter is at " << RelativeOldSphereCenter << "." << endl;
    24772814
    24782815      // check SearchDirection
    2479       //Log() << Verbose(2) << "INFO: SearchDirection is " << SearchDirection << "." << endl;
    2480       if (fabs(OldSphereCenter.ScalarProduct(&SearchDirection)) > HULLEPSILON) {  // rotated the wrong way!
     2816      Log() << Verbose(1) << "INFO: SearchDirection is " << SearchDirection << "." << endl;
     2817      if (fabs(RelativeOldSphereCenter.ScalarProduct(&SearchDirection)) > HULLEPSILON) {  // rotated the wrong way!
    24812818        eLog() << Verbose(1) << "SearchDirection and RelativeOldSphereCenter are not orthogonal!" << endl;
    24822819      }
     
    24862823        for(int i=0;i<NDIM;i++) // store indices of this cell
    24872824        N[i] = LC->n[i];
    2488         //Log() << Verbose(2) << "INFO: Center cell is " << N[0] << ", " << N[1] << ", " << N[2] << " with No. " << LC->index << "." << endl;
     2825        //Log() << Verbose(1) << "INFO: Center cell is " << N[0] << ", " << N[1] << ", " << N[2] << " with No. " << LC->index << "." << endl;
    24892826      } else {
    24902827        eLog() << Verbose(1) << "Vector " << CircleCenter << " is outside of LinkedCell's bounding box." << endl;
     
    24922829      }
    24932830      // then go through the current and all neighbouring cells and check the contained points for possible candidates
    2494       //Log() << Verbose(2) << "LC Intervals:";
     2831      //Log() << Verbose(1) << "LC Intervals:";
    24952832      for (int i=0;i<NDIM;i++) {
    24962833        Nlower[i] = ((N[i]-1) >= 0) ? N[i]-1 : 0;
     
    25032840          for (LC->n[2] = Nlower[2]; LC->n[2] <= Nupper[2]; LC->n[2]++) {
    25042841            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;
     2842            //Log() << Verbose(1) << "Current cell is " << LC->n[0] << ", " << LC->n[1] << ", " << LC->n[2] << " with No. " << LC->index << "." << endl;
    25062843            if (List != NULL) {
    25072844              for (LinkedNodes::const_iterator Runner = List->begin(); Runner != List->end(); Runner++) {
     
    25092846
    25102847                // 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)
     2848                Log() << Verbose(2) << "INFO: Current Candidate is " << *Candidate << " for BaseLine " << *CandidateLine.BaseLine << " with OldSphereCenter " << OldSphereCenter << "." << endl;
     2849                if ((Candidate != CandidateLine.BaseLine->endpoints[0]->node) && (Candidate != CandidateLine.BaseLine->endpoints[1]->node) ){
     2850
     2851                  // find center on the plane
     2852                  GetCenterofCircumcircle(&NewPlaneCenter, *CandidateLine.BaseLine->endpoints[0]->node->node, *CandidateLine.BaseLine->endpoints[1]->node->node, *Candidate->node);
     2853                  Log() << Verbose(1) << "INFO: NewPlaneCenter is " << NewPlaneCenter << "." << endl;
     2854
     2855                  if (NewNormalVector.MakeNormalVector(CandidateLine.BaseLine->endpoints[0]->node->node, CandidateLine.BaseLine->endpoints[1]->node->node, Candidate->node)
     2856                  && (fabs(NewNormalVector.NormSquared()) > HULLEPSILON)
    25202857                  ) {
    2521                     helper.CopyVector(&NewNormalVector);
    2522                     //Log() << Verbose(2) << "INFO: NewNormalVector is " << NewNormalVector << "." << endl;
    2523                     radius = BaseLine->endpoints[0]->node->node->DistanceSquared(&NewSphereCenter);
     2858                    Log() << Verbose(1) << "INFO: NewNormalVector is " << NewNormalVector << "." << endl;
     2859                    radius = CandidateLine.BaseLine->endpoints[0]->node->node->DistanceSquared(&NewPlaneCenter);
     2860                    Log() << Verbose(1) << "INFO: CircleCenter is at " << CircleCenter << ", CirclePlaneNormal is " << CirclePlaneNormal << " with circle radius " << sqrt(CircleRadius) << "." << endl;
     2861                    Log() << Verbose(1) << "INFO: SearchDirection is " << SearchDirection << "." << endl;
     2862                    Log() << Verbose(1) << "INFO: Radius of CircumCenterCircle is " << radius << "." << endl;
    25242863                    if (radius < RADIUS*RADIUS) {
     2864                      otherradius = CandidateLine.BaseLine->endpoints[1]->node->node->DistanceSquared(&NewPlaneCenter);
     2865                      if (fabs(radius - otherradius) > HULLEPSILON) {
     2866                        eLog() << Verbose(1) << "Distance to center of circumcircle is not the same from each corner of the triangle: " << fabs(radius-otherradius) << endl;
     2867                      }
     2868                      // construct both new centers
     2869                      NewSphereCenter.CopyVector(&NewPlaneCenter);
     2870                      OtherNewSphereCenter.CopyVector(&NewPlaneCenter);
     2871                      helper.CopyVector(&NewNormalVector);
    25252872                      helper.Scale(sqrt(RADIUS*RADIUS - radius));
    2526                       //Log() << Verbose(2) << "INFO: Distance of NewCircleCenter to NewSphereCenter is " << helper.Norm() << " with sphere radius " << RADIUS << "." << endl;
     2873                      Log() << Verbose(2) << "INFO: Distance of NewPlaneCenter " << NewPlaneCenter << " to either NewSphereCenter is " << helper.Norm() << " of vector " << helper << " with sphere radius " << RADIUS << "." << endl;
    25272874                      NewSphereCenter.AddVector(&helper);
    2528                       NewSphereCenter.SubtractVector(&CircleCenter);
    2529                       //Log() << Verbose(2) << "INFO: NewSphereCenter is at " << NewSphereCenter << "." << endl;
    2530 
     2875                      Log() << Verbose(2) << "INFO: NewSphereCenter is at " << NewSphereCenter << "." << endl;
    25312876                      // OtherNewSphereCenter is created by the same vector just in the other direction
    25322877                      helper.Scale(-1.);
    25332878                      OtherNewSphereCenter.AddVector(&helper);
    2534                       OtherNewSphereCenter.SubtractVector(&CircleCenter);
    2535                       //Log() << Verbose(2) << "INFO: OtherNewSphereCenter is at " << OtherNewSphereCenter << "." << endl;
     2879                      Log() << Verbose(2) << "INFO: OtherNewSphereCenter is at " << OtherNewSphereCenter << "." << endl;
    25362880
    25372881                      alpha = GetPathLengthonCircumCircle(CircleCenter, CirclePlaneNormal, CircleRadius, NewSphereCenter, OldSphereCenter, NormalVector, SearchDirection);
    25382882                      Otheralpha = GetPathLengthonCircumCircle(CircleCenter, CirclePlaneNormal, CircleRadius, OtherNewSphereCenter, OldSphereCenter, NormalVector, SearchDirection);
    25392883                      alpha = min(alpha, Otheralpha);
     2884
    25402885                      // if there is a better candidate, drop the current list and add the new candidate
    25412886                      // otherwise ignore the new candidate and keep the list
    2542                       if (*ShortestAngle > (alpha - HULLEPSILON)) {
    2543                         optCandidate = new CandidateForTesselation(Candidate, BaseLine, OptCandidateCenter, OtherOptCandidateCenter);
     2887                      if (CandidateLine.ShortestAngle > (alpha - HULLEPSILON)) {
    25442888                        if (fabs(alpha - Otheralpha) > MYEPSILON) {
    2545                           optCandidate->OptCenter.CopyVector(&NewSphereCenter);
    2546                           optCandidate->OtherOptCenter.CopyVector(&OtherNewSphereCenter);
     2889                          CandidateLine.OptCenter.CopyVector(&NewSphereCenter);
     2890                          CandidateLine.OtherOptCenter.CopyVector(&OtherNewSphereCenter);
    25472891                        } else {
    2548                           optCandidate->OptCenter.CopyVector(&OtherNewSphereCenter);
    2549                           optCandidate->OtherOptCenter.CopyVector(&NewSphereCenter);
     2892                          CandidateLine.OptCenter.CopyVector(&OtherNewSphereCenter);
     2893                          CandidateLine.OtherOptCenter.CopyVector(&NewSphereCenter);
    25502894                        }
    25512895                        // 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;
     2896                        if ((CandidateLine.ShortestAngle - HULLEPSILON) < alpha) {
     2897                          CandidateLine.pointlist.push_back(Candidate);
     2898                          Log() << Verbose(0) << "ACCEPT: We have found an equally good candidate: " << *(Candidate) << " with "
     2899                            << alpha << " and circumsphere's center at " << CandidateLine.OptCenter << "." << endl;
    25562900                        } else {
    25572901                          // 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;
     2902                          CandidateLine.pointlist.clear();
     2903                          CandidateLine.pointlist.push_back(Candidate);
     2904                          Log() << Verbose(0) << "ACCEPT: We have found a better candidate: " << *(Candidate) << " with "
     2905                            << alpha << " and circumsphere's center at " << CandidateLine.OptCenter << "." << endl;
    25672906                        }
    2568                         *ShortestAngle = alpha;
    2569                         //Log() << Verbose(2) << "INFO: There are " << candidates->size() << " candidates in the list now." << endl;
     2907                        CandidateLine.ShortestAngle = alpha;
     2908                        Log() << Verbose(0) << "INFO: There are " << CandidateLine.pointlist.size() << " candidates in the list now." << endl;
    25702909                      } 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;
     2910                        if ((Candidate != NULL) && (CandidateLine.pointlist.begin() != CandidateLine.pointlist.end())) {
     2911                          Log() << Verbose(1) << "REJECT: Old candidate " << *(Candidate) << " with " << CandidateLine.ShortestAngle << " is better than new one " << *Candidate << " with " << alpha << " ." << endl;
    25732912                        } else {
    2574                           //Log() << Verbose(2) << "REJECT: Candidate " << *Candidate << " with " << alpha << " was rejected." << endl;
     2913                          Log() << Verbose(1) << "REJECT: Candidate " << *Candidate << " with " << alpha << " was rejected." << endl;
    25752914                        }
    25762915                      }
    2577 
    25782916                    } else {
    2579                       //Log() << Verbose(2) << "REJECT: NewSphereCenter " << NewSphereCenter << " for " << *Candidate << " is too far away: " << radius << "." << endl;
     2917                      Log() << Verbose(1) << "REJECT: NewSphereCenter " << NewSphereCenter << " for " << *Candidate << " is too far away: " << radius << "." << endl;
    25802918                    }
    25812919                  } else {
    2582                     //Log() << Verbose(2) << "REJECT: Three points from " << *BaseLine << " and Candidate " << *Candidate << " are linear-dependent." << endl;
     2920                    Log() << Verbose(1) << "REJECT: Three points from " << *CandidateLine.BaseLine << " and Candidate " << *Candidate << " are linear-dependent." << endl;
    25832921                  }
    25842922                } else {
    25852923                  if (ThirdNode != NULL) {
    2586                     //Log() << Verbose(2) << "REJECT: Base triangle " << *BaseLine << " and " << *ThirdNode << " contains Candidate " << *Candidate << "." << endl;
     2924                    Log() << Verbose(1) << "REJECT: Base triangle " << *CandidateLine.BaseLine << " and " << *ThirdNode << " contains Candidate " << *Candidate << "." << endl;
    25872925                  } else {
    2588                     //Log() << Verbose(2) << "REJECT: Base triangle " << *BaseLine << " contains Candidate " << *Candidate << "." << endl;
     2926                    Log() << Verbose(1) << "REJECT: Base triangle " << *CandidateLine.BaseLine << " contains Candidate " << *Candidate << "." << endl;
    25892927                  }
    25902928                }
     
    25972935  } else {
    25982936    if (ThirdNode != NULL)
    2599       Log() << Verbose(2) << "Circumcircle for base line " << *BaseLine << " and third node " << *ThirdNode << " is too big!" << endl;
     2937      Log() << Verbose(1) << "Circumcircle for base line " << *CandidateLine.BaseLine << " and third node " << *ThirdNode << " is too big!" << endl;
    26002938    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;
     2939      Log() << Verbose(1) << "Circumcircle for base line " << *CandidateLine.BaseLine << " is too big!" << endl;
     2940  }
     2941
     2942  Log() << Verbose(1) << "INFO: Sorting candidate list ..." << endl;
     2943  if (CandidateLine.pointlist.size() > 1) {
     2944    CandidateLine.pointlist.unique();
     2945    CandidateLine.pointlist.sort(); //SortCandidates);
     2946  }
    26112947};
    26122948
     
    26182954class BoundaryPointSet *Tesselation::GetCommonEndpoint(const BoundaryLineSet * line1, const BoundaryLineSet * line2) const
    26192955{
     2956        Info FunctionInfo(__func__);
    26202957  const BoundaryLineSet * lines[2] = { line1, line2 };
    26212958  class BoundaryPointSet *node = NULL;
     
    26312968          { // if insertion fails, we have common endpoint
    26322969            node = OrderTest.first->second;
    2633             Log() << Verbose(5) << "Common endpoint of lines " << *line1
     2970            Log() << Verbose(1) << "Common endpoint of lines " << *line1
    26342971                << " and " << *line2 << " is: " << *node << "." << endl;
    26352972            j = 2;
     
    26482985list<BoundaryTriangleSet*> * Tesselation::FindClosestTrianglesToPoint(const Vector *x, const LinkedCell* LC) const
    26492986{
     2987        Info FunctionInfo(__func__);
    26502988  TesselPoint *trianglePoints[3];
    26512989  TesselPoint *SecondPoint = NULL;
     
    26532991
    26542992  if (LinesOnBoundary.empty()) {
    2655     Log() << Verbose(0) << "Error: There is no tesselation structure to compare the point with, please create one first.";
     2993    eLog() << Verbose(1) << "Error: There is no tesselation structure to compare the point with, please create one first.";
    26562994    return NULL;
    26572995  }
     
    26612999  // check whether closest point is "too close" :), then it's inside
    26623000  if (trianglePoints[0] == NULL) {
    2663     Log() << Verbose(2) << "Is the only point, no one else is closeby." << endl;
     3001    Log() << Verbose(0) << "Is the only point, no one else is closeby." << endl;
    26643002    return NULL;
    26653003  }
    26663004  if (trianglePoints[0]->node->DistanceSquared(x) < MYEPSILON) {
    2667     Log() << Verbose(3) << "Point is right on a tesselation point, no nearest triangle." << endl;
     3005    Log() << Verbose(1) << "Point is right on a tesselation point, no nearest triangle." << endl;
    26683006    PointMap::const_iterator PointRunner = PointsOnBoundary.find(trianglePoints[0]->nr);
    26693007    triangles = new list<BoundaryTriangleSet*>;
     
    26893027    }
    26903028  } else {
    2691     list<TesselPoint*> *connectedClosestPoints = GetCircleOfConnectedPoints(trianglePoints[0], x);
     3029    set<TesselPoint*> *connectedPoints = GetAllConnectedPoints(trianglePoints[0]);
     3030    TesselPointList *connectedClosestPoints = GetCircleOfSetOfPoints(connectedPoints, trianglePoints[0], x);
     3031    delete(connectedPoints);
    26923032    if (connectedClosestPoints != NULL) {
    26933033      trianglePoints[1] = connectedClosestPoints->front();
     
    26973037          eLog() << Verbose(1) << "IsInnerPoint encounters serious error, point " << i << " not found." << endl;
    26983038        }
    2699         //Log() << Verbose(2) << "List of triangle points:" << endl;
    2700         //Log() << Verbose(3) << *trianglePoints[i] << endl;
     3039        //Log() << Verbose(1) << "List of triangle points:" << endl;
     3040        //Log() << Verbose(2) << *trianglePoints[i] << endl;
    27013041      }
    27023042
    27033043      triangles = FindTriangles(trianglePoints);
    2704       Log() << Verbose(2) << "List of possible triangles:" << endl;
     3044      Log() << Verbose(1) << "List of possible triangles:" << endl;
    27053045      for(list<BoundaryTriangleSet*>::iterator Runner = triangles->begin(); Runner != triangles->end(); Runner++)
    2706         Log() << Verbose(3) << **Runner << endl;
     3046        Log() << Verbose(2) << **Runner << endl;
    27073047
    27083048      delete(connectedClosestPoints);
    27093049    } else {
    27103050      triangles = NULL;
    2711       Log() << Verbose(1) << "There is no circle of connected points!" << endl;
     3051      eLog() << Verbose(2) << "There is no circle of connected points!" << endl;
    27123052    }
    27133053  }
     
    27293069class BoundaryTriangleSet * Tesselation::FindClosestTriangleToPoint(const Vector *x, const LinkedCell* LC) const
    27303070{
     3071        Info FunctionInfo(__func__);
    27313072  class BoundaryTriangleSet *result = NULL;
    27323073  list<BoundaryTriangleSet*> *triangles = FindClosestTrianglesToPoint(x, LC);
     
    27383079  if (triangles->size() == 1) { // there is no degenerate case
    27393080    result = triangles->front();
    2740     Log() << Verbose(2) << "Normal Vector of this triangle is " << result->NormalVector << "." << endl;
     3081    Log() << Verbose(1) << "Normal Vector of this triangle is " << result->NormalVector << "." << endl;
    27413082  } else {
    27423083    result = triangles->front();
    27433084    result->GetCenter(&Center);
    27443085    Center.SubtractVector(x);
    2745     Log() << Verbose(2) << "Normal Vector of this front side is " << result->NormalVector << "." << endl;
     3086    Log() << Verbose(1) << "Normal Vector of this front side is " << result->NormalVector << "." << endl;
    27463087    if (Center.ScalarProduct(&result->NormalVector) < 0) {
    27473088      result = triangles->back();
    2748       Log() << Verbose(2) << "Normal Vector of this back side is " << result->NormalVector << "." << endl;
     3089      Log() << Verbose(1) << "Normal Vector of this back side is " << result->NormalVector << "." << endl;
    27493090      if (Center.ScalarProduct(&result->NormalVector) < 0) {
    27503091        eLog() << Verbose(1) << "Front and back side yield NormalVector in wrong direction!" << endl;
     
    27653106bool Tesselation::IsInnerPoint(const Vector &Point, const LinkedCell* const LC) const
    27663107{
     3108        Info FunctionInfo(__func__);
    27673109  class BoundaryTriangleSet *result = FindClosestTriangleToPoint(&Point, LC);
    27683110  Vector Center;
     
    27743116
    27753117  result->GetCenter(&Center);
    2776   Log() << Verbose(3) << "INFO: Central point of the triangle is " << Center << "." << endl;
     3118  Log() << Verbose(2) << "INFO: Central point of the triangle is " << Center << "." << endl;
    27773119  Center.SubtractVector(&Point);
    2778   Log() << Verbose(3) << "INFO: Vector from center to point to test is " << Center << "." << endl;
     3120  Log() << Verbose(2) << "INFO: Vector from center to point to test is " << Center << "." << endl;
    27793121  if (Center.ScalarProduct(&result->NormalVector) > -MYEPSILON) {
    27803122    Log() << Verbose(1) << Point << " is an inner point." << endl;
     
    27953137bool Tesselation::IsInnerPoint(const TesselPoint * const Point, const LinkedCell* const LC) const
    27963138{
     3139        Info FunctionInfo(__func__);
    27973140  return IsInnerPoint(*(Point->node), LC);
    27983141}
     
    28063149set<TesselPoint*> * Tesselation::GetAllConnectedPoints(const TesselPoint* const Point) const
    28073150{
     3151        Info FunctionInfo(__func__);
    28083152  set<TesselPoint*> *connectedPoints = new set<TesselPoint*>;
    28093153  class BoundaryPointSet *ReferencePoint = NULL;
    28103154  TesselPoint* current;
    28113155  bool takePoint = false;
    2812 
    2813   Log() << Verbose(3) << "Begin of GetAllConnectedPoints" << endl;
    28143156
    28153157  // find the respective boundary point
     
    28183160    ReferencePoint = PointRunner->second;
    28193161  } else {
    2820     Log() << Verbose(2) << "GetAllConnectedPoints() could not find the BoundaryPoint belonging to " << *Point << "." << endl;
     3162    eLog() << Verbose(2) << "GetAllConnectedPoints() could not find the BoundaryPoint belonging to " << *Point << "." << endl;
    28213163    ReferencePoint = NULL;
    28223164  }
     
    28423184
    28433185   if (takePoint) {
    2844      Log() << Verbose(5) << "INFO: Endpoint " << *current << " of line " << *(findLines->second) << " is enlisted." << endl;
     3186     Log() << Verbose(1) << "INFO: Endpoint " << *current << " of line " << *(findLines->second) << " is enlisted." << endl;
    28453187     connectedPoints->insert(current);
    28463188   }
     
    28543196  }
    28553197
    2856   Log() << Verbose(3) << "End of GetAllConnectedPoints" << endl;
    28573198  return connectedPoints;
    28583199};
     
    28663207 *
    28673208 * @param *out output stream for debugging
     3209 * @param *SetOfNeighbours all points for which the angle should be calculated
    28683210 * @param *Point of which get all connected points
    28693211 * @param *Reference Reference vector for zero angle or NULL for no preference
    28703212 * @return list of the all points linked to the provided one
    28713213 */
    2872 list<TesselPoint*> * Tesselation::GetCircleOfConnectedPoints(const TesselPoint* const Point, const Vector * const Reference) const
    2873 {
     3214list<TesselPoint*> * Tesselation::GetCircleOfSetOfPoints(set<TesselPoint*> *SetOfNeighbours, const TesselPoint* const Point, const Vector * const Reference) const
     3215{
     3216        Info FunctionInfo(__func__);
    28743217  map<double, TesselPoint*> anglesOfPoints;
    2875   set<TesselPoint*> *connectedPoints = GetAllConnectedPoints(Point);
    28763218  list<TesselPoint*> *connectedCircle = new list<TesselPoint*>;
    28773219  Vector center;
     
    28813223  Vector helper;
    28823224
    2883   if (connectedPoints == NULL) {
    2884     Log() << Verbose(2) << "Could not find any connected points!" << endl;
     3225  if (SetOfNeighbours == NULL) {
     3226    eLog() << Verbose(2) << "Could not find any connected points!" << endl;
    28853227    delete(connectedCircle);
    28863228    return NULL;
    28873229  }
    2888   Log() << Verbose(2) << "Begin of GetCircleOfConnectedPoints" << endl;
    28893230
    28903231  // calculate central point
    2891   for (set<TesselPoint*>::const_iterator TesselRunner = connectedPoints->begin(); TesselRunner != connectedPoints->end(); TesselRunner++)
     3232  for (set<TesselPoint*>::const_iterator TesselRunner = SetOfNeighbours->begin(); TesselRunner != SetOfNeighbours->end(); TesselRunner++)
    28923233    center.AddVector((*TesselRunner)->node);
    28933234  //Log() << Verbose(0) << "Summed vectors " << center << "; number of points " << connectedPoints.size()
    28943235  //  << "; 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;
     3236  center.Scale(1.0/SetOfNeighbours->size());
     3237  Log() << Verbose(1) << "INFO: Calculated center of all circle points is " << center << "." << endl;
    28973238
    28983239  // projection plane of the circle is at the closes Point and normal is pointing away from center of all circle points
     
    29003241  PlaneNormal.SubtractVector(&center);
    29013242  PlaneNormal.Normalize();
    2902   Log() << Verbose(4) << "INFO: Calculated plane normal of circle is " << PlaneNormal << "." << endl;
     3243  Log() << Verbose(1) << "INFO: Calculated plane normal of circle is " << PlaneNormal << "." << endl;
    29033244
    29043245  // construct one orthogonal vector
     
    29093250  }
    29103251  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);
     3252    Log() << Verbose(1) << "Using alternatively " << *(*SetOfNeighbours->begin())->node << " as angle 0 referencer." << endl;
     3253    AngleZero.CopyVector((*SetOfNeighbours->begin())->node);
    29133254    AngleZero.SubtractVector(Point->node);
    29143255    AngleZero.ProjectOntoPlane(&PlaneNormal);
     
    29183259    }
    29193260  }
    2920   Log() << Verbose(4) << "INFO: Reference vector on this plane representing angle 0 is " << AngleZero << "." << endl;
     3261  Log() << Verbose(1) << "INFO: Reference vector on this plane representing angle 0 is " << AngleZero << "." << endl;
    29213262  if (AngleZero.NormSquared() > MYEPSILON)
    29223263    OrthogonalVector.MakeNormalVector(&PlaneNormal, &AngleZero);
    29233264  else
    29243265    OrthogonalVector.MakeNormalVector(&PlaneNormal);
    2925   Log() << Verbose(4) << "INFO: OrthogonalVector on plane is " << OrthogonalVector << "." << endl;
     3266  Log() << Verbose(1) << "INFO: OrthogonalVector on plane is " << OrthogonalVector << "." << endl;
    29263267
    29273268  // go through all connected points and calculate angle
    2928   for (set<TesselPoint*>::iterator listRunner = connectedPoints->begin(); listRunner != connectedPoints->end(); listRunner++) {
     3269  for (set<TesselPoint*>::iterator listRunner = SetOfNeighbours->begin(); listRunner != SetOfNeighbours->end(); listRunner++) {
    29293270    helper.CopyVector((*listRunner)->node);
    29303271    helper.SubtractVector(Point->node);
    29313272    helper.ProjectOntoPlane(&PlaneNormal);
    29323273    double angle = GetAngle(helper, AngleZero, OrthogonalVector);
    2933     Log() << Verbose(3) << "INFO: Calculated angle is " << angle << " for point " << **listRunner << "." << endl;
     3274    Log() << Verbose(0) << "INFO: Calculated angle is " << angle << " for point " << **listRunner << "." << endl;
    29343275    anglesOfPoints.insert(pair<double, TesselPoint*>(angle, (*listRunner)));
    29353276  }
     
    29383279    connectedCircle->push_back(AngleRunner->second);
    29393280  }
    2940 
    2941   delete(connectedPoints);
    2942 
    2943   Log() << Verbose(2) << "End of GetCircleOfConnectedPoints" << endl;
    29443281
    29453282  return connectedCircle;
     
    29543291list<list<TesselPoint*> *> * Tesselation::GetPathsOfConnectedPoints(const TesselPoint* const Point) const
    29553292{
     3293        Info FunctionInfo(__func__);
    29563294  map<double, TesselPoint*> anglesOfPoints;
    29573295  list<list<TesselPoint*> *> *ListOfPaths = new list<list<TesselPoint*> *>;
     
    29983336        StartLine = CurrentLine;
    29993337        CurrentPoint = CurrentLine->GetOtherEndpoint(ReferencePoint);
    3000         Log() << Verbose(3)<< "INFO: Beginning path retrieval at " << *CurrentPoint << " of line " << *CurrentLine << "." << endl;
     3338        Log() << Verbose(1)<< "INFO: Beginning path retrieval at " << *CurrentPoint << " of line " << *CurrentLine << "." << endl;
    30013339        do {
    30023340          // push current one
    3003           Log() << Verbose(3) << "INFO: Putting " << *CurrentPoint << " at end of path." << endl;
     3341          Log() << Verbose(1) << "INFO: Putting " << *CurrentPoint << " at end of path." << endl;
    30043342          connectedPath->push_back(CurrentPoint->node);
    30053343
    30063344          // find next triangle
    30073345          for (TriangleMap::iterator Runner = CurrentLine->triangles.begin(); Runner != CurrentLine->triangles.end(); Runner++) {
    3008             Log() << Verbose(3) << "INFO: Inspecting triangle " << *Runner->second << "." << endl;
     3346            Log() << Verbose(1) << "INFO: Inspecting triangle " << *Runner->second << "." << endl;
    30093347            if ((Runner->second != triangle)) { // look for first triangle not equal to old one
    30103348              triangle = Runner->second;
     
    30133351                if (!TriangleRunner->second) {
    30143352                  TriangleRunner->second = true;
    3015                   Log() << Verbose(3) << "INFO: Connecting triangle is " << *triangle << "." << endl;
     3353                  Log() << Verbose(1) << "INFO: Connecting triangle is " << *triangle << "." << endl;
    30163354                  break;
    30173355                } else {
    3018                   Log() << Verbose(3) << "INFO: Skipping " << *triangle << ", as we have already visited it." << endl;
     3356                  Log() << Verbose(1) << "INFO: Skipping " << *triangle << ", as we have already visited it." << endl;
    30193357                  triangle = NULL;
    30203358                }
     
    30313369            if ((triangle->lines[i] != CurrentLine) && (triangle->lines[i]->ContainsBoundaryPoint(ReferencePoint))) { // not the current line and still containing Point
    30323370              CurrentLine = triangle->lines[i];
    3033               Log() << Verbose(3) << "INFO: Connecting line is " << *CurrentLine << "." << endl;
     3371              Log() << Verbose(1) << "INFO: Connecting line is " << *CurrentLine << "." << endl;
    30343372              break;
    30353373            }
     
    30453383        } while (CurrentLine != StartLine);
    30463384        // last point is missing, as it's on start line
    3047         Log() << Verbose(3) << "INFO: Putting " << *CurrentPoint << " at end of path." << endl;
     3385        Log() << Verbose(1) << "INFO: Putting " << *CurrentPoint << " at end of path." << endl;
    30483386        if (StartLine->GetOtherEndpoint(ReferencePoint)->node != connectedPath->back())
    30493387          connectedPath->push_back(StartLine->GetOtherEndpoint(ReferencePoint)->node);
     
    30513389        ListOfPaths->push_back(connectedPath);
    30523390      } else {
    3053         Log() << Verbose(3) << "INFO: Skipping " << *runner->second << ", as we have already visited it." << endl;
     3391        Log() << Verbose(1) << "INFO: Skipping " << *runner->second << ", as we have already visited it." << endl;
    30543392      }
    30553393    }
     
    30693407list<list<TesselPoint*> *> * Tesselation::GetClosedPathsOfConnectedPoints(const TesselPoint* const Point) const
    30703408{
     3409        Info FunctionInfo(__func__);
    30713410  list<list<TesselPoint*> *> *ListofPaths = GetPathsOfConnectedPoints(Point);
    30723411  list<list<TesselPoint*> *> *ListofClosedPaths = new list<list<TesselPoint*> *>;
     
    30823421    connectedPath = *ListRunner;
    30833422
    3084     Log() << Verbose(2) << "INFO: Current path is " << connectedPath << "." << endl;
     3423    Log() << Verbose(1) << "INFO: Current path is " << connectedPath << "." << endl;
    30853424
    30863425    // go through list, look for reappearance of starting Point and count
     
    30923431      if ((*CircleRunner == *CircleStart) && (CircleRunner != CircleStart)) { // is not the very first point
    30933432        // we have a closed circle from Marker to new Marker
    3094         Log() << Verbose(3) << count+1 << ". closed path consists of: ";
     3433        Log() << Verbose(1) << count+1 << ". closed path consists of: ";
    30953434        newPath = new list<TesselPoint*>;
    30963435        list<TesselPoint*>::iterator CircleSprinter = Marker;
     
    31083447    }
    31093448  }
    3110   Log() << Verbose(3) << "INFO: " << count << " closed additional path(s) have been created." << endl;
     3449  Log() << Verbose(1) << "INFO: " << count << " closed additional path(s) have been created." << endl;
    31113450
    31123451  // delete list of paths
     
    31303469set<BoundaryTriangleSet*> *Tesselation::GetAllTriangles(const BoundaryPointSet * const Point) const
    31313470{
     3471        Info FunctionInfo(__func__);
    31323472  set<BoundaryTriangleSet*> *connectedTriangles = new set<BoundaryTriangleSet*>;
    31333473
     
    31683508    return 0.;
    31693509  } else
    3170     Log() << Verbose(2) << "Removing point " << *point << " from tesselated boundary ..." << endl;
     3510    Log() << Verbose(0) << "Removing point " << *point << " from tesselated boundary ..." << endl;
    31713511
    31723512  // copy old location for the volume
     
    31983538  NormalVector.Zero();
    31993539  for (map<class BoundaryTriangleSet *, int>::iterator Runner = Candidates.begin(); Runner != Candidates.end(); Runner++) {
    3200     Log() << Verbose(3) << "INFO: Removing triangle " << *(Runner->first) << "." << endl;
     3540    Log() << Verbose(1) << "INFO: Removing triangle " << *(Runner->first) << "." << endl;
    32013541    NormalVector.SubtractVector(&Runner->first->NormalVector); // has to point inward
    32023542    RemoveTesselationTriangle(Runner->first);
     
    32283568        smallestangle = 0.;
    32293569        for (MiddleNode = connectedPath->begin(); MiddleNode != connectedPath->end(); MiddleNode++) {
    3230           Log() << Verbose(3) << "INFO: MiddleNode is " << **MiddleNode << "." << endl;
     3570          Log() << Verbose(1) << "INFO: MiddleNode is " << **MiddleNode << "." << endl;
    32313571          // construct vectors to next and previous neighbour
    32323572          StartNode = MiddleNode;
     
    32563596        MiddleNode = EndNode;
    32573597        if (MiddleNode == connectedPath->end()) {
    3258           Log() << Verbose(1) << "CRITICAL: Could not find a smallest angle!" << endl;
    3259           exit(255);
     3598          eLog() << Verbose(0) << "CRITICAL: Could not find a smallest angle!" << endl;
     3599          performCriticalExit();
    32603600        }
    32613601        StartNode = MiddleNode;
     
    32663606        if (EndNode == connectedPath->end())
    32673607          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;
     3608        Log() << Verbose(2) << "INFO: StartNode is " << **StartNode << "." << endl;
     3609        Log() << Verbose(2) << "INFO: MiddleNode is " << **MiddleNode << "." << endl;
     3610        Log() << Verbose(2) << "INFO: EndNode is " << **EndNode << "." << endl;
     3611        Log() << Verbose(1) << "INFO: Attempting to create triangle " << (*StartNode)->Name << ", " << (*MiddleNode)->Name << " and " << (*EndNode)->Name << "." << endl;
    32723612        TriangleCandidates[0] = *StartNode;
    32733613        TriangleCandidates[1] = *MiddleNode;
     
    32753615        triangle = GetPresentTriangle(TriangleCandidates);
    32763616        if (triangle != NULL) {
    3277           eLog() << Verbose(2) << "New triangle already present, skipping!" << endl;
     3617          eLog() << Verbose(0) << "New triangle already present, skipping!" << endl;
    32783618          StartNode++;
    32793619          MiddleNode++;
     
    32873627          continue;
    32883628        }
    3289         Log() << Verbose(5) << "Adding new triangle points."<< endl;
     3629        Log() << Verbose(3) << "Adding new triangle points."<< endl;
    32903630        AddTesselationPoint(*StartNode, 0);
    32913631        AddTesselationPoint(*MiddleNode, 1);
    32923632        AddTesselationPoint(*EndNode, 2);
    3293         Log() << Verbose(5) << "Adding new triangle lines."<< endl;
     3633        Log() << Verbose(3) << "Adding new triangle lines."<< endl;
    32943634        AddTesselationLine(TPS[0], TPS[1], 0);
    32953635        AddTesselationLine(TPS[0], TPS[2], 1);
     
    33063646        // prepare nodes for next triangle
    33073647        StartNode = EndNode;
    3308         Log() << Verbose(4) << "Removing " << **MiddleNode << " from closed path, remaining points: " << connectedPath->size() << "." << endl;
     3648        Log() << Verbose(2) << "Removing " << **MiddleNode << " from closed path, remaining points: " << connectedPath->size() << "." << endl;
    33093649        connectedPath->remove(*MiddleNode); // remove the middle node (it is surrounded by triangles)
    33103650        if (connectedPath->size() == 2) { // we are done
     
    33133653          break;
    33143654        } else if (connectedPath->size() < 2) { // something's gone wrong!
    3315           Log() << Verbose(1) << "CRITICAL: There are only two endpoints left!" << endl;
    3316           exit(255);
     3655          eLog() << Verbose(0) << "CRITICAL: There are only two endpoints left!" << endl;
     3656          performCriticalExit();
    33173657        } else {
    33183658          MiddleNode = StartNode;
     
    33423682          if (maxgain != 0) {
    33433683            volume += maxgain;
    3344             Log() << Verbose(3) << "Flipping baseline with highest volume" << **Candidate << "." << endl;
     3684            Log() << Verbose(1) << "Flipping baseline with highest volume" << **Candidate << "." << endl;
    33453685            OtherBase = FlipBaseline(*Candidate);
    33463686            NewLines.erase(Candidate);
     
    33533693      delete(connectedPath);
    33543694    }
    3355     Log() << Verbose(1) << count << " triangles were created." << endl;
     3695    Log() << Verbose(0) << count << " triangles were created." << endl;
    33563696  } else {
    33573697    while (!ListOfClosedPaths->empty()) {
     
    33613701      delete(connectedPath);
    33623702    }
    3363     Log() << Verbose(1) << "No need to create any triangles." << endl;
     3703    Log() << Verbose(0) << "No need to create any triangles." << endl;
    33643704  }
    33653705  delete(ListOfClosedPaths);
    33663706
    3367   Log() << Verbose(1) << "Removed volume is " << volume << "." << endl;
     3707  Log() << Verbose(0) << "Removed volume is " << volume << "." << endl;
    33683708
    33693709  return volume;
     
    33823722list<BoundaryTriangleSet*> *Tesselation::FindTriangles(const TesselPoint* const Points[3]) const
    33833723{
     3724        Info FunctionInfo(__func__);
    33843725  list<BoundaryTriangleSet*> *result = new list<BoundaryTriangleSet*>;
    33853726  LineMap::const_iterator FindLine;
     
    34223763}
    34233764
     3765struct BoundaryLineSetCompare {
     3766  bool operator() (const BoundaryLineSet * const a, const BoundaryLineSet * const b) {
     3767    int lowerNra = -1;
     3768    int lowerNrb = -1;
     3769
     3770    if (a->endpoints[0] < a->endpoints[1])
     3771      lowerNra = 0;
     3772    else
     3773      lowerNra = 1;
     3774
     3775    if (b->endpoints[0] < b->endpoints[1])
     3776      lowerNrb = 0;
     3777    else
     3778      lowerNrb = 1;
     3779
     3780    if (a->endpoints[lowerNra] < b->endpoints[lowerNrb])
     3781      return true;
     3782    else if (a->endpoints[lowerNra] > b->endpoints[lowerNrb])
     3783      return false;
     3784    else {  // both lower-numbered endpoints are the same ...
     3785     if (a->endpoints[(lowerNra+1)%2] < b->endpoints[(lowerNrb+1)%2])
     3786       return true;
     3787     else if (a->endpoints[(lowerNra+1)%2] > b->endpoints[(lowerNrb+1)%2])
     3788       return false;
     3789    }
     3790    return false;
     3791  };
     3792};
     3793
     3794#define UniqueLines set < class BoundaryLineSet *, BoundaryLineSetCompare>
     3795
    34243796/**
    34253797 * Finds all degenerated lines within the tesselation structure.
     
    34303802map<int, int> * Tesselation::FindAllDegeneratedLines()
    34313803{
    3432   map<int, class BoundaryLineSet *> AllLines;
     3804        Info FunctionInfo(__func__);
     3805        UniqueLines AllLines;
    34333806  map<int, int> * DegeneratedLines = new map<int, int>;
    34343807
    34353808  // sanity check
    34363809  if (LinesOnBoundary.empty()) {
    3437     Log() << Verbose(1) << "Warning: FindAllDegeneratedTriangles() was called without any tesselation structure.";
     3810    eLog() << Verbose(2) << "FindAllDegeneratedTriangles() was called without any tesselation structure.";
    34383811    return DegeneratedLines;
    34393812  }
    34403813
    34413814  LineMap::iterator LineRunner1;
    3442   pair<LineMap::iterator, bool> tester;
     3815  pair< UniqueLines::iterator, bool> tester;
    34433816  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) );
     3817    tester = AllLines.insert( LineRunner1->second );
     3818    if (!tester.second) { // found degenerated line
     3819      DegeneratedLines->insert ( pair<int, int> (LineRunner1->second->Nr, (*tester.first)->Nr) );
     3820      DegeneratedLines->insert ( pair<int, int> ((*tester.first)->Nr, LineRunner1->second->Nr) );
    34483821    }
    34493822  }
     
    34513824  AllLines.clear();
    34523825
    3453   Log() << Verbose(1) << "FindAllDegeneratedLines() found " << DegeneratedLines->size() << " lines." << endl;
     3826  Log() << Verbose(0) << "FindAllDegeneratedLines() found " << DegeneratedLines->size() << " lines." << endl;
    34543827  map<int,int>::iterator it;
    3455   for (it = DegeneratedLines->begin(); it != DegeneratedLines->end(); it++)
    3456       Log() << Verbose(2) << (*it).first << " => " << (*it).second << endl;
     3828  for (it = DegeneratedLines->begin(); it != DegeneratedLines->end(); it++) {
     3829    const LineMap::const_iterator Line1 = LinesOnBoundary.find((*it).first);
     3830    const LineMap::const_iterator Line2 = LinesOnBoundary.find((*it).second);
     3831    if (Line1 != LinesOnBoundary.end() && Line2 != LinesOnBoundary.end())
     3832      Log() << Verbose(0) << *Line1->second << " => " << *Line2->second << endl;
     3833    else
     3834      eLog() << Verbose(1) << "Either " << (*it).first << " or " << (*it).second << " are not in LinesOnBoundary!" << endl;
     3835  }
    34573836
    34583837  return DegeneratedLines;
     
    34673846map<int, int> * Tesselation::FindAllDegeneratedTriangles()
    34683847{
     3848        Info FunctionInfo(__func__);
    34693849  map<int, int> * DegeneratedLines = FindAllDegeneratedLines();
    34703850  map<int, int> * DegeneratedTriangles = new map<int, int>;
     
    34943874  delete(DegeneratedLines);
    34953875
    3496   Log() << Verbose(1) << "FindAllDegeneratedTriangles() found " << DegeneratedTriangles->size() << " triangles:" << endl;
     3876  Log() << Verbose(0) << "FindAllDegeneratedTriangles() found " << DegeneratedTriangles->size() << " triangles:" << endl;
    34973877  map<int,int>::iterator it;
    34983878  for (it = DegeneratedTriangles->begin(); it != DegeneratedTriangles->end(); it++)
    3499       Log() << Verbose(2) << (*it).first << " => " << (*it).second << endl;
     3879      Log() << Verbose(0) << (*it).first << " => " << (*it).second << endl;
    35003880
    35013881  return DegeneratedTriangles;
     
    35083888void Tesselation::RemoveDegeneratedTriangles()
    35093889{
     3890        Info FunctionInfo(__func__);
    35103891  map<int, int> * DegeneratedTriangles = FindAllDegeneratedTriangles();
    35113892  TriangleMap::iterator finder;
    35123893  BoundaryTriangleSet *triangle = NULL, *partnerTriangle = NULL;
    35133894  int count  = 0;
    3514 
    3515   Log() << Verbose(1) << "Begin of RemoveDegeneratedTriangles" << endl;
    35163895
    35173896  for (map<int, int>::iterator TriangleKeyRunner = DegeneratedTriangles->begin();
     
    35723951      // erase the pair
    35733952      count += (int) DegeneratedTriangles->erase(triangle->Nr);
    3574       Log() << Verbose(1) << "RemoveDegeneratedTriangles() removes triangle " << *triangle << "." << endl;
     3953      Log() << Verbose(0) << "RemoveDegeneratedTriangles() removes triangle " << *triangle << "." << endl;
    35753954      RemoveTesselationTriangle(triangle);
    35763955      count += (int) DegeneratedTriangles->erase(partnerTriangle->Nr);
    3577       Log() << Verbose(1) << "RemoveDegeneratedTriangles() removes triangle " << *partnerTriangle << "." << endl;
     3956      Log() << Verbose(0) << "RemoveDegeneratedTriangles() removes triangle " << *partnerTriangle << "." << endl;
    35783957      RemoveTesselationTriangle(partnerTriangle);
    35793958    } else {
    3580       Log() << Verbose(1) << "RemoveDegeneratedTriangles() does not remove triangle " << *triangle
     3959      Log() << Verbose(0) << "RemoveDegeneratedTriangles() does not remove triangle " << *triangle
    35813960        << " and its partner " << *partnerTriangle << " because it is essential for at"
    35823961        << " least one of the endpoints to be kept in the tesselation structure." << endl;
     
    35843963  }
    35853964  delete(DegeneratedTriangles);
    3586 
    3587   Log() << Verbose(1) << "RemoveDegeneratedTriangles() removed " << count << " triangles:" << endl;
    3588   Log() << Verbose(1) << "End of RemoveDegeneratedTriangles" << endl;
     3965  if (count > 0)
     3966    LastTriangle = NULL;
     3967
     3968  Log() << Verbose(0) << "RemoveDegeneratedTriangles() removed " << count << " triangles:" << endl;
    35893969}
    35903970
     
    35993979void Tesselation::AddBoundaryPointByDegeneratedTriangle(class TesselPoint *point, LinkedCell *LC)
    36003980{
    3601   Log() << Verbose(2) << "Begin of AddBoundaryPointByDegeneratedTriangle" << endl;
    3602 
     3981        Info FunctionInfo(__func__);
    36033982  // find nearest boundary point
    36043983  class TesselPoint *BackupPoint = NULL;
     
    36163995    return;
    36173996  }
    3618   Log() << Verbose(2) << "Nearest point on boundary is " << NearestPoint->Name << "." << endl;
     3997  Log() << Verbose(0) << "Nearest point on boundary is " << NearestPoint->Name << "." << endl;
    36193998
    36203999  // go through its lines and find the best one to split
     
    36494028
    36504029  // 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;
     4030  Log() << Verbose(2) << "Adding new triangle points."<< endl;
    36524031  AddTesselationPoint((BestLine->endpoints[0]->node), 0);
    36534032  AddTesselationPoint((BestLine->endpoints[1]->node), 1);
    36544033  AddTesselationPoint(point, 2);
    3655   Log() << Verbose(5) << "Adding new triangle lines."<< endl;
     4034  Log() << Verbose(2) << "Adding new triangle lines."<< endl;
    36564035  AddTesselationLine(TPS[0], TPS[1], 0);
    36574036  AddTesselationLine(TPS[0], TPS[2], 1);
     
    36604039  BTS->GetNormalVector(TempTriangle->NormalVector);
    36614040  BTS->NormalVector.Scale(-1.);
    3662   Log() << Verbose(3) << "INFO: NormalVector of new triangle is " << BTS->NormalVector << "." << endl;
     4041  Log() << Verbose(1) << "INFO: NormalVector of new triangle is " << BTS->NormalVector << "." << endl;
    36634042  AddTesselationTriangle();
    36644043
    36654044  // 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;
     4045  Log() << Verbose(2) << "Adding new triangle points."<< endl;
    36674046  AddTesselationPoint((BestLine->endpoints[0]->node), 0);
    36684047  AddTesselationPoint((BestLine->endpoints[1]->node), 1);
    36694048  AddTesselationPoint(point, 2);
    3670   Log() << Verbose(5) << "Adding new triangle lines."<< endl;
     4049  Log() << Verbose(2) << "Adding new triangle lines."<< endl;
    36714050  AddTesselationLine(TPS[0], TPS[1], 0);
    36724051  AddTesselationLine(TPS[0], TPS[2], 1);
     
    36744053  BTS = new class BoundaryTriangleSet(BLS, TrianglesOnBoundaryCount);
    36754054  BTS->GetNormalVector(TempTriangle->NormalVector);
    3676   Log() << Verbose(3) << "INFO: NormalVector of other new triangle is " << BTS->NormalVector << "." << endl;
     4055  Log() << Verbose(1) << "INFO: NormalVector of other new triangle is " << BTS->NormalVector << "." << endl;
    36774056  AddTesselationTriangle();
    36784057
     
    36814060    if ((BTS->lines[i]->ContainsBoundaryPoint(BestLine->endpoints[0])) && (BTS->lines[i]->ContainsBoundaryPoint(BestLine->endpoints[1]))) {
    36824061      if (BestLine == BTS->lines[i]){
    3683         Log() << Verbose(1) << "CRITICAL: BestLine is same as found line, something's wrong here!" << endl;
    3684         exit(255);
     4062        eLog() << Verbose(0) << "BestLine is same as found line, something's wrong here!" << endl;
     4063        performCriticalExit();
    36854064      }
    36864065      BTS->lines[i]->triangles.insert( pair<int, class BoundaryTriangleSet *> (TempTriangle->Nr, TempTriangle) );
     
    36894068    }
    36904069  }
    3691 
    3692   // exit
    3693   Log() << Verbose(2) << "End of AddBoundaryPointByDegeneratedTriangle" << endl;
    36944070};
    36954071
     
    37014077void Tesselation::Output(const char *filename, const PointCloud * const cloud)
    37024078{
     4079        Info FunctionInfo(__func__);
    37034080  ofstream *tempstream = NULL;
    37044081  string NameofTempFile;
     
    37134090      NameofTempFile.erase(npos, 1);
    37144091      NameofTempFile.append(TecplotSuffix);
    3715       Log() << Verbose(1) << "Writing temporary non convex hull to file " << NameofTempFile << ".\n";
     4092      Log() << Verbose(0) << "Writing temporary non convex hull to file " << NameofTempFile << ".\n";
    37164093      tempstream = new ofstream(NameofTempFile.c_str(), ios::trunc);
    37174094      WriteTecplotFile(tempstream, this, cloud, TriangleFilesWritten);
     
    37274104      NameofTempFile.erase(npos, 1);
    37284105      NameofTempFile.append(Raster3DSuffix);
    3729       Log() << Verbose(1) << "Writing temporary non convex hull to file " << NameofTempFile << ".\n";
     4106      Log() << Verbose(0) << "Writing temporary non convex hull to file " << NameofTempFile << ".\n";
    37304107      tempstream = new ofstream(NameofTempFile.c_str(), ios::trunc);
    37314108      WriteRaster3dFile(tempstream, this, cloud);
     
    37394116    TriangleFilesWritten++;
    37404117};
     4118
     4119struct BoundaryPolygonSetCompare {
     4120  bool operator()(const BoundaryPolygonSet * s1, const BoundaryPolygonSet * s2) const {
     4121    if (s1->endpoints.size() < s2->endpoints.size())
     4122      return true;
     4123    else if (s1->endpoints.size() > s2->endpoints.size())
     4124      return false;
     4125    else { // equality of number of endpoints
     4126      PointSet::const_iterator Walker1 = s1->endpoints.begin();
     4127      PointSet::const_iterator Walker2 = s2->endpoints.begin();
     4128      while ((Walker1 != s1->endpoints.end()) || (Walker2 != s2->endpoints.end())) {
     4129        if ((*Walker1)->Nr < (*Walker2)->Nr)
     4130          return true;
     4131        else if ((*Walker1)->Nr > (*Walker2)->Nr)
     4132          return false;
     4133        Walker1++;
     4134        Walker2++;
     4135      }
     4136      return false;
     4137    }
     4138  }
     4139};
     4140
     4141#define UniquePolygonSet set < BoundaryPolygonSet *, BoundaryPolygonSetCompare>
     4142
     4143/** Finds all degenerated polygons and calls ReTesselateDegeneratedPolygon()/
     4144 * \return number of polygons found
     4145 */
     4146int Tesselation::CorrectAllDegeneratedPolygons()
     4147{
     4148  Info FunctionInfo(__func__);
     4149
     4150  /// 2. Go through all BoundaryPointSet's, check their triangles' NormalVector
     4151  map <int, int> *DegeneratedTriangles = FindAllDegeneratedTriangles();
     4152  set < BoundaryPointSet *> EndpointCandidateList;
     4153  pair < set < BoundaryPointSet *>::iterator, bool > InsertionTester;
     4154  pair < map < int, Vector *>::iterator, bool > TriangleInsertionTester;
     4155  for (PointMap::const_iterator Runner = PointsOnBoundary.begin(); Runner != PointsOnBoundary.end(); Runner++) {
     4156    Log() << Verbose(0) << "Current point is " << *Runner->second << "." << endl;
     4157    map < int, Vector *> TriangleVectors;
     4158    // gather all NormalVectors
     4159    Log() << Verbose(1) << "Gathering triangles ..." << endl;
     4160    for (LineMap::const_iterator LineRunner = (Runner->second)->lines.begin(); LineRunner != (Runner->second)->lines.end(); LineRunner++)
     4161      for (TriangleMap::const_iterator TriangleRunner = (LineRunner->second)->triangles.begin(); TriangleRunner != (LineRunner->second)->triangles.end(); TriangleRunner++) {
     4162        if (DegeneratedTriangles->find(TriangleRunner->second->Nr) == DegeneratedTriangles->end()) {
     4163          TriangleInsertionTester = TriangleVectors.insert( pair< int, Vector *> ((TriangleRunner->second)->Nr, &((TriangleRunner->second)->NormalVector)) );
     4164          if (TriangleInsertionTester.second)
     4165            Log() << Verbose(1) << " Adding triangle " << *(TriangleRunner->second) << " to triangles to check-list." << endl;
     4166        } else {
     4167          Log() << Verbose(1) << " NOT adding triangle " << *(TriangleRunner->second) << " as it's a simply degenerated one." << endl;
     4168        }
     4169      }
     4170    // check whether there are two that are parallel
     4171    Log() << Verbose(1) << "Finding two parallel triangles ..." << endl;
     4172    for (map < int, Vector *>::iterator VectorWalker = TriangleVectors.begin(); VectorWalker != TriangleVectors.end(); VectorWalker++)
     4173      for (map < int, Vector *>::iterator VectorRunner = VectorWalker; VectorRunner != TriangleVectors.end(); VectorRunner++)
     4174        if (VectorWalker != VectorRunner) { // skip equals
     4175          const double SCP = VectorWalker->second->ScalarProduct(VectorRunner->second);  // ScalarProduct should result in -1. for degenerated triangles
     4176          Log() << Verbose(1) << "Checking " << *VectorWalker->second<< " against " << *VectorRunner->second << ": " << SCP << endl;
     4177          if (fabs(SCP + 1.) < ParallelEpsilon) {
     4178            InsertionTester = EndpointCandidateList.insert((Runner->second));
     4179            if (InsertionTester.second)
     4180              Log() << Verbose(0) << " Adding " << *Runner->second << " to endpoint candidate list." << endl;
     4181            // and break out of both loops
     4182            VectorWalker = TriangleVectors.end();
     4183            VectorRunner = TriangleVectors.end();
     4184            break;
     4185          }
     4186        }
     4187  }
     4188
     4189  /// 3. Find connected endpoint candidates and put them into a polygon
     4190  UniquePolygonSet ListofDegeneratedPolygons;
     4191  BoundaryPointSet *Walker = NULL;
     4192  BoundaryPointSet *OtherWalker = NULL;
     4193  BoundaryPolygonSet *Current = NULL;
     4194  stack <BoundaryPointSet*> ToCheckConnecteds;
     4195  while (!EndpointCandidateList.empty()) {
     4196    Walker = *(EndpointCandidateList.begin());
     4197    if (Current == NULL) {  // create a new polygon with current candidate
     4198      Log() << Verbose(0) << "Starting new polygon set at point " << *Walker << endl;
     4199      Current = new BoundaryPolygonSet;
     4200      Current->endpoints.insert(Walker);
     4201      EndpointCandidateList.erase(Walker);
     4202      ToCheckConnecteds.push(Walker);
     4203    }
     4204
     4205    // go through to-check stack
     4206    while (!ToCheckConnecteds.empty()) {
     4207      Walker = ToCheckConnecteds.top(); // fetch ...
     4208      ToCheckConnecteds.pop(); // ... and remove
     4209      for (LineMap::const_iterator LineWalker = Walker->lines.begin(); LineWalker != Walker->lines.end(); LineWalker++) {
     4210        OtherWalker = (LineWalker->second)->GetOtherEndpoint(Walker);
     4211        Log() << Verbose(1) << "Checking " << *OtherWalker << endl;
     4212        set < BoundaryPointSet *>::iterator Finder = EndpointCandidateList.find(OtherWalker);
     4213        if (Finder != EndpointCandidateList.end()) {  // found a connected partner
     4214          Log() << Verbose(1) << " Adding to polygon." << endl;
     4215          Current->endpoints.insert(OtherWalker);
     4216          EndpointCandidateList.erase(Finder);  // remove from candidates
     4217          ToCheckConnecteds.push(OtherWalker);  // but check its partners too
     4218        } else {
     4219          Log() << Verbose(1) << " is not connected to " << *Walker << endl;
     4220        }
     4221      }
     4222    }
     4223
     4224    Log() << Verbose(0) << "Final polygon is " << *Current << endl;
     4225    ListofDegeneratedPolygons.insert(Current);
     4226    Current = NULL;
     4227  }
     4228
     4229  const int counter = ListofDegeneratedPolygons.size();
     4230
     4231  Log() << Verbose(0) << "The following " << counter << " degenerated polygons have been found: " << endl;
     4232  for (UniquePolygonSet::iterator PolygonRunner = ListofDegeneratedPolygons.begin(); PolygonRunner != ListofDegeneratedPolygons.end(); PolygonRunner++)
     4233    Log() << Verbose(0) << " " << **PolygonRunner << endl;
     4234
     4235  /// 4. Go through all these degenerated polygons
     4236  for (UniquePolygonSet::iterator PolygonRunner = ListofDegeneratedPolygons.begin(); PolygonRunner != ListofDegeneratedPolygons.end(); PolygonRunner++) {
     4237    stack <int> TriangleNrs;
     4238    Vector NormalVector;
     4239    /// 4a. Gather all triangles of this polygon
     4240    TriangleSet *T = (*PolygonRunner)->GetAllContainedTrianglesFromEndpoints();
     4241
     4242    // check whether number is bigger than 2, otherwise it's just a simply degenerated one and nothing to do.
     4243    if (T->size() == 2) {
     4244      Log() << Verbose(1) << " Skipping degenerated polygon, is just a (already simply degenerated) triangle." << endl;
     4245      delete(T);
     4246      continue;
     4247    }
     4248
     4249    // check whether number is even
     4250    // If this case occurs, we have to think about it!
     4251    // The Problem is probably due to two degenerated polygons being connected by a bridging, non-degenerated polygon, as somehow one node has
     4252    // connections to either polygon ...
     4253    if (T->size() % 2 != 0) {
     4254      eLog() << Verbose(0) << " degenerated polygon contains an odd number of triangles, probably contains bridging non-degenerated ones, too!" << endl;
     4255      performCriticalExit();
     4256    }
     4257
     4258    TriangleSet::iterator TriangleWalker = T->begin();  // is the inner iterator
     4259    /// 4a. Get NormalVector for one side (this is "front")
     4260    NormalVector.CopyVector(&(*TriangleWalker)->NormalVector);
     4261    Log() << Verbose(1) << "\"front\" defining triangle is " << **TriangleWalker << " and Normal vector of \"front\" side is " << NormalVector << endl;
     4262    TriangleWalker++;
     4263    TriangleSet::iterator TriangleSprinter = TriangleWalker; // is the inner advanced iterator
     4264    /// 4b. Remove all triangles whose NormalVector is in opposite direction (i.e. "back")
     4265    BoundaryTriangleSet *triangle = NULL;
     4266    while (TriangleSprinter != T->end()) {
     4267      TriangleWalker = TriangleSprinter;
     4268      triangle = *TriangleWalker;
     4269      TriangleSprinter++;
     4270      Log() << Verbose(1) << "Current triangle to test for removal: " << *triangle << endl;
     4271      if (triangle->NormalVector.ScalarProduct(&NormalVector) < 0) { // if from other side, then delete and remove from list
     4272        Log() << Verbose(1) << " Removing ... " << endl;
     4273        TriangleNrs.push(triangle->Nr);
     4274        T->erase(TriangleWalker);
     4275        RemoveTesselationTriangle(triangle);
     4276      } else
     4277        Log() << Verbose(1) << " Keeping ... " << endl;
     4278    }
     4279    /// 4c. Copy all "front" triangles but with inverse NormalVector
     4280    TriangleWalker = T->begin();
     4281    while (TriangleWalker != T->end()) {  // go through all front triangles
     4282      Log() << Verbose(1) << " Re-creating triangle " << **TriangleWalker << " with NormalVector " << (*TriangleWalker)->NormalVector << endl;
     4283      for (int i = 0; i < 3; i++)
     4284        AddTesselationPoint((*TriangleWalker)->endpoints[i]->node, i);
     4285      AddTesselationLine(TPS[0], TPS[1], 0);
     4286      AddTesselationLine(TPS[0], TPS[2], 1);
     4287      AddTesselationLine(TPS[1], TPS[2], 2);
     4288      if (TriangleNrs.empty())
     4289        eLog() << Verbose(0) << "No more free triangle numbers!" << endl;
     4290      BTS = new BoundaryTriangleSet(BLS, TriangleNrs.top()); // copy triangle ...
     4291      AddTesselationTriangle(); // ... and add
     4292      TriangleNrs.pop();
     4293      BTS->NormalVector.CopyVector(&(*TriangleWalker)->NormalVector);
     4294      BTS->NormalVector.Scale(-1.);
     4295      TriangleWalker++;
     4296    }
     4297    if (!TriangleNrs.empty()) {
     4298      eLog() << Verbose(0) << "There have been less triangles created than removed!" << endl;
     4299    }
     4300    delete(T);  // remove the triangleset
     4301  }
     4302
     4303  map<int, int> * SimplyDegeneratedTriangles = FindAllDegeneratedTriangles();
     4304  Log() << Verbose(0) << "Final list of simply degenerated triangles found, containing " << SimplyDegeneratedTriangles->size() << " triangles:" << endl;
     4305  map<int,int>::iterator it;
     4306  for (it = SimplyDegeneratedTriangles->begin(); it != SimplyDegeneratedTriangles->end(); it++)
     4307      Log() << Verbose(0) << (*it).first << " => " << (*it).second << endl;
     4308  delete(SimplyDegeneratedTriangles);
     4309
     4310  /// 5. exit
     4311  UniquePolygonSet::iterator PolygonRunner;
     4312  while (!ListofDegeneratedPolygons.empty()) {
     4313    PolygonRunner = ListofDegeneratedPolygons.begin();
     4314    delete(*PolygonRunner);
     4315    ListofDegeneratedPolygons.erase(PolygonRunner);
     4316  }
     4317
     4318  return counter;
     4319};
Note: See TracChangeset for help on using the changeset viewer.