Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/tesselation.cpp

    r8db598 rb1a6d8  
    77
    88#include <fstream>
     9#include <assert.h>
    910
    1011#include "helpers.hpp"
     
    2526 */
    2627BoundaryPointSet::BoundaryPointSet() :
    27     LinesCount(0),
    28     value(0.),
    29     Nr(-1)
    30 {
    31         Info FunctionInfo(__func__);
    32         Log() << Verbose(1) << "Adding noname." << endl;
    33 };
     28  LinesCount(0), value(0.), Nr(-1)
     29{
     30  Info FunctionInfo(__func__);
     31  DoLog(1) && (Log() << Verbose(1) << "Adding noname." << endl);
     32}
     33;
    3434
    3535/** Constructor of BoundaryPointSet with Tesselpoint.
     
    3737 */
    3838BoundaryPointSet::BoundaryPointSet(TesselPoint * const Walker) :
    39   LinesCount(0),
    40   node(Walker),
    41   value(0.),
    42   Nr(Walker->nr)
    43 {
    44         Info FunctionInfo(__func__);
    45   Log() << Verbose(1) << "Adding Node " << *Walker << endl;
    46 };
     39  LinesCount(0), node(Walker), value(0.), Nr(Walker->nr)
     40{
     41  Info FunctionInfo(__func__);
     42  DoLog(1) && (Log() << Verbose(1) << "Adding Node " << *Walker << endl);
     43}
     44;
    4745
    4846/** Destructor of BoundaryPointSet.
     
    5250BoundaryPointSet::~BoundaryPointSet()
    5351{
    54         Info FunctionInfo(__func__);
     52  Info FunctionInfo(__func__);
    5553  //Log() << Verbose(0) << "Erasing point nr. " << Nr << "." << endl;
    5654  if (!lines.empty())
    57     eLog() << Verbose(2) << "Memory Leak! I " << *this << " am still connected to some lines." << endl;
     55    DoeLog(2) && (eLog() << Verbose(2) << "Memory Leak! I " << *this << " am still connected to some lines." << endl);
    5856  node = NULL;
    59 };
     57}
     58;
    6059
    6160/** Add a line to the LineMap of this point.
     
    6463void BoundaryPointSet::AddLine(BoundaryLineSet * const line)
    6564{
    66         Info FunctionInfo(__func__);
    67   Log() << Verbose(1) << "Adding " << *this << " to line " << *line << "."
    68       << endl;
    69   if (line->endpoints[0] == this)
    70     {
    71       lines.insert(LinePair(line->endpoints[1]->Nr, line));
    72     }
    73   else
    74     {
    75       lines.insert(LinePair(line->endpoints[0]->Nr, line));
    76     }
     65  Info FunctionInfo(__func__);
     66  DoLog(1) && (Log() << Verbose(1) << "Adding " << *this << " to line " << *line << "." << endl);
     67  if (line->endpoints[0] == this) {
     68    lines.insert(LinePair(line->endpoints[1]->Nr, line));
     69  } else {
     70    lines.insert(LinePair(line->endpoints[0]->Nr, line));
     71  }
    7772  LinesCount++;
    78 };
     73}
     74;
    7975
    8076/** output operator for BoundaryPointSet.
     
    9490 */
    9591BoundaryLineSet::BoundaryLineSet() :
    96     Nr(-1)
    97 {
    98         Info FunctionInfo(__func__);
     92  Nr(-1)
     93{
     94  Info FunctionInfo(__func__);
    9995  for (int i = 0; i < 2; i++)
    10096    endpoints[i] = NULL;
    101 };
     97}
     98;
    10299
    103100/** Constructor of BoundaryLineSet with two endpoints.
     
    108105BoundaryLineSet::BoundaryLineSet(BoundaryPointSet * const Point[2], const int number)
    109106{
    110         Info FunctionInfo(__func__);
     107  Info FunctionInfo(__func__);
    111108  // set number
    112109  Nr = number;
     
    119116  skipped = false;
    120117  // clear triangles list
    121   Log() << Verbose(0) << "New Line with endpoints " << *this << "." << endl;
    122 };
     118  DoLog(0) && (Log() << Verbose(0) << "New Line with endpoints " << *this << "." << endl);
     119}
     120;
    123121
    124122/** Constructor of BoundaryLineSet with two endpoints.
     
    141139  skipped = false;
    142140  // clear triangles list
    143   Log() << Verbose(0) << "New Line with endpoints " << *this << "." << endl;
    144 };
     141  DoLog(0) && (Log() << Verbose(0) << "New Line with endpoints " << *this << "." << endl);
     142}
     143;
    145144
    146145/** Destructor for BoundaryLineSet.
     
    150149BoundaryLineSet::~BoundaryLineSet()
    151150{
    152         Info FunctionInfo(__func__);
     151  Info FunctionInfo(__func__);
    153152  int Numbers[2];
    154153
     
    181180        //Log() << Verbose(0) << *endpoints[i] << " has no more lines it's attached to, erasing." << endl;
    182181        if (endpoints[i] != NULL) {
    183           delete(endpoints[i]);
     182          delete (endpoints[i]);
    184183          endpoints[i] = NULL;
    185184        }
     
    188187  }
    189188  if (!triangles.empty())
    190     eLog() << Verbose(2) << "Memory Leak! I " << *this << " am still connected to some triangles." << endl;
    191 };
     189    DoeLog(2) && (eLog() << Verbose(2) << "Memory Leak! I " << *this << " am still connected to some triangles." << endl);
     190}
     191;
    192192
    193193/** Add triangle to TriangleMap of this boundary line.
     
    196196void BoundaryLineSet::AddTriangle(BoundaryTriangleSet * const triangle)
    197197{
    198         Info FunctionInfo(__func__);
    199   Log() << Verbose(0) << "Add " << triangle->Nr << " to line " << *this << "." << endl;
     198  Info FunctionInfo(__func__);
     199  DoLog(0) && (Log() << Verbose(0) << "Add " << triangle->Nr << " to line " << *this << "." << endl);
    200200  triangles.insert(TrianglePair(triangle->Nr, triangle));
    201 };
     201}
     202;
    202203
    203204/** Checks whether we have a common endpoint with given \a *line.
     
    207208bool BoundaryLineSet::IsConnectedTo(const BoundaryLineSet * const line) const
    208209{
    209         Info FunctionInfo(__func__);
     210  Info FunctionInfo(__func__);
    210211  if ((endpoints[0] == line->endpoints[0]) || (endpoints[1] == line->endpoints[0]) || (endpoints[0] == line->endpoints[1]) || (endpoints[1] == line->endpoints[1]))
    211212    return true;
    212213  else
    213214    return false;
    214 };
     215}
     216;
    215217
    216218/** Checks whether the adjacent triangles of a baseline are convex or not.
     
    222224bool BoundaryLineSet::CheckConvexityCriterion() const
    223225{
    224         Info FunctionInfo(__func__);
     226  Info FunctionInfo(__func__);
    225227  Vector BaseLineCenter, BaseLineNormal, BaseLine, helper[2], NormalCheck;
    226228  // get the two triangles
    227229  if (triangles.size() != 2) {
    228     eLog() << Verbose(0) << "Baseline " << *this << " is connected to less than two triangles, Tesselation incomplete!" << endl;
     230    DoeLog(0) && (eLog() << Verbose(0) << "Baseline " << *this << " is connected to less than two triangles, Tesselation incomplete!" << endl);
    229231    return true;
    230232  }
     
    234236  BaseLineCenter.CopyVector(endpoints[0]->node->node);
    235237  BaseLineCenter.AddVector(endpoints[1]->node->node);
    236   BaseLineCenter.Scale(1./2.);
     238  BaseLineCenter.Scale(1. / 2.);
    237239  BaseLine.CopyVector(endpoints[0]->node->node);
    238240  BaseLine.SubtractVector(endpoints[1]->node->node);
     
    242244  NormalCheck.Zero();
    243245  double sign = -1.;
    244   int i=0;
     246  int i = 0;
    245247  class BoundaryPointSet *node = NULL;
    246   for(TriangleMap::const_iterator runner = triangles.begin(); runner != triangles.end(); runner++) {
     248  for (TriangleMap::const_iterator runner = triangles.begin(); runner != triangles.end(); runner++) {
    247249    //Log() << Verbose(0) << "INFO: NormalVector of " << *(runner->second) << " is " << runner->second->NormalVector << "." << endl;
    248250    NormalCheck.AddVector(&runner->second->NormalVector);
     
    250252    sign = -sign;
    251253    if (runner->second->NormalVector.NormSquared() > MYEPSILON)
    252       BaseLineNormal.CopyVector(&runner->second->NormalVector);   // yes, copy second on top of first
     254      BaseLineNormal.CopyVector(&runner->second->NormalVector); // yes, copy second on top of first
    253255    else {
    254       eLog() << Verbose(0) << "Triangle " << *runner->second << " has zero normal vector!" << endl;
     256      DoeLog(0) && (eLog() << Verbose(0) << "Triangle " << *runner->second << " has zero normal vector!" << endl);
    255257    }
    256258    node = runner->second->GetThirdEndpoint(this);
     
    259261      helper[i].CopyVector(node->node->node);
    260262      helper[i].SubtractVector(&BaseLineCenter);
    261       helper[i].MakeNormalVector(&BaseLine);  // we want to compare the triangle's heights' angles!
     263      helper[i].MakeNormalVector(&BaseLine); // we want to compare the triangle's heights' angles!
    262264      //Log() << Verbose(0) << "INFO: Height vector with respect to baseline is " << helper[i] << "." << endl;
    263265      i++;
    264266    } else {
    265       eLog() << Verbose(1) << "I cannot find third node in triangle, something's wrong." << endl;
     267      DoeLog(1) && (eLog() << Verbose(1) << "I cannot find third node in triangle, something's wrong." << endl);
    266268      return true;
    267269    }
     
    269271  //Log() << Verbose(0) << "INFO: BaselineNormal is " << BaseLineNormal << "." << endl;
    270272  if (NormalCheck.NormSquared() < MYEPSILON) {
    271     Log() << Verbose(0) << "ACCEPT: Normalvectors of both triangles are the same: convex." << endl;
     273    DoLog(0) && (Log() << Verbose(0) << "ACCEPT: Normalvectors of both triangles are the same: convex." << endl);
    272274    return true;
    273275  }
     
    275277  double angle = GetAngle(helper[0], helper[1], BaseLineNormal);
    276278  if ((angle - M_PI) > -MYEPSILON) {
    277     Log() << Verbose(0) << "ACCEPT: Angle is greater than pi: convex." << endl;
     279    DoLog(0) && (Log() << Verbose(0) << "ACCEPT: Angle is greater than pi: convex." << endl);
    278280    return true;
    279281  } else {
    280     Log() << Verbose(0) << "REJECT: Angle is less than pi: concave." << endl;
     282    DoLog(0) && (Log() << Verbose(0) << "REJECT: Angle is less than pi: concave." << endl);
    281283    return false;
    282284  }
     
    289291bool BoundaryLineSet::ContainsBoundaryPoint(const BoundaryPointSet * const point) const
    290292{
    291         Info FunctionInfo(__func__);
    292   for(int i=0;i<2;i++)
     293  Info FunctionInfo(__func__);
     294  for (int i = 0; i < 2; i++)
    293295    if (point == endpoints[i])
    294296      return true;
    295297  return false;
    296 };
     298}
     299;
    297300
    298301/** Returns other endpoint of the line.
     
    302305class BoundaryPointSet *BoundaryLineSet::GetOtherEndpoint(const BoundaryPointSet * const point) const
    303306{
    304         Info FunctionInfo(__func__);
     307  Info FunctionInfo(__func__);
    305308  if (endpoints[0] == point)
    306309    return endpoints[1];
     
    309312  else
    310313    return NULL;
    311 };
     314}
     315;
    312316
    313317/** output operator for BoundaryLineSet.
     
    315319 * \param &a boundary line
    316320 */
    317 ostream & operator <<(ostream &ost, const  BoundaryLineSet &a)
     321ostream & operator <<(ostream &ost, const BoundaryLineSet &a)
    318322{
    319323  ost << "[" << a.Nr << "|" << a.endpoints[0]->node->Name << " at " << *a.endpoints[0]->node->node << "," << a.endpoints[1]->node->Name << " at " << *a.endpoints[1]->node->node << "]";
    320324  return ost;
    321 };
     325}
     326;
    322327
    323328// ======================================== Triangles on Boundary =================================
     
    328333  Nr(-1)
    329334{
    330         Info FunctionInfo(__func__);
    331   for (int i = 0; i < 3; i++)
    332     {
    333       endpoints[i] = NULL;
    334       lines[i] = NULL;
    335     }
    336 };
     335  Info FunctionInfo(__func__);
     336  for (int i = 0; i < 3; i++) {
     337    endpoints[i] = NULL;
     338    lines[i] = NULL;
     339  }
     340}
     341;
    337342
    338343/** Constructor for BoundaryTriangleSet with three lines.
     
    343348  Nr(number)
    344349{
    345         Info FunctionInfo(__func__);
     350  Info FunctionInfo(__func__);
    346351  // set number
    347352  // set lines
     
    355360    // for all three lines
    356361    for (int j = 0; j < 2; j++) { // for both endpoints
    357       OrderMap.insert(pair<int, class BoundaryPointSet *> (
    358           line[i]->endpoints[j]->Nr, line[i]->endpoints[j]));
     362      OrderMap.insert(pair<int, class BoundaryPointSet *> (line[i]->endpoints[j]->Nr, line[i]->endpoints[j]));
    359363      // and we don't care whether insertion fails
    360364    }
    361365  // set endpoints
    362366  int Counter = 0;
    363   Log() << Verbose(0) << "New triangle " << Nr << " with end points: " << endl;
     367  DoLog(0) && (Log() << Verbose(0) << "New triangle " << Nr << " with end points: " << endl);
    364368  for (PointMap::iterator runner = OrderMap.begin(); runner != OrderMap.end(); runner++) {
    365369    endpoints[Counter] = runner->second;
    366     Log() << Verbose(0) << " " << *endpoints[Counter] << endl;
     370    DoLog(0) && (Log() << Verbose(0) << " " << *endpoints[Counter] << endl);
    367371    Counter++;
    368372  }
    369373  if (Counter < 3) {
    370     eLog() << Verbose(0) << "We have a triangle with only two distinct endpoints!" << endl;
     374    DoeLog(0) && (eLog() << Verbose(0) << "We have a triangle with only two distinct endpoints!" << endl);
    371375    performCriticalExit();
    372376  }
    373 };
     377}
     378;
    374379
    375380/** Destructor of BoundaryTriangleSet.
     
    379384BoundaryTriangleSet::~BoundaryTriangleSet()
    380385{
    381         Info FunctionInfo(__func__);
     386  Info FunctionInfo(__func__);
    382387  for (int i = 0; i < 3; i++) {
    383388    if (lines[i] != NULL) {
     
    386391      }
    387392      if (lines[i]->triangles.empty()) {
    388           //Log() << Verbose(0) << *lines[i] << " is no more attached to any triangle, erasing." << endl;
    389           delete (lines[i]);
    390           lines[i] = NULL;
     393        //Log() << Verbose(0) << *lines[i] << " is no more attached to any triangle, erasing." << endl;
     394        delete (lines[i]);
     395        lines[i] = NULL;
    391396      }
    392397    }
    393398  }
    394399  //Log() << Verbose(0) << "Erasing triangle Nr." << Nr << " itself." << endl;
    395 };
     400}
     401;
    396402
    397403/** Calculates the normal vector for this triangle.
     
    401407void BoundaryTriangleSet::GetNormalVector(const Vector &OtherVector)
    402408{
    403         Info FunctionInfo(__func__);
     409  Info FunctionInfo(__func__);
    404410  // get normal vector
    405411  NormalVector.MakeNormalVector(endpoints[0]->node->node, endpoints[1]->node->node, endpoints[2]->node->node);
     
    408414  if (NormalVector.ScalarProduct(&OtherVector) > 0.)
    409415    NormalVector.Scale(-1.);
    410   Log() << Verbose(1) << "Normal Vector is " << NormalVector << "." << endl;
    411 };
     416  DoLog(1) && (Log() << Verbose(1) << "Normal Vector is " << NormalVector << "." << endl);
     417}
     418;
    412419
    413420/** Finds the point on the triangle \a *BTS through which the line defined by \a *MolCenter and \a *x crosses.
     
    430437
    431438  if (!Intersection->GetIntersectionWithPlane(&NormalVector, endpoints[0]->node->node, MolCenter, x)) {
    432     eLog() << Verbose(1) << "Alas! Intersection with plane failed - at least numerically - the intersection is not on the plane!" << endl;
     439    DoeLog(1) && (eLog() << Verbose(1) << "Alas! Intersection with plane failed - at least numerically - the intersection is not on the plane!" << endl);
    433440    return false;
    434441  }
    435442
    436   Log() << Verbose(1) << "INFO: Triangle is " << *this << "." << endl;
    437   Log() << Verbose(1) << "INFO: Line is from " << *MolCenter << " to " << *x << "." << endl;
    438   Log() << Verbose(1) << "INFO: Intersection is " << *Intersection << "." << endl;
     443  DoLog(1) && (Log() << Verbose(1) << "INFO: Triangle is " << *this << "." << endl);
     444  DoLog(1) && (Log() << Verbose(1) << "INFO: Line is from " << *MolCenter << " to " << *x << "." << endl);
     445  DoLog(1) && (Log() << Verbose(1) << "INFO: Intersection is " << *Intersection << "." << endl);
    439446
    440447  if (Intersection->DistanceSquared(endpoints[0]->node->node) < MYEPSILON) {
    441     Log() << Verbose(1) << "Intersection coindices with first endpoint." << endl;
     448    DoLog(1) && (Log() << Verbose(1) << "Intersection coindices with first endpoint." << endl);
    442449    return true;
    443   }   else if (Intersection->DistanceSquared(endpoints[1]->node->node) < MYEPSILON) {
    444     Log() << Verbose(1) << "Intersection coindices with second endpoint." << endl;
     450  } else if (Intersection->DistanceSquared(endpoints[1]->node->node) < MYEPSILON) {
     451    DoLog(1) && (Log() << Verbose(1) << "Intersection coindices with second endpoint." << endl);
    445452    return true;
    446   }   else if (Intersection->DistanceSquared(endpoints[2]->node->node) < MYEPSILON) {
    447     Log() << Verbose(1) << "Intersection coindices with third endpoint." << endl;
     453  } else if (Intersection->DistanceSquared(endpoints[2]->node->node) < MYEPSILON) {
     454    DoLog(1) && (Log() << Verbose(1) << "Intersection coindices with third endpoint." << endl);
    448455    return true;
    449456  }
    450457  // Calculate cross point between one baseline and the line from the third endpoint to intersection
    451   int i=0;
     458  int i = 0;
    452459  do {
    453     if (CrossPoint.GetIntersectionOfTwoLinesOnPlane(endpoints[i%3]->node->node, endpoints[(i+1)%3]->node->node, endpoints[(i+2)%3]->node->node, Intersection, &NormalVector)) {
    454       helper.CopyVector(endpoints[(i+1)%3]->node->node);
    455       helper.SubtractVector(endpoints[i%3]->node->node);
    456       CrossPoint.SubtractVector(endpoints[i%3]->node->node); // cross point was returned as absolute vector
    457       const double s = CrossPoint.ScalarProduct(&helper)/helper.NormSquared();
    458       Log() << Verbose(1) << "INFO: Factor s is " << s << "." << endl;
    459       if ((s < -MYEPSILON) || ((s-1.) > MYEPSILON)) {
    460         Log() << Verbose(1) << "INFO: Crosspoint " << CrossPoint << "outside of triangle." << endl;
    461         i=4;
     460    if (CrossPoint.GetIntersectionOfTwoLinesOnPlane(endpoints[i % 3]->node->node, endpoints[(i + 1) % 3]->node->node, endpoints[(i + 2) % 3]->node->node, Intersection, &NormalVector)) {
     461      helper.CopyVector(endpoints[(i + 1) % 3]->node->node);
     462      helper.SubtractVector(endpoints[i % 3]->node->node);
     463      CrossPoint.SubtractVector(endpoints[i % 3]->node->node); // cross point was returned as absolute vector
     464      const double s = CrossPoint.ScalarProduct(&helper) / helper.NormSquared();
     465      DoLog(1) && (Log() << Verbose(1) << "INFO: Factor s is " << s << "." << endl);
     466      if ((s < -MYEPSILON) || ((s - 1.) > MYEPSILON)) {
     467        DoLog(1) && (Log() << Verbose(1) << "INFO: Crosspoint " << CrossPoint << "outside of triangle." << endl);
     468        i = 4;
    462469        break;
    463470      }
    464471      i++;
    465     } else 
     472    } else
    466473      break;
    467   } while (i<3);
    468   if (i==3) {
    469     Log() << Verbose(1) << "INFO: Crosspoint " << CrossPoint << " inside of triangle." << endl;
     474  } while (i < 3);
     475  if (i == 3) {
     476    DoLog(1) && (Log() << Verbose(1) << "INFO: Crosspoint " << CrossPoint << " inside of triangle." << endl);
    470477    return true;
    471478  } else {
    472     Log() << Verbose(1) << "INFO: Crosspoint " << CrossPoint << " outside of triangle." << endl;
     479    DoLog(1) && (Log() << Verbose(1) << "INFO: Crosspoint " << CrossPoint << " outside of triangle." << endl);
    473480    return false;
    474481  }
    475 };
     482}
     483;
    476484
    477485/** Finds the point on the triangle to the point \a *x.
     
    493501
    494502  // 1. get intersection with plane
    495   Log() << Verbose(1) << "INFO: Looking for closest point of triangle " << *this << " to " << *x << "." << endl;
     503  DoLog(1) && (Log() << Verbose(1) << "INFO: Looking for closest point of triangle " << *this << " to " << *x << "." << endl);
    496504  GetCenter(&Direction);
    497505  if (!ClosestPoint->GetIntersectionWithPlane(&NormalVector, endpoints[0]->node->node, x, &Direction)) {
     
    502510  Vector InPlane;
    503511  InPlane.CopyVector(x);
    504   InPlane.SubtractVector(ClosestPoint);  // points from plane intersection to straight-down point
     512  InPlane.SubtractVector(ClosestPoint); // points from plane intersection to straight-down point
    505513  InPlane.ProjectOntoPlane(&NormalVector);
    506514  InPlane.AddVector(ClosestPoint);
    507515
    508   Log() << Verbose(2) << "INFO: Triangle is " << *this << "." << endl;
    509   Log() << Verbose(2) << "INFO: Line is from " << Direction << " to " << *x << "." << endl;
    510   Log() << Verbose(2) << "INFO: In-plane part is " << InPlane << "." << endl;
     516  DoLog(2) && (Log() << Verbose(2) << "INFO: Triangle is " << *this << "." << endl);
     517  DoLog(2) && (Log() << Verbose(2) << "INFO: Line is from " << Direction << " to " << *x << "." << endl);
     518  DoLog(2) && (Log() << Verbose(2) << "INFO: In-plane part is " << InPlane << "." << endl);
    511519
    512520  // Calculate cross point between one baseline and the desired point such that distance is shortest
     
    516524  Vector CrossPoint[3];
    517525  Vector helper;
    518   for (int i=0;i<3;i++) {
     526  for (int i = 0; i < 3; i++) {
    519527    // treat direction of line as normal of a (cut)plane and the desired point x as the plane offset, the intersect line with point
    520     Direction.CopyVector(endpoints[(i+1)%3]->node->node);
    521     Direction.SubtractVector(endpoints[i%3]->node->node);
     528    Direction.CopyVector(endpoints[(i + 1) % 3]->node->node);
     529    Direction.SubtractVector(endpoints[i % 3]->node->node);
    522530    // calculate intersection, line can never be parallel to Direction (is the same vector as PlaneNormal);
    523     CrossPoint[i].GetIntersectionWithPlane(&Direction, &InPlane, endpoints[i%3]->node->node, endpoints[(i+1)%3]->node->node);
     531    CrossPoint[i].GetIntersectionWithPlane(&Direction, &InPlane, endpoints[i % 3]->node->node, endpoints[(i + 1) % 3]->node->node);
    524532    CrossDirection[i].CopyVector(&CrossPoint[i]);
    525533    CrossDirection[i].SubtractVector(&InPlane);
    526     CrossPoint[i].SubtractVector(endpoints[i%3]->node->node); // cross point was returned as absolute vector
    527     const double s = CrossPoint[i].ScalarProduct(&Direction)/Direction.NormSquared();
    528     Log() << Verbose(2) << "INFO: Factor s is " << s << "." << endl;
    529     if ((s >= -MYEPSILON) && ((s-1.) <= MYEPSILON)) {
    530       CrossPoint[i].AddVector(endpoints[i%3]->node->node); // make cross point absolute again
    531       Log() << Verbose(2) << "INFO: Crosspoint is " << CrossPoint[i] << ", intersecting BoundaryLine between " << *endpoints[i%3]->node->node << " and " << *endpoints[(i+1)%3]->node->node << "." << endl;
     534    CrossPoint[i].SubtractVector(endpoints[i % 3]->node->node); // cross point was returned as absolute vector
     535    const double s = CrossPoint[i].ScalarProduct(&Direction) / Direction.NormSquared();
     536    DoLog(2) && (Log() << Verbose(2) << "INFO: Factor s is " << s << "." << endl);
     537    if ((s >= -MYEPSILON) && ((s - 1.) <= MYEPSILON)) {
     538      CrossPoint[i].AddVector(endpoints[i % 3]->node->node); // make cross point absolute again
     539      DoLog(2) && (Log() << Verbose(2) << "INFO: Crosspoint is " << CrossPoint[i] << ", intersecting BoundaryLine between " << *endpoints[i % 3]->node->node << " and " << *endpoints[(i + 1) % 3]->node->node << "." << endl);
    532540      const double distance = CrossPoint[i].DistanceSquared(x);
    533541      if ((ShortestDistance < 0.) || (ShortestDistance > distance)) {
     
    539547  }
    540548  InsideFlag = true;
    541   for (int i=0;i<3;i++) {
    542     const double sign = CrossDirection[i].ScalarProduct(&CrossDirection[(i+1)%3]);
    543     const double othersign = CrossDirection[i].ScalarProduct(&CrossDirection[(i+2)%3]);;
    544     if ((sign > -MYEPSILON) && (othersign > -MYEPSILON))  // have different sign
     549  for (int i = 0; i < 3; i++) {
     550    const double sign = CrossDirection[i].ScalarProduct(&CrossDirection[(i + 1) % 3]);
     551    const double othersign = CrossDirection[i].ScalarProduct(&CrossDirection[(i + 2) % 3]);
     552    ;
     553    if ((sign > -MYEPSILON) && (othersign > -MYEPSILON)) // have different sign
    545554      InsideFlag = false;
    546555  }
     
    548557    ClosestPoint->CopyVector(&InPlane);
    549558    ShortestDistance = InPlane.DistanceSquared(x);
    550   } else {  // also check endnodes
    551     for (int i=0;i<3;i++) {
     559  } else { // also check endnodes
     560    for (int i = 0; i < 3; i++) {
    552561      const double distance = x->DistanceSquared(endpoints[i]->node->node);
    553562      if ((ShortestDistance < 0.) || (ShortestDistance > distance)) {
     
    557566    }
    558567  }
    559   Log() << Verbose(1) << "INFO: Closest Point is " << *ClosestPoint << " with shortest squared distance is " << ShortestDistance << "." << endl;
     568  DoLog(1) && (Log() << Verbose(1) << "INFO: Closest Point is " << *ClosestPoint << " with shortest squared distance is " << ShortestDistance << "." << endl);
    560569  return ShortestDistance;
    561 };
     570}
     571;
    562572
    563573/** Checks whether lines is any of the three boundary lines this triangle contains.
     
    567577bool BoundaryTriangleSet::ContainsBoundaryLine(const BoundaryLineSet * const line) const
    568578{
    569         Info FunctionInfo(__func__);
    570   for(int i=0;i<3;i++)
     579  Info FunctionInfo(__func__);
     580  for (int i = 0; i < 3; i++)
    571581    if (line == lines[i])
    572582      return true;
    573583  return false;
    574 };
     584}
     585;
    575586
    576587/** Checks whether point is any of the three endpoints this triangle contains.
     
    580591bool BoundaryTriangleSet::ContainsBoundaryPoint(const BoundaryPointSet * const point) const
    581592{
    582         Info FunctionInfo(__func__);
    583   for(int i=0;i<3;i++)
     593  Info FunctionInfo(__func__);
     594  for (int i = 0; i < 3; i++)
    584595    if (point == endpoints[i])
    585596      return true;
    586597  return false;
    587 };
     598}
     599;
    588600
    589601/** Checks whether point is any of the three endpoints this triangle contains.
     
    593605bool BoundaryTriangleSet::ContainsBoundaryPoint(const TesselPoint * const point) const
    594606{
    595         Info FunctionInfo(__func__);
    596   for(int i=0;i<3;i++)
     607  Info FunctionInfo(__func__);
     608  for (int i = 0; i < 3; i++)
    597609    if (point == endpoints[i]->node)
    598610      return true;
    599611  return false;
    600 };
     612}
     613;
    601614
    602615/** Checks whether three given \a *Points coincide with triangle's endpoints.
     
    606619bool BoundaryTriangleSet::IsPresentTupel(const BoundaryPointSet * const Points[3]) const
    607620{
    608         Info FunctionInfo(__func__);
    609         Log() << Verbose(1) << "INFO: Checking " << Points[0] << ","  << Points[1] << "," << Points[2] << " against " << endpoints[0] << "," << endpoints[1] << "," << endpoints[2] << "." << endl;
    610   return (((endpoints[0] == Points[0])
    611             || (endpoints[0] == Points[1])
    612             || (endpoints[0] == Points[2])
    613           ) && (
    614             (endpoints[1] == Points[0])
    615             || (endpoints[1] == Points[1])
    616             || (endpoints[1] == Points[2])
    617           ) && (
    618             (endpoints[2] == Points[0])
    619             || (endpoints[2] == Points[1])
    620             || (endpoints[2] == Points[2])
    621 
    622           ));
    623 };
     621  Info FunctionInfo(__func__);
     622  DoLog(1) && (Log() << Verbose(1) << "INFO: Checking " << Points[0] << "," << Points[1] << "," << Points[2] << " against " << endpoints[0] << "," << endpoints[1] << "," << endpoints[2] << "." << endl);
     623  return (((endpoints[0] == Points[0]) || (endpoints[0] == Points[1]) || (endpoints[0] == Points[2])) && ((endpoints[1] == Points[0]) || (endpoints[1] == Points[1]) || (endpoints[1] == Points[2])) && ((endpoints[2] == Points[0]) || (endpoints[2] == Points[1]) || (endpoints[2] == Points[2])
     624
     625  ));
     626}
     627;
    624628
    625629/** Checks whether three given \a *Points coincide with triangle's endpoints.
     
    629633bool BoundaryTriangleSet::IsPresentTupel(const BoundaryTriangleSet * const T) const
    630634{
    631         Info FunctionInfo(__func__);
    632   return (((endpoints[0] == T->endpoints[0])
    633             || (endpoints[0] == T->endpoints[1])
    634             || (endpoints[0] == T->endpoints[2])
    635           ) && (
    636             (endpoints[1] == T->endpoints[0])
    637             || (endpoints[1] == T->endpoints[1])
    638             || (endpoints[1] == T->endpoints[2])
    639           ) && (
    640             (endpoints[2] == T->endpoints[0])
    641             || (endpoints[2] == T->endpoints[1])
    642             || (endpoints[2] == T->endpoints[2])
    643 
    644           ));
    645 };
     635  Info FunctionInfo(__func__);
     636  return (((endpoints[0] == T->endpoints[0]) || (endpoints[0] == T->endpoints[1]) || (endpoints[0] == T->endpoints[2])) && ((endpoints[1] == T->endpoints[0]) || (endpoints[1] == T->endpoints[1]) || (endpoints[1] == T->endpoints[2])) && ((endpoints[2] == T->endpoints[0]) || (endpoints[2] == T->endpoints[1]) || (endpoints[2] == T->endpoints[2])
     637
     638  ));
     639}
     640;
    646641
    647642/** Returns the endpoint which is not contained in the given \a *line.
     
    651646class BoundaryPointSet *BoundaryTriangleSet::GetThirdEndpoint(const BoundaryLineSet * const line) const
    652647{
    653         Info FunctionInfo(__func__);
     648  Info FunctionInfo(__func__);
    654649  // sanity check
    655650  if (!ContainsBoundaryLine(line))
    656651    return NULL;
    657   for(int i=0;i<3;i++)
     652  for (int i = 0; i < 3; i++)
    658653    if (!line->ContainsBoundaryPoint(endpoints[i]))
    659654      return endpoints[i];
    660655  // actually, that' impossible :)
    661656  return NULL;
    662 };
     657}
     658;
    663659
    664660/** Calculates the center point of the triangle.
     
    668664void BoundaryTriangleSet::GetCenter(Vector * const center) const
    669665{
    670         Info FunctionInfo(__func__);
     666  Info FunctionInfo(__func__);
    671667  center->Zero();
    672   for(int i=0;i<3;i++)
     668  for (int i = 0; i < 3; i++)
    673669    center->AddVector(endpoints[i]->node->node);
    674   center->Scale(1./3.);
    675   Log() << Verbose(1) << "INFO: Center is at " << *center << "." << endl;
     670  center->Scale(1. / 3.);
     671  DoLog(1) && (Log() << Verbose(1) << "INFO: Center is at " << *center << "." << endl);
    676672}
    677673
     
    683679{
    684680  ost << "[" << a.Nr << "|" << a.endpoints[0]->node->Name << "," << a.endpoints[1]->node->Name << "," << a.endpoints[2]->node->Name << "]";
    685 //  ost << "[" << a.Nr << "|" << a.endpoints[0]->node->Name << " at " << *a.endpoints[0]->node->node << ","
    686 //      << a.endpoints[1]->node->Name << " at " << *a.endpoints[1]->node->node << "," << a.endpoints[2]->node->Name << " at " << *a.endpoints[2]->node->node << "]";
     681  //  ost << "[" << a.Nr << "|" << a.endpoints[0]->node->Name << " at " << *a.endpoints[0]->node->node << ","
     682  //      << a.endpoints[1]->node->Name << " at " << *a.endpoints[1]->node->node << "," << a.endpoints[2]->node->Name << " at " << *a.endpoints[2]->node->node << "]";
    687683  return ost;
    688 };
     684}
     685;
    689686
    690687// ======================================== Polygons on Boundary =================================
     
    696693{
    697694  Info FunctionInfo(__func__);
    698 };
     695}
     696;
    699697
    700698/** Destructor of BoundaryPolygonSet.
     
    706704  Info FunctionInfo(__func__);
    707705  endpoints.clear();
    708   Log() << Verbose(1) << "Erasing polygon Nr." << Nr << " itself." << endl;
    709 };
     706  DoLog(1) && (Log() << Verbose(1) << "Erasing polygon Nr." << Nr << " itself." << endl);
     707}
     708;
    710709
    711710/** Calculates the normal vector for this triangle.
     
    721720  Vector *TotalNormal = new Vector;
    722721  PointSet::const_iterator Runner[3];
    723   for (int i=0;i<3; i++) {
     722  for (int i = 0; i < 3; i++) {
    724723    Runner[i] = endpoints.begin();
    725     for (int j = 0; j<i; j++) { // go as much further
     724    for (int j = 0; j < i; j++) { // go as much further
    726725      Runner[i]++;
    727726      if (Runner[i] == endpoints.end()) {
    728         eLog() << Verbose(0) << "There are less than three endpoints in the polygon!" << endl;
     727        DoeLog(0) && (eLog() << Verbose(0) << "There are less than three endpoints in the polygon!" << endl);
    729728        performCriticalExit();
    730729      }
     
    732731  }
    733732  TotalNormal->Zero();
    734   int counter=0;
    735   for (; Runner[2] != endpoints.end(); ) {
     733  int counter = 0;
     734  for (; Runner[2] != endpoints.end();) {
    736735    TemporaryNormal.MakeNormalVector((*Runner[0])->node->node, (*Runner[1])->node->node, (*Runner[2])->node->node);
    737     for (int i=0;i<3;i++) // increase each of them
     736    for (int i = 0; i < 3; i++) // increase each of them
    738737      Runner[i]++;
    739738    TotalNormal->AddVector(&TemporaryNormal);
    740739  }
    741   TotalNormal->Scale(1./(double)counter);
     740  TotalNormal->Scale(1. / (double) counter);
    742741
    743742  // make it always point inward (any offset vector onto plane projected onto normal vector suffices)
    744743  if (TotalNormal->ScalarProduct(&OtherVector) > 0.)
    745744    TotalNormal->Scale(-1.);
    746   Log() << Verbose(1) << "Normal Vector is " << *TotalNormal << "." << endl;
     745  DoLog(1) && (Log() << Verbose(1) << "Normal Vector is " << *TotalNormal << "." << endl);
    747746
    748747  return TotalNormal;
    749 };
     748}
     749;
    750750
    751751/** Calculates the center point of the triangle.
     
    758758  center->Zero();
    759759  int counter = 0;
    760   for(PointSet::const_iterator Runner = endpoints.begin(); Runner != endpoints.end(); Runner++) {
     760  for (PointSet::const_iterator Runner = endpoints.begin(); Runner != endpoints.end(); Runner++) {
    761761    center->AddVector((*Runner)->node->node);
    762762    counter++;
    763763  }
    764   center->Scale(1./(double)counter);
    765   Log() << Verbose(1) << "Center is at " << *center << "." << endl;
     764  center->Scale(1. / (double) counter);
     765  DoLog(1) && (Log() << Verbose(1) << "Center is at " << *center << "." << endl);
    766766}
    767767
     
    774774  Info FunctionInfo(__func__);
    775775  return ContainsPresentTupel(triangle->endpoints, 3);
    776 };
     776}
     777;
    777778
    778779/** Checks whether the polygons contains both endpoints of the line.
     
    784785  Info FunctionInfo(__func__);
    785786  return ContainsPresentTupel(line->endpoints, 2);
    786 };
     787}
     788;
    787789
    788790/** Checks whether point is any of the three endpoints this triangle contains.
     
    793795{
    794796  Info FunctionInfo(__func__);
    795   for(PointSet::const_iterator Runner = endpoints.begin(); Runner != endpoints.end(); Runner++) {
    796     Log() << Verbose(0) << "Checking against " << **Runner << endl;
     797  for (PointSet::const_iterator Runner = endpoints.begin(); Runner != endpoints.end(); Runner++) {
     798    DoLog(0) && (Log() << Verbose(0) << "Checking against " << **Runner << endl);
    797799    if (point == (*Runner)) {
    798       Log() << Verbose(0) << " Contained." << endl;
     800      DoLog(0) && (Log() << Verbose(0) << " Contained." << endl);
    799801      return true;
    800802    }
    801803  }
    802   Log() << Verbose(0) << " Not contained." << endl;
     804  DoLog(0) && (Log() << Verbose(0) << " Not contained." << endl);
    803805  return false;
    804 };
     806}
     807;
    805808
    806809/** Checks whether point is any of the three endpoints this triangle contains.
     
    811814{
    812815  Info FunctionInfo(__func__);
    813   for(PointSet::const_iterator Runner = endpoints.begin(); Runner != endpoints.end(); Runner++)
     816  for (PointSet::const_iterator Runner = endpoints.begin(); Runner != endpoints.end(); Runner++)
    814817    if (point == (*Runner)->node) {
    815       Log() << Verbose(0) << " Contained." << endl;
     818      DoLog(0) && (Log() << Verbose(0) << " Contained." << endl);
    816819      return true;
    817820    }
    818   Log() << Verbose(0) << " Not contained." << endl;
     821  DoLog(0) && (Log() << Verbose(0) << " Not contained." << endl);
    819822  return false;
    820 };
     823}
     824;
    821825
    822826/** Checks whether given array of \a *Points coincide with polygons's endpoints.
     
    829833  Info FunctionInfo(__func__);
    830834  int counter = 0;
    831   Log() << Verbose(1) << "Polygon is " << *this << endl;
    832   for(int i=0;i<dim;i++) {
    833     Log() << Verbose(1) << " Testing endpoint " << *Points[i] << endl;
     835  DoLog(1) && (Log() << Verbose(1) << "Polygon is " << *this << endl);
     836  for (int i = 0; i < dim; i++) {
     837    DoLog(1) && (Log() << Verbose(1) << " Testing endpoint " << *Points[i] << endl);
    834838    if (ContainsBoundaryPoint(Points[i])) {
    835839      counter++;
     
    841845  else
    842846    return false;
    843 };
     847}
     848;
    844849
    845850/** Checks whether given PointList coincide with polygons's endpoints.
     
    851856  Info FunctionInfo(__func__);
    852857  size_t counter = 0;
    853   Log() << Verbose(1) << "Polygon is " << *this << endl;
    854   for(PointSet::const_iterator Runner = endpoints.begin(); Runner != endpoints.end(); Runner++) {
    855     Log() << Verbose(1) << " Testing endpoint " << **Runner << endl;
     858  DoLog(1) && (Log() << Verbose(1) << "Polygon is " << *this << endl);
     859  for (PointSet::const_iterator Runner = endpoints.begin(); Runner != endpoints.end(); Runner++) {
     860    DoLog(1) && (Log() << Verbose(1) << " Testing endpoint " << **Runner << endl);
    856861    if (ContainsBoundaryPoint(*Runner))
    857862      counter++;
     
    862867  else
    863868    return false;
    864 };
     869}
     870;
    865871
    866872/** Checks whether given set of \a *Points coincide with polygons's endpoints.
     
    870876bool BoundaryPolygonSet::ContainsPresentTupel(const BoundaryPolygonSet * const P) const
    871877{
    872   return ContainsPresentTupel((const PointSet)P->endpoints);
    873 };
     878  return ContainsPresentTupel((const PointSet) P->endpoints);
     879}
     880;
    874881
    875882/** Gathers all the endpoints' triangles in a unique set.
     
    879886{
    880887  Info FunctionInfo(__func__);
    881   pair <TriangleSet::iterator, bool> Tester;
     888  pair<TriangleSet::iterator, bool> Tester;
    882889  TriangleSet *triangles = new TriangleSet;
    883890
    884   for(PointSet::const_iterator Runner = endpoints.begin(); Runner != endpoints.end(); Runner++)
    885     for(LineMap::const_iterator Walker = (*Runner)->lines.begin(); Walker != (*Runner)->lines.end(); Walker++)
    886       for(TriangleMap::const_iterator Sprinter = (Walker->second)->triangles.begin(); Sprinter != (Walker->second)->triangles.end(); Sprinter++) {
     891  for (PointSet::const_iterator Runner = endpoints.begin(); Runner != endpoints.end(); Runner++)
     892    for (LineMap::const_iterator Walker = (*Runner)->lines.begin(); Walker != (*Runner)->lines.end(); Walker++)
     893      for (TriangleMap::const_iterator Sprinter = (Walker->second)->triangles.begin(); Sprinter != (Walker->second)->triangles.end(); Sprinter++) {
    887894        //Log() << Verbose(0) << " Testing triangle " << *(Sprinter->second) << endl;
    888895        if (ContainsBoundaryTriangle(Sprinter->second)) {
    889896          Tester = triangles->insert(Sprinter->second);
    890897          if (Tester.second)
    891             Log() << Verbose(0) << "Adding triangle " << *(Sprinter->second) << endl;
     898            DoLog(0) && (Log() << Verbose(0) << "Adding triangle " << *(Sprinter->second) << endl);
    892899        }
    893900      }
    894901
    895   Log() << Verbose(1) << "The Polygon of " << endpoints.size() << " endpoints has " << triangles->size() << " unique triangles in total." << endl;
     902  DoLog(1) && (Log() << Verbose(1) << "The Polygon of " << endpoints.size() << " endpoints has " << triangles->size() << " unique triangles in total." << endl);
    896903  return triangles;
    897 };
     904}
     905;
    898906
    899907/** Fills the endpoints of this polygon from the triangles attached to \a *line.
     
    904912{
    905913  Info FunctionInfo(__func__);
    906   pair <PointSet::iterator, bool> Tester;
     914  pair<PointSet::iterator, bool> Tester;
    907915  if (line == NULL)
    908916    return false;
    909   Log() << Verbose(1) << "Filling polygon from line " << *line << endl;
    910   for(TriangleMap::const_iterator Runner = line->triangles.begin(); Runner != line->triangles.end(); Runner++) {
    911     for (int i=0;i<3;i++) {
     917  DoLog(1) && (Log() << Verbose(1) << "Filling polygon from line " << *line << endl);
     918  for (TriangleMap::const_iterator Runner = line->triangles.begin(); Runner != line->triangles.end(); Runner++) {
     919    for (int i = 0; i < 3; i++) {
    912920      Tester = endpoints.insert((Runner->second)->endpoints[i]);
    913921      if (Tester.second)
    914         Log() << Verbose(1) << "  Inserting endpoint " << *((Runner->second)->endpoints[i]) << endl;
     922        DoLog(1) && (Log() << Verbose(1) << "  Inserting endpoint " << *((Runner->second)->endpoints[i]) << endl);
    915923    }
    916924  }
    917925
    918926  return true;
    919 };
     927}
     928;
    920929
    921930/** output operator for BoundaryPolygonSet.
     
    926935{
    927936  ost << "[" << a.Nr << "|";
    928   for(PointSet::const_iterator Runner = a.endpoints.begin(); Runner != a.endpoints.end();) {
    929    ost << (*Runner)->node->Name;
    930    Runner++;
    931    if (Runner != a.endpoints.end())
    932      ost << ",";
    933   }
    934   ost<< "]";
     937  for (PointSet::const_iterator Runner = a.endpoints.begin(); Runner != a.endpoints.end();) {
     938    ost << (*Runner)->node->Name;
     939    Runner++;
     940    if (Runner != a.endpoints.end())
     941      ost << ",";
     942  }
     943  ost << "]";
    935944  return ost;
    936 };
     945}
     946;
    937947
    938948// =========================================================== class TESSELPOINT ===========================================
     
    945955  node = NULL;
    946956  nr = -1;
    947   Name =  NULL;
    948 };
     957  Name = NULL;
     958}
     959;
    949960
    950961/** Destructor for class TesselPoint.
     
    953964{
    954965  //Info FunctionInfo(__func__);
    955 };
     966}
     967;
    956968
    957969/** Prints LCNode to screen.
    958970 */
    959 ostream & operator << (ostream &ost, const TesselPoint &a)
     971ostream & operator <<(ostream &ost, const TesselPoint &a)
    960972{
    961973  ost << "[" << (a.Name) << "|" << a.Name << " at " << *a.node << "]";
    962974  return ost;
    963 };
     975}
     976;
    964977
    965978/** Prints LCNode to screen.
    966979 */
    967 ostream & TesselPoint::operator << (ostream &ost)
    968 {
    969         Info FunctionInfo(__func__);
     980ostream & TesselPoint::operator <<(ostream &ost)
     981{
     982  Info FunctionInfo(__func__);
    970983  ost << "[" << (nr) << "|" << this << "]";
    971984  return ost;
    972 };
    973 
     985}
     986;
    974987
    975988// =========================================================== class POINTCLOUD ============================================
     
    979992PointCloud::PointCloud()
    980993{
    981         //Info FunctionInfo(__func__);
    982 };
     994  //Info FunctionInfo(__func__);
     995}
     996;
    983997
    984998/** Destructor for class PointCloud.
     
    9861000PointCloud::~PointCloud()
    9871001{
    988         //Info FunctionInfo(__func__);
    989 };
     1002  //Info FunctionInfo(__func__);
     1003}
     1004;
    9901005
    9911006// ============================ CandidateForTesselation =============================
     
    9931008/** Constructor of class CandidateForTesselation.
    9941009 */
    995 CandidateForTesselation::CandidateForTesselation (BoundaryLineSet* line) :
    996   BaseLine(line),
    997   ShortestAngle(2.*M_PI),
    998   OtherShortestAngle(2.*M_PI)
    999 {
    1000         Info FunctionInfo(__func__);
    1001 };
    1002 
     1010CandidateForTesselation::CandidateForTesselation(BoundaryLineSet* line) :
     1011  BaseLine(line), ThirdPoint(NULL), T(NULL), ShortestAngle(2. * M_PI), OtherShortestAngle(2. * M_PI)
     1012{
     1013  Info FunctionInfo(__func__);
     1014}
     1015;
    10031016
    10041017/** Constructor of class CandidateForTesselation.
    10051018 */
    1006 CandidateForTesselation::CandidateForTesselation (TesselPoint *candidate, BoundaryLineSet* line, Vector OptCandidateCenter, Vector OtherOptCandidateCenter) :
    1007     BaseLine(line),
    1008     ShortestAngle(2.*M_PI),
    1009     OtherShortestAngle(2.*M_PI)
    1010 {
    1011         Info FunctionInfo(__func__);
     1019CandidateForTesselation::CandidateForTesselation(TesselPoint *candidate, BoundaryLineSet* line, BoundaryPointSet* point, Vector OptCandidateCenter, Vector OtherOptCandidateCenter) :
     1020  BaseLine(line), ThirdPoint(point), T(NULL), ShortestAngle(2. * M_PI), OtherShortestAngle(2. * M_PI)
     1021{
     1022  Info FunctionInfo(__func__);
    10121023  OptCenter.CopyVector(&OptCandidateCenter);
    10131024  OtherOptCenter.CopyVector(&OtherOptCandidateCenter);
    1014 };
     1025}
     1026;
    10151027
    10161028/** Destructor for class CandidateForTesselation.
    10171029 */
    1018 CandidateForTesselation::~CandidateForTesselation() {
    1019   BaseLine = NULL;
    1020 };
     1030CandidateForTesselation::~CandidateForTesselation()
     1031{
     1032}
     1033;
     1034
     1035/** Checks validity of a given sphere of a candidate line.
     1036 * Sphere must touch all candidates and the baseline endpoints and there must be no other atoms inside.
     1037 * \param RADIUS radius of sphere
     1038 * \param *LC LinkedCell structure with other atoms
     1039 * \return true - sphere is valid, false - sphere contains other points
     1040 */
     1041bool CandidateForTesselation::CheckValidity(const double RADIUS, const LinkedCell *LC) const
     1042{
     1043  Info FunctionInfo(__func__);
     1044
     1045  const double radiusSquared = RADIUS * RADIUS;
     1046  list<const Vector *> VectorList;
     1047  VectorList.push_back(&OptCenter);
     1048  //VectorList.push_back(&OtherOptCenter);  // don't check the other (wrong) center
     1049
     1050  if (!pointlist.empty())
     1051    DoLog(1) && (Log() << Verbose(1) << "INFO: Checking whether sphere contains candidate list and baseline " << *BaseLine->endpoints[0] << "<->" << *BaseLine->endpoints[1] << " only ..." << endl);
     1052  else
     1053    DoLog(1) && (Log() << Verbose(1) << "INFO: Checking whether sphere with no candidates contains baseline " << *BaseLine->endpoints[0] << "<->" << *BaseLine->endpoints[1] << " only ..." << endl);
     1054  // check baseline for OptCenter and OtherOptCenter being on sphere's surface
     1055  for (list<const Vector *>::const_iterator VRunner = VectorList.begin(); VRunner != VectorList.end(); ++VRunner) {
     1056    for (int i = 0; i < 2; i++) {
     1057      const double distance = fabs((*VRunner)->DistanceSquared(BaseLine->endpoints[i]->node->node) - radiusSquared);
     1058      if (distance > HULLEPSILON) {
     1059        DoeLog(1) && (eLog() << Verbose(1) << "Endpoint " << *BaseLine->endpoints[i] << " is out of sphere at " << *(*VRunner) << " by " << distance << "." << endl);
     1060        return false;
     1061      }
     1062    }
     1063  }
     1064
     1065  // check Candidates for OptCenter and OtherOptCenter being on sphere's surface
     1066  for (TesselPointList::const_iterator Runner = pointlist.begin(); Runner != pointlist.end(); ++Runner) {
     1067    const TesselPoint *Walker = *Runner;
     1068    for (list<const Vector *>::const_iterator VRunner = VectorList.begin(); VRunner != VectorList.end(); ++VRunner) {
     1069      const double distance = fabs((*VRunner)->DistanceSquared(Walker->node) - radiusSquared);
     1070      if (distance > HULLEPSILON) {
     1071        DoeLog(1) && (eLog() << Verbose(1) << "Candidate " << *Walker << " is out of sphere at " << *(*VRunner) << " by " << distance << "." << endl);
     1072        return false;
     1073      } else {
     1074        DoLog(1) && (Log() << Verbose(1) << "Candidate " << *Walker << " is inside by " << distance << "." << endl);
     1075      }
     1076    }
     1077  }
     1078
     1079  DoLog(1) && (Log() << Verbose(1) << "INFO: Checking whether sphere contains no others points ..." << endl);
     1080  bool flag = true;
     1081  for (list<const Vector *>::const_iterator VRunner = VectorList.begin(); VRunner != VectorList.end(); ++VRunner) {
     1082    // get all points inside the sphere
     1083    TesselPointList *ListofPoints = LC->GetPointsInsideSphere(RADIUS, (*VRunner));
     1084
     1085    DoLog(1) && (Log() << Verbose(1) << "The following atoms are inside sphere at " << OtherOptCenter << ":" << endl);
     1086    for (TesselPointList::const_iterator Runner = ListofPoints->begin(); Runner != ListofPoints->end(); ++Runner)
     1087      DoLog(1) && (Log() << Verbose(1) << "  " << *(*Runner) << " with distance " << (*Runner)->node->Distance(&OtherOptCenter) << "." << endl);
     1088
     1089    // remove baseline's endpoints and candidates
     1090    for (int i = 0; i < 2; i++) {
     1091      DoLog(1) && (Log() << Verbose(1) << "INFO: removing baseline tesselpoint " << *BaseLine->endpoints[i]->node << "." << endl);
     1092      ListofPoints->remove(BaseLine->endpoints[i]->node);
     1093    }
     1094    for (TesselPointList::const_iterator Runner = pointlist.begin(); Runner != pointlist.end(); ++Runner) {
     1095      DoLog(1) && (Log() << Verbose(1) << "INFO: removing candidate tesselpoint " << *(*Runner) << "." << endl);
     1096      ListofPoints->remove(*Runner);
     1097    }
     1098    if (!ListofPoints->empty()) {
     1099      DoeLog(1) && (eLog() << Verbose(1) << "CheckValidity: There are still " << ListofPoints->size() << " points inside the sphere." << endl);
     1100      flag = false;
     1101      DoeLog(1) && (eLog() << Verbose(1) << "External atoms inside of sphere at " << *(*VRunner) << ":" << endl);
     1102      for (TesselPointList::const_iterator Runner = ListofPoints->begin(); Runner != ListofPoints->end(); ++Runner)
     1103        DoeLog(1) && (eLog() << Verbose(1) << "  " << *(*Runner) << endl);
     1104    }
     1105    delete (ListofPoints);
     1106
     1107    // check with animate_sphere.tcl VMD script
     1108    if (ThirdPoint != NULL) {
     1109      DoLog(1) && (Log() << Verbose(1) << "Check by: animate_sphere 0 " << BaseLine->endpoints[0]->Nr + 1 << " " << BaseLine->endpoints[1]->Nr + 1 << " " << ThirdPoint->Nr + 1 << " " << RADIUS << " " << OldCenter.x[0] << " " << OldCenter.x[1] << " " << OldCenter.x[2] << " " << (*VRunner)->x[0] << " " << (*VRunner)->x[1] << " " << (*VRunner)->x[2] << endl);
     1110    } else {
     1111      DoLog(1) && (Log() << Verbose(1) << "Check by: ... missing third point ..." << endl);
     1112      DoLog(1) && (Log() << Verbose(1) << "Check by: animate_sphere 0 " << BaseLine->endpoints[0]->Nr + 1 << " " << BaseLine->endpoints[1]->Nr + 1 << " ??? " << RADIUS << " " << OldCenter.x[0] << " " << OldCenter.x[1] << " " << OldCenter.x[2] << " " << (*VRunner)->x[0] << " " << (*VRunner)->x[1] << " " << (*VRunner)->x[2] << endl);
     1113    }
     1114  }
     1115  return flag;
     1116}
     1117;
    10211118
    10221119/** output operator for CandidateForTesselation.
     
    10241121 * \param &a boundary line
    10251122 */
    1026 ostream & operator <<(ostream &ost, const  CandidateForTesselation &a)
     1123ostream & operator <<(ostream &ost, const CandidateForTesselation &a)
    10271124{
    10281125  ost << "[" << a.BaseLine->Nr << "|" << a.BaseLine->endpoints[0]->node->Name << "," << a.BaseLine->endpoints[1]->node->Name << "] with ";
     
    10371134    for (TesselPointList::const_iterator Runner = a.pointlist.begin(); Runner != a.pointlist.end(); Runner++)
    10381135      ost << *(*Runner) << " ";
    1039     ost << " at angle " << (a.ShortestAngle)<< ".";
     1136    ost << " at angle " << (a.ShortestAngle) << ".";
    10401137  }
    10411138
    10421139  return ost;
    1043 };
    1044 
     1140}
     1141;
    10451142
    10461143// =========================================================== class TESSELATION ===========================================
     
    10491146 */
    10501147Tesselation::Tesselation() :
    1051   PointsOnBoundaryCount(0),
    1052   LinesOnBoundaryCount(0),
    1053   TrianglesOnBoundaryCount(0),
    1054   LastTriangle(NULL),
    1055   TriangleFilesWritten(0),
    1056   InternalPointer(PointsOnBoundary.begin())
    1057 {
    1058         Info FunctionInfo(__func__);
     1148  PointsOnBoundaryCount(0), LinesOnBoundaryCount(0), TrianglesOnBoundaryCount(0), LastTriangle(NULL), TriangleFilesWritten(0), InternalPointer(PointsOnBoundary.begin())
     1149{
     1150  Info FunctionInfo(__func__);
    10591151}
    10601152;
     
    10651157Tesselation::~Tesselation()
    10661158{
    1067         Info FunctionInfo(__func__);
    1068   Log() << Verbose(0) << "Free'ing TesselStruct ... " << endl;
     1159  Info FunctionInfo(__func__);
     1160  DoLog(0) && (Log() << Verbose(0) << "Free'ing TesselStruct ... " << endl);
    10691161  for (TriangleMap::iterator runner = TrianglesOnBoundary.begin(); runner != TrianglesOnBoundary.end(); runner++) {
    10701162    if (runner->second != NULL) {
     
    10721164      runner->second = NULL;
    10731165    } else
    1074       eLog() << Verbose(1) << "The triangle " << runner->first << " has already been free'd." << endl;
    1075   }
    1076   Log() << Verbose(0) << "This envelope was written to file " << TriangleFilesWritten << " times(s)." << endl;
     1166      DoeLog(1) && (eLog() << Verbose(1) << "The triangle " << runner->first << " has already been free'd." << endl);
     1167  }
     1168  DoLog(0) && (Log() << Verbose(0) << "This envelope was written to file " << TriangleFilesWritten << " times(s)." << endl);
    10771169}
    10781170;
     
    10801172/** PointCloud implementation of GetCenter
    10811173 * Uses PointsOnBoundary and STL stuff.
    1082  */   
     1174 */
    10831175Vector * Tesselation::GetCenter(ofstream *out) const
    10841176{
    1085         Info FunctionInfo(__func__);
    1086   Vector *Center = new Vector(0.,0.,0.);
    1087   int num=0;
     1177  Info FunctionInfo(__func__);
     1178  Vector *Center = new Vector(0., 0., 0.);
     1179  int num = 0;
    10881180  for (GoToFirst(); (!IsEnd()); GoToNext()) {
    10891181    Center->AddVector(GetPoint()->node);
    10901182    num++;
    10911183  }
    1092   Center->Scale(1./num);
     1184  Center->Scale(1. / num);
    10931185  return Center;
    1094 };
     1186}
     1187;
    10951188
    10961189/** PointCloud implementation of GoPoint
    10971190 * Uses PointsOnBoundary and STL stuff.
    1098  */   
     1191 */
    10991192TesselPoint * Tesselation::GetPoint() const
    11001193{
    1101         Info FunctionInfo(__func__);
     1194  Info FunctionInfo(__func__);
    11021195  return (InternalPointer->second->node);
    1103 };
     1196}
     1197;
    11041198
    11051199/** PointCloud implementation of GetTerminalPoint.
    11061200 * Uses PointsOnBoundary and STL stuff.
    1107  */   
     1201 */
    11081202TesselPoint * Tesselation::GetTerminalPoint() const
    11091203{
    1110         Info FunctionInfo(__func__);
     1204  Info FunctionInfo(__func__);
    11111205  PointMap::const_iterator Runner = PointsOnBoundary.end();
    11121206  Runner--;
    11131207  return (Runner->second->node);
    1114 };
     1208}
     1209;
    11151210
    11161211/** PointCloud implementation of GoToNext.
    11171212 * Uses PointsOnBoundary and STL stuff.
    1118  */   
     1213 */
    11191214void Tesselation::GoToNext() const
    11201215{
    1121         Info FunctionInfo(__func__);
     1216  Info FunctionInfo(__func__);
    11221217  if (InternalPointer != PointsOnBoundary.end())
    11231218    InternalPointer++;
    1124 };
     1219}
     1220;
    11251221
    11261222/** PointCloud implementation of GoToPrevious.
    11271223 * Uses PointsOnBoundary and STL stuff.
    1128  */   
     1224 */
    11291225void Tesselation::GoToPrevious() const
    11301226{
    1131         Info FunctionInfo(__func__);
     1227  Info FunctionInfo(__func__);
    11321228  if (InternalPointer != PointsOnBoundary.begin())
    11331229    InternalPointer--;
    1134 };
     1230}
     1231;
    11351232
    11361233/** PointCloud implementation of GoToFirst.
    11371234 * Uses PointsOnBoundary and STL stuff.
    1138  */   
     1235 */
    11391236void Tesselation::GoToFirst() const
    11401237{
    1141         Info FunctionInfo(__func__);
     1238  Info FunctionInfo(__func__);
    11421239  InternalPointer = PointsOnBoundary.begin();
    1143 };
     1240}
     1241;
    11441242
    11451243/** PointCloud implementation of GoToLast.
     
    11481246void Tesselation::GoToLast() const
    11491247{
    1150         Info FunctionInfo(__func__);
     1248  Info FunctionInfo(__func__);
    11511249  InternalPointer = PointsOnBoundary.end();
    11521250  InternalPointer--;
    1153 };
     1251}
     1252;
    11541253
    11551254/** PointCloud implementation of IsEmpty.
    11561255 * Uses PointsOnBoundary and STL stuff.
    1157  */   
     1256 */
    11581257bool Tesselation::IsEmpty() const
    11591258{
    1160         Info FunctionInfo(__func__);
     1259  Info FunctionInfo(__func__);
    11611260  return (PointsOnBoundary.empty());
    1162 };
     1261}
     1262;
    11631263
    11641264/** PointCloud implementation of IsLast.
    11651265 * Uses PointsOnBoundary and STL stuff.
    1166  */   
     1266 */
    11671267bool Tesselation::IsEnd() const
    11681268{
    1169         Info FunctionInfo(__func__);
     1269  Info FunctionInfo(__func__);
    11701270  return (InternalPointer == PointsOnBoundary.end());
    1171 };
    1172 
     1271}
     1272;
    11731273
    11741274/** Gueses first starting triangle of the convex envelope.
     
    11791279void Tesselation::GuessStartingTriangle()
    11801280{
    1181         Info FunctionInfo(__func__);
     1281  Info FunctionInfo(__func__);
    11821282  // 4b. create a starting triangle
    11831283  // 4b1. create all distances
     
    11891289
    11901290  // with A chosen, take each pair B,C and sort
    1191   if (A != PointsOnBoundary.end())
    1192     {
    1193       B = A;
    1194       B++;
    1195       for (; B != PointsOnBoundary.end(); B++)
    1196         {
    1197           C = B;
    1198           C++;
    1199           for (; C != PointsOnBoundary.end(); C++)
    1200             {
    1201               tmp = A->second->node->node->DistanceSquared(B->second->node->node);
    1202               distance = tmp * tmp;
    1203               tmp = A->second->node->node->DistanceSquared(C->second->node->node);
    1204               distance += tmp * tmp;
    1205               tmp = B->second->node->node->DistanceSquared(C->second->node->node);
    1206               distance += tmp * tmp;
    1207               DistanceMMap.insert(DistanceMultiMapPair(distance, pair<PointMap::iterator, PointMap::iterator> (B, C)));
    1208             }
    1209         }
    1210     }
     1291  if (A != PointsOnBoundary.end()) {
     1292    B = A;
     1293    B++;
     1294    for (; B != PointsOnBoundary.end(); B++) {
     1295      C = B;
     1296      C++;
     1297      for (; C != PointsOnBoundary.end(); C++) {
     1298        tmp = A->second->node->node->DistanceSquared(B->second->node->node);
     1299        distance = tmp * tmp;
     1300        tmp = A->second->node->node->DistanceSquared(C->second->node->node);
     1301        distance += tmp * tmp;
     1302        tmp = B->second->node->node->DistanceSquared(C->second->node->node);
     1303        distance += tmp * tmp;
     1304        DistanceMMap.insert(DistanceMultiMapPair(distance, pair<PointMap::iterator, PointMap::iterator> (B, C)));
     1305      }
     1306    }
     1307  }
    12111308  //    // listing distances
    12121309  //    Log() << Verbose(1) << "Listing DistanceMMap:";
     
    12181315  // 1. we take from the smallest sum of squared distance as the base line BC (with peak A) onward as the triangle candidate
    12191316  DistanceMultiMap::iterator baseline = DistanceMMap.begin();
    1220   for (; baseline != DistanceMMap.end(); baseline++)
    1221     {
    1222       // we take from the smallest sum of squared distance as the base line BC (with peak A) onward as the triangle candidate
    1223       // 2. next, we have to check whether all points reside on only one side of the triangle
    1224       // 3. construct plane vector
    1225       PlaneVector.MakeNormalVector(A->second->node->node,
    1226           baseline->second.first->second->node->node,
    1227           baseline->second.second->second->node->node);
    1228       Log() << Verbose(2) << "Plane vector of candidate triangle is " << PlaneVector << endl;
    1229       // 4. loop over all points
    1230       double sign = 0.;
    1231       PointMap::iterator checker = PointsOnBoundary.begin();
    1232       for (; checker != PointsOnBoundary.end(); checker++)
    1233         {
    1234           // (neglecting A,B,C)
    1235           if ((checker == A) || (checker == baseline->second.first) || (checker
    1236               == baseline->second.second))
    1237             continue;
    1238           // 4a. project onto plane vector
    1239           TrialVector.CopyVector(checker->second->node->node);
    1240           TrialVector.SubtractVector(A->second->node->node);
    1241           distance = TrialVector.ScalarProduct(&PlaneVector);
    1242           if (fabs(distance) < 1e-4) // we need to have a small epsilon around 0 which is still ok
    1243             continue;
    1244           Log() << Verbose(2) << "Projection of " << checker->second->node->Name << " yields distance of " << distance << "." << endl;
    1245           tmp = distance / fabs(distance);
    1246           // 4b. Any have different sign to than before? (i.e. would lie outside convex hull with this starting triangle)
    1247           if ((sign != 0) && (tmp != sign))
    1248             {
    1249               // 4c. If so, break 4. loop and continue with next candidate in 1. loop
    1250               Log() << Verbose(2) << "Current candidates: "
    1251                   << A->second->node->Name << ","
    1252                   << baseline->second.first->second->node->Name << ","
    1253                   << baseline->second.second->second->node->Name << " leaves "
    1254                   << checker->second->node->Name << " outside the convex hull."
    1255                   << endl;
    1256               break;
    1257             }
    1258           else
    1259             { // note the sign for later
    1260               Log() << Verbose(2) << "Current candidates: "
    1261                   << A->second->node->Name << ","
    1262                   << baseline->second.first->second->node->Name << ","
    1263                   << baseline->second.second->second->node->Name << " leave "
    1264                   << checker->second->node->Name << " inside the convex hull."
    1265                   << endl;
    1266               sign = tmp;
    1267             }
    1268           // 4d. Check whether the point is inside the triangle (check distance to each node
    1269           tmp = checker->second->node->node->DistanceSquared(A->second->node->node);
    1270           int innerpoint = 0;
    1271           if ((tmp < A->second->node->node->DistanceSquared(
    1272               baseline->second.first->second->node->node)) && (tmp
    1273               < A->second->node->node->DistanceSquared(
    1274                   baseline->second.second->second->node->node)))
    1275             innerpoint++;
    1276           tmp = checker->second->node->node->DistanceSquared(
    1277               baseline->second.first->second->node->node);
    1278           if ((tmp < baseline->second.first->second->node->node->DistanceSquared(
    1279               A->second->node->node)) && (tmp
    1280               < baseline->second.first->second->node->node->DistanceSquared(
    1281                   baseline->second.second->second->node->node)))
    1282             innerpoint++;
    1283           tmp = checker->second->node->node->DistanceSquared(
    1284               baseline->second.second->second->node->node);
    1285           if ((tmp < baseline->second.second->second->node->node->DistanceSquared(
    1286               baseline->second.first->second->node->node)) && (tmp
    1287               < baseline->second.second->second->node->node->DistanceSquared(
    1288                   A->second->node->node)))
    1289             innerpoint++;
    1290           // 4e. If so, break 4. loop and continue with next candidate in 1. loop
    1291           if (innerpoint == 3)
    1292             break;
    1293         }
    1294       // 5. come this far, all on same side? Then break 1. loop and construct triangle
    1295       if (checker == PointsOnBoundary.end())
    1296         {
    1297           Log() << Verbose(2) << "Looks like we have a candidate!" << endl;
    1298           break;
    1299         }
    1300     }
    1301   if (baseline != DistanceMMap.end())
    1302     {
    1303       BPS[0] = baseline->second.first->second;
    1304       BPS[1] = baseline->second.second->second;
    1305       BLS[0] = new class BoundaryLineSet(BPS, LinesOnBoundaryCount);
    1306       BPS[0] = A->second;
    1307       BPS[1] = baseline->second.second->second;
    1308       BLS[1] = new class BoundaryLineSet(BPS, LinesOnBoundaryCount);
    1309       BPS[0] = baseline->second.first->second;
    1310       BPS[1] = A->second;
    1311       BLS[2] = new class BoundaryLineSet(BPS, LinesOnBoundaryCount);
    1312 
    1313       // 4b3. insert created triangle
    1314       BTS = new class BoundaryTriangleSet(BLS, TrianglesOnBoundaryCount);
    1315       TrianglesOnBoundary.insert(TrianglePair(TrianglesOnBoundaryCount, BTS));
    1316       TrianglesOnBoundaryCount++;
    1317       for (int i = 0; i < NDIM; i++)
    1318         {
    1319           LinesOnBoundary.insert(LinePair(LinesOnBoundaryCount, BTS->lines[i]));
    1320           LinesOnBoundaryCount++;
    1321         }
    1322 
    1323       Log() << Verbose(1) << "Starting triangle is " << *BTS << "." << endl;
    1324     }
    1325   else
    1326     {
    1327       eLog() << Verbose(0) << "No starting triangle found." << endl;
    1328     }
     1317  for (; baseline != DistanceMMap.end(); baseline++) {
     1318    // we take from the smallest sum of squared distance as the base line BC (with peak A) onward as the triangle candidate
     1319    // 2. next, we have to check whether all points reside on only one side of the triangle
     1320    // 3. construct plane vector
     1321    PlaneVector.MakeNormalVector(A->second->node->node, baseline->second.first->second->node->node, baseline->second.second->second->node->node);
     1322    DoLog(2) && (Log() << Verbose(2) << "Plane vector of candidate triangle is " << PlaneVector << endl);
     1323    // 4. loop over all points
     1324    double sign = 0.;
     1325    PointMap::iterator checker = PointsOnBoundary.begin();
     1326    for (; checker != PointsOnBoundary.end(); checker++) {
     1327      // (neglecting A,B,C)
     1328      if ((checker == A) || (checker == baseline->second.first) || (checker == baseline->second.second))
     1329        continue;
     1330      // 4a. project onto plane vector
     1331      TrialVector.CopyVector(checker->second->node->node);
     1332      TrialVector.SubtractVector(A->second->node->node);
     1333      distance = TrialVector.ScalarProduct(&PlaneVector);
     1334      if (fabs(distance) < 1e-4) // we need to have a small epsilon around 0 which is still ok
     1335        continue;
     1336      DoLog(2) && (Log() << Verbose(2) << "Projection of " << checker->second->node->Name << " yields distance of " << distance << "." << endl);
     1337      tmp = distance / fabs(distance);
     1338      // 4b. Any have different sign to than before? (i.e. would lie outside convex hull with this starting triangle)
     1339      if ((sign != 0) && (tmp != sign)) {
     1340        // 4c. If so, break 4. loop and continue with next candidate in 1. loop
     1341        DoLog(2) && (Log() << Verbose(2) << "Current candidates: " << A->second->node->Name << "," << baseline->second.first->second->node->Name << "," << baseline->second.second->second->node->Name << " leaves " << checker->second->node->Name << " outside the convex hull." << endl);
     1342        break;
     1343      } else { // note the sign for later
     1344        DoLog(2) && (Log() << Verbose(2) << "Current candidates: " << A->second->node->Name << "," << baseline->second.first->second->node->Name << "," << baseline->second.second->second->node->Name << " leave " << checker->second->node->Name << " inside the convex hull." << endl);
     1345        sign = tmp;
     1346      }
     1347      // 4d. Check whether the point is inside the triangle (check distance to each node
     1348      tmp = checker->second->node->node->DistanceSquared(A->second->node->node);
     1349      int innerpoint = 0;
     1350      if ((tmp < A->second->node->node->DistanceSquared(baseline->second.first->second->node->node)) && (tmp < A->second->node->node->DistanceSquared(baseline->second.second->second->node->node)))
     1351        innerpoint++;
     1352      tmp = checker->second->node->node->DistanceSquared(baseline->second.first->second->node->node);
     1353      if ((tmp < baseline->second.first->second->node->node->DistanceSquared(A->second->node->node)) && (tmp < baseline->second.first->second->node->node->DistanceSquared(baseline->second.second->second->node->node)))
     1354        innerpoint++;
     1355      tmp = checker->second->node->node->DistanceSquared(baseline->second.second->second->node->node);
     1356      if ((tmp < baseline->second.second->second->node->node->DistanceSquared(baseline->second.first->second->node->node)) && (tmp < baseline->second.second->second->node->node->DistanceSquared(A->second->node->node)))
     1357        innerpoint++;
     1358      // 4e. If so, break 4. loop and continue with next candidate in 1. loop
     1359      if (innerpoint == 3)
     1360        break;
     1361    }
     1362    // 5. come this far, all on same side? Then break 1. loop and construct triangle
     1363    if (checker == PointsOnBoundary.end()) {
     1364      DoLog(2) && (Log() << Verbose(2) << "Looks like we have a candidate!" << endl);
     1365      break;
     1366    }
     1367  }
     1368  if (baseline != DistanceMMap.end()) {
     1369    BPS[0] = baseline->second.first->second;
     1370    BPS[1] = baseline->second.second->second;
     1371    BLS[0] = new class BoundaryLineSet(BPS, LinesOnBoundaryCount);
     1372    BPS[0] = A->second;
     1373    BPS[1] = baseline->second.second->second;
     1374    BLS[1] = new class BoundaryLineSet(BPS, LinesOnBoundaryCount);
     1375    BPS[0] = baseline->second.first->second;
     1376    BPS[1] = A->second;
     1377    BLS[2] = new class BoundaryLineSet(BPS, LinesOnBoundaryCount);
     1378
     1379    // 4b3. insert created triangle
     1380    BTS = new class BoundaryTriangleSet(BLS, TrianglesOnBoundaryCount);
     1381    TrianglesOnBoundary.insert(TrianglePair(TrianglesOnBoundaryCount, BTS));
     1382    TrianglesOnBoundaryCount++;
     1383    for (int i = 0; i < NDIM; i++) {
     1384      LinesOnBoundary.insert(LinePair(LinesOnBoundaryCount, BTS->lines[i]));
     1385      LinesOnBoundaryCount++;
     1386    }
     1387
     1388    DoLog(1) && (Log() << Verbose(1) << "Starting triangle is " << *BTS << "." << endl);
     1389  } else {
     1390    DoeLog(0) && (eLog() << Verbose(0) << "No starting triangle found." << endl);
     1391  }
    13291392}
    13301393;
     
    13451408void Tesselation::TesselateOnBoundary(const PointCloud * const cloud)
    13461409{
    1347         Info FunctionInfo(__func__);
     1410  Info FunctionInfo(__func__);
    13481411  bool flag;
    13491412  PointMap::iterator winner;
     
    13641427        // get peak point with respect to this base line's only triangle
    13651428        BTS = baseline->second->triangles.begin()->second; // there is only one triangle so far
    1366         Log() << Verbose(0) << "Current baseline is between " << *(baseline->second) << "." << endl;
     1429        DoLog(0) && (Log() << Verbose(0) << "Current baseline is between " << *(baseline->second) << "." << endl);
    13671430        for (int i = 0; i < 3; i++)
    13681431          if ((BTS->endpoints[i] != baseline->second->endpoints[0]) && (BTS->endpoints[i] != baseline->second->endpoints[1]))
    13691432            peak = BTS->endpoints[i];
    1370         Log() << Verbose(1) << " and has peak " << *peak << "." << endl;
     1433        DoLog(1) && (Log() << Verbose(1) << " and has peak " << *peak << "." << endl);
    13711434
    13721435        // prepare some auxiliary vectors
     
    13831446          CenterVector.AddVector(BTS->endpoints[i]->node->node);
    13841447        CenterVector.Scale(1. / 3.);
    1385         Log() << Verbose(2) << "CenterVector of base triangle is " << CenterVector << endl;
     1448        DoLog(2) && (Log() << Verbose(2) << "CenterVector of base triangle is " << CenterVector << endl);
    13861449
    13871450        // normal vector of triangle
     
    13901453        BTS->GetNormalVector(NormalVector);
    13911454        NormalVector.CopyVector(&BTS->NormalVector);
    1392         Log() << Verbose(2) << "NormalVector of base triangle is " << NormalVector << endl;
     1455        DoLog(2) && (Log() << Verbose(2) << "NormalVector of base triangle is " << NormalVector << endl);
    13931456
    13941457        // vector in propagation direction (out of triangle)
     
    14001463        if (PropagationVector.ScalarProduct(&TempVector) > 0) // make sure normal propagation vector points outward from baseline
    14011464          PropagationVector.Scale(-1.);
    1402         Log() << Verbose(2) << "PropagationVector of base triangle is " << PropagationVector << endl;
     1465        DoLog(2) && (Log() << Verbose(2) << "PropagationVector of base triangle is " << PropagationVector << endl);
    14031466        winner = PointsOnBoundary.end();
    14041467
     
    14061469        for (PointMap::iterator target = PointsOnBoundary.begin(); target != PointsOnBoundary.end(); target++) {
    14071470          if ((target->second != baseline->second->endpoints[0]) && (target->second != baseline->second->endpoints[1])) { // don't take the same endpoints
    1408             Log() << Verbose(1) << "Target point is " << *(target->second) << ":" << endl;
     1471            DoLog(1) && (Log() << Verbose(1) << "Target point is " << *(target->second) << ":" << endl);
    14091472
    14101473            // first check direction, so that triangles don't intersect
     
    14131476            VirtualNormalVector.ProjectOntoPlane(&NormalVector);
    14141477            TempAngle = VirtualNormalVector.Angle(&PropagationVector);
    1415             Log() << Verbose(2) << "VirtualNormalVector is " << VirtualNormalVector << " and PropagationVector is " << PropagationVector << "." << endl;
    1416             if (TempAngle > (M_PI/2.)) { // no bends bigger than Pi/2 (90 degrees)
    1417               Log() << Verbose(2) << "Angle on triangle plane between propagation direction and base line to " << *(target->second) << " is " << TempAngle << ", bad direction!" << endl;
     1478            DoLog(2) && (Log() << Verbose(2) << "VirtualNormalVector is " << VirtualNormalVector << " and PropagationVector is " << PropagationVector << "." << endl);
     1479            if (TempAngle > (M_PI / 2.)) { // no bends bigger than Pi/2 (90 degrees)
     1480              DoLog(2) && (Log() << Verbose(2) << "Angle on triangle plane between propagation direction and base line to " << *(target->second) << " is " << TempAngle << ", bad direction!" << endl);
    14181481              continue;
    14191482            } else
    1420               Log() << Verbose(2) << "Angle on triangle plane between propagation direction and base line to " << *(target->second) << " is " << TempAngle << ", good direction!" << endl;
     1483              DoLog(2) && (Log() << Verbose(2) << "Angle on triangle plane between propagation direction and base line to " << *(target->second) << " is " << TempAngle << ", good direction!" << endl);
    14211484
    14221485            // check first and second endpoint (if any connecting line goes to target has at least not more than 1 triangle)
     
    14241487            LineChecker[1] = baseline->second->endpoints[1]->lines.find(target->first);
    14251488            if (((LineChecker[0] != baseline->second->endpoints[0]->lines.end()) && (LineChecker[0]->second->triangles.size() == 2))) {
    1426               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;
     1489              DoLog(2) && (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);
    14271490              continue;
    14281491            }
    14291492            if (((LineChecker[1] != baseline->second->endpoints[1]->lines.end()) && (LineChecker[1]->second->triangles.size() == 2))) {
    1430               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;
     1493              DoLog(2) && (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);
    14311494              continue;
    14321495            }
     
    14341497            // check whether the envisaged triangle does not already exist (if both lines exist and have same endpoint)
    14351498            if ((((LineChecker[0] != baseline->second->endpoints[0]->lines.end()) && (LineChecker[1] != baseline->second->endpoints[1]->lines.end()) && (GetCommonEndpoint(LineChecker[0]->second, LineChecker[1]->second) == peak)))) {
    1436               Log() << Verbose(4) << "Current target is peak!" << endl;
     1499              DoLog(4) && (Log() << Verbose(4) << "Current target is peak!" << endl);
    14371500              continue;
    14381501            }
     
    14451508            helper.ProjectOntoPlane(&TempVector);
    14461509            if (fabs(helper.NormSquared()) < MYEPSILON) {
    1447               Log() << Verbose(2) << "Chosen set of vectors is linear dependent." << endl;
     1510              DoLog(2) && (Log() << Verbose(2) << "Chosen set of vectors is linear dependent." << endl);
    14481511              continue;
    14491512            }
     
    14551518            TempVector.AddVector(baseline->second->endpoints[1]->node->node);
    14561519            TempVector.AddVector(target->second->node->node);
    1457             TempVector.Scale(1./3.);
     1520            TempVector.Scale(1. / 3.);
    14581521            TempVector.SubtractVector(Center);
    14591522            // make it always point outward
     
    14621525            // calculate angle
    14631526            TempAngle = NormalVector.Angle(&VirtualNormalVector);
    1464             Log() << Verbose(2) << "NormalVector is " << VirtualNormalVector << " and the angle is " << TempAngle << "." << endl;
     1527            DoLog(2) && (Log() << Verbose(2) << "NormalVector is " << VirtualNormalVector << " and the angle is " << TempAngle << "." << endl);
    14651528            if ((SmallestAngle - TempAngle) > MYEPSILON) { // set to new possible winner
    14661529              SmallestAngle = TempAngle;
    14671530              winner = target;
    1468               Log() << Verbose(2) << "New winner " << *winner->second->node << " due to smaller angle between normal vectors." << endl;
     1531              DoLog(2) && (Log() << Verbose(2) << "New winner " << *winner->second->node << " due to smaller angle between normal vectors." << endl);
    14691532            } else if (fabs(SmallestAngle - TempAngle) < MYEPSILON) { // check the angle to propagation, both possible targets are in one plane! (their normals have same angle)
    14701533              // hence, check the angles to some normal direction from our base line but in this common plane of both targets...
     
    14841547                SmallestAngle = TempAngle;
    14851548                winner = target;
    1486                 Log() << Verbose(2) << "New winner " << *winner->second->node << " due to smaller angle " << TempAngle << " to propagation direction." << endl;
     1549                DoLog(2) && (Log() << Verbose(2) << "New winner " << *winner->second->node << " due to smaller angle " << TempAngle << " to propagation direction." << endl);
    14871550              } else
    1488                 Log() << Verbose(2) << "Keeping old winner " << *winner->second->node << " due to smaller angle to propagation direction." << endl;
     1551                DoLog(2) && (Log() << Verbose(2) << "Keeping old winner " << *winner->second->node << " due to smaller angle to propagation direction." << endl);
    14891552            } else
    1490               Log() << Verbose(2) << "Keeping old winner " << *winner->second->node << " due to smaller angle between normal vectors." << endl;
     1553              DoLog(2) && (Log() << Verbose(2) << "Keeping old winner " << *winner->second->node << " due to smaller angle between normal vectors." << endl);
    14911554          }
    14921555        } // end of loop over all boundary points
     
    14941557        // 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
    14951558        if (winner != PointsOnBoundary.end()) {
    1496           Log() << Verbose(0) << "Winning target point is " << *(winner->second) << " with angle " << SmallestAngle << "." << endl;
     1559          DoLog(0) && (Log() << Verbose(0) << "Winning target point is " << *(winner->second) << " with angle " << SmallestAngle << "." << endl);
    14971560          // create the lins of not yet present
    14981561          BLS[0] = baseline->second;
     
    15241587          TrianglesOnBoundaryCount++;
    15251588        } else {
    1526           eLog() << Verbose(2) << "I could not determine a winner for this baseline " << *(baseline->second) << "." << endl;
     1589          DoeLog(2) && (eLog() << Verbose(2) << "I could not determine a winner for this baseline " << *(baseline->second) << "." << endl);
    15271590        }
    15281591
    15291592        // 5d. If the set of lines is not yet empty, go to 5. and continue
    15301593      } else
    1531         Log() << Verbose(0) << "Baseline candidate " << *(baseline->second) << " has a triangle count of " << baseline->second->triangles.size() << "." << endl;
     1594        DoLog(0) && (Log() << Verbose(0) << "Baseline candidate " << *(baseline->second) << " has a triangle count of " << baseline->second->triangles.size() << "." << endl);
    15321595  } while (flag);
    15331596
    15341597  // exit
    1535   delete(Center);
    1536 };
     1598  delete (Center);
     1599}
     1600;
    15371601
    15381602/** Inserts all points outside of the tesselated surface into it by adding new triangles.
     
    15441608bool Tesselation::InsertStraddlingPoints(const PointCloud *cloud, const LinkedCell *LC)
    15451609{
    1546         Info FunctionInfo(__func__);
     1610  Info FunctionInfo(__func__);
    15471611  Vector Intersection, Normal;
    15481612  TesselPoint *Walker = NULL;
     
    15541618  cloud->GoToFirst();
    15551619  BoundaryPoints = new LinkedCell(this, 5.);
    1556   while (!cloud->IsEnd()) {  // we only have to go once through all points, as boundary can become only bigger
     1620  while (!cloud->IsEnd()) { // we only have to go once through all points, as boundary can become only bigger
    15571621    if (AddFlag) {
    1558       delete(BoundaryPoints);
     1622      delete (BoundaryPoints);
    15591623      BoundaryPoints = new LinkedCell(this, 5.);
    15601624      AddFlag = false;
    15611625    }
    15621626    Walker = cloud->GetPoint();
    1563     Log() << Verbose(0) << "Current point is " << *Walker << "." << endl;
     1627    DoLog(0) && (Log() << Verbose(0) << "Current point is " << *Walker << "." << endl);
    15641628    // get the next triangle
    15651629    triangles = FindClosestTrianglesToVector(Walker->node, BoundaryPoints);
    15661630    BTS = triangles->front();
    15671631    if ((triangles == NULL) || (BTS->ContainsBoundaryPoint(Walker))) {
    1568       Log() << Verbose(0) << "No triangles found, probably a tesselation point itself." << endl;
     1632      DoLog(0) && (Log() << Verbose(0) << "No triangles found, probably a tesselation point itself." << endl);
    15691633      cloud->GoToNext();
    15701634      continue;
    15711635    } else {
    15721636    }
    1573     Log() << Verbose(0) << "Closest triangle is " << *BTS << "." << endl;
     1637    DoLog(0) && (Log() << Verbose(0) << "Closest triangle is " << *BTS << "." << endl);
    15741638    // get the intersection point
    15751639    if (BTS->GetIntersectionInsideTriangle(Center, Walker->node, &Intersection)) {
    1576       Log() << Verbose(0) << "We have an intersection at " << Intersection << "." << endl;
     1640      DoLog(0) && (Log() << Verbose(0) << "We have an intersection at " << Intersection << "." << endl);
    15771641      // we have the intersection, check whether in- or outside of boundary
    15781642      if ((Center->DistanceSquared(Walker->node) - Center->DistanceSquared(&Intersection)) < -MYEPSILON) {
    15791643        // inside, next!
    1580         Log() << Verbose(0) << *Walker << " is inside wrt triangle " << *BTS << "." << endl;
     1644        DoLog(0) && (Log() << Verbose(0) << *Walker << " is inside wrt triangle " << *BTS << "." << endl);
    15811645      } else {
    15821646        // outside!
    1583         Log() << Verbose(0) << *Walker << " is outside wrt triangle " << *BTS << "." << endl;
     1647        DoLog(0) && (Log() << Verbose(0) << *Walker << " is outside wrt triangle " << *BTS << "." << endl);
    15841648        class BoundaryLineSet *OldLines[3], *NewLines[3];
    15851649        class BoundaryPointSet *OldPoints[3], *NewPoint;
    15861650        // store the three old lines and old points
    1587         for (int i=0;i<3;i++) {
     1651        for (int i = 0; i < 3; i++) {
    15881652          OldLines[i] = BTS->lines[i];
    15891653          OldPoints[i] = BTS->endpoints[i];
     
    15911655        Normal.CopyVector(&BTS->NormalVector);
    15921656        // add Walker to boundary points
    1593         Log() << Verbose(0) << "Adding " << *Walker << " to BoundaryPoints." << endl;
     1657        DoLog(0) && (Log() << Verbose(0) << "Adding " << *Walker << " to BoundaryPoints." << endl);
    15941658        AddFlag = true;
    1595         if (AddBoundaryPoint(Walker,0))
     1659        if (AddBoundaryPoint(Walker, 0))
    15961660          NewPoint = BPS[0];
    15971661        else
    15981662          continue;
    15991663        // remove triangle
    1600         Log() << Verbose(0) << "Erasing triangle " << *BTS << "." << endl;
     1664        DoLog(0) && (Log() << Verbose(0) << "Erasing triangle " << *BTS << "." << endl);
    16011665        TrianglesOnBoundary.erase(BTS->Nr);
    1602         delete(BTS);
     1666        delete (BTS);
    16031667        // create three new boundary lines
    1604         for (int i=0;i<3;i++) {
     1668        for (int i = 0; i < 3; i++) {
    16051669          BPS[0] = NewPoint;
    16061670          BPS[1] = OldPoints[i];
    16071671          NewLines[i] = new class BoundaryLineSet(BPS, LinesOnBoundaryCount);
    1608           Log() << Verbose(1) << "Creating new line " << *NewLines[i] << "." << endl;
     1672          DoLog(1) && (Log() << Verbose(1) << "Creating new line " << *NewLines[i] << "." << endl);
    16091673          LinesOnBoundary.insert(LinePair(LinesOnBoundaryCount, NewLines[i])); // no need for check for unique insertion as BPS[0] is definitely a new one
    16101674          LinesOnBoundaryCount++;
    16111675        }
    16121676        // create three new triangle with new point
    1613         for (int i=0;i<3;i++) { // find all baselines
     1677        for (int i = 0; i < 3; i++) { // find all baselines
    16141678          BLS[0] = OldLines[i];
    16151679          int n = 1;
    1616           for (int j=0;j<3;j++) {
     1680          for (int j = 0; j < 3; j++) {
    16171681            if (NewLines[j]->IsConnectedTo(BLS[0])) {
    1618               if (n>2) {
    1619                 eLog() << Verbose(2) << BLS[0] << " connects to all of the new lines?!" << endl;
     1682              if (n > 2) {
     1683                DoeLog(2) && (eLog() << Verbose(2) << BLS[0] << " connects to all of the new lines?!" << endl);
    16201684                return false;
    16211685              } else
     
    16281692          BTS->GetNormalVector(Normal);
    16291693          Normal.Scale(-1.);
    1630           Log() << Verbose(0) << "Created new triangle " << *BTS << "." << endl;
     1694          DoLog(0) && (Log() << Verbose(0) << "Created new triangle " << *BTS << "." << endl);
    16311695          TrianglesOnBoundary.insert(TrianglePair(TrianglesOnBoundaryCount, BTS));
    16321696          TrianglesOnBoundaryCount++;
     
    16341698      }
    16351699    } else { // something is wrong with FindClosestTriangleToPoint!
    1636       eLog() << Verbose(1) << "The closest triangle did not produce an intersection!" << endl;
     1700      DoeLog(1) && (eLog() << Verbose(1) << "The closest triangle did not produce an intersection!" << endl);
    16371701      return false;
    16381702    }
     
    16411705
    16421706  // exit
    1643   delete(Center);
     1707  delete (Center);
    16441708  return true;
    1645 };
     1709}
     1710;
    16461711
    16471712/** Adds a point to the tesselation::PointsOnBoundary list.
     
    16521717bool Tesselation::AddBoundaryPoint(TesselPoint * Walker, const int n)
    16531718{
    1654         Info FunctionInfo(__func__);
     1719  Info FunctionInfo(__func__);
    16551720  PointTestPair InsertUnique;
    16561721  BPS[n] = new class BoundaryPointSet(Walker);
     
    16601725    return true;
    16611726  } else {
    1662     delete(BPS[n]);
     1727    delete (BPS[n]);
    16631728    BPS[n] = InsertUnique.first->second;
    16641729    return false;
     
    16741739void Tesselation::AddTesselationPoint(TesselPoint* Candidate, const int n)
    16751740{
    1676         Info FunctionInfo(__func__);
     1741  Info FunctionInfo(__func__);
    16771742  PointTestPair InsertUnique;
    16781743  TPS[n] = new class BoundaryPointSet(Candidate);
     
    16821747  } else {
    16831748    delete TPS[n];
    1684     Log() << Verbose(0) << "Node " << *((InsertUnique.first)->second->node) << " is already present in PointsOnBoundary." << endl;
     1749    DoLog(0) && (Log() << Verbose(0) << "Node " << *((InsertUnique.first)->second->node) << " is already present in PointsOnBoundary." << endl);
    16851750    TPS[n] = (InsertUnique.first)->second;
    16861751  }
     
    16951760void Tesselation::SetTesselationPoint(TesselPoint* Candidate, const int n) const
    16961761{
    1697         Info FunctionInfo(__func__);
     1762  Info FunctionInfo(__func__);
    16981763  PointMap::const_iterator FindPoint = PointsOnBoundary.find(Candidate->nr);
    16991764  if (FindPoint != PointsOnBoundary.end())
     
    17011766  else
    17021767    TPS[n] = NULL;
    1703 };
     1768}
     1769;
    17041770
    17051771/** Function tries to add line from current Points in BPS to BoundaryLineSet.
    17061772 * If successful it raises the line count and inserts the new line into the BLS,
    17071773 * if unsuccessful, it writes the line which had been present into the BLS, deleting the new constructed one.
     1774 * @param *OptCenter desired OptCenter if there are more than one candidate line
     1775 * @param *candidate third point of the triangle to be, for checking between multiple open line candidates
    17081776 * @param *a first endpoint
    17091777 * @param *b second endpoint
    17101778 * @param n index of Tesselation::BLS giving the line with both endpoints
    17111779 */
    1712 void Tesselation::AddTesselationLine(class BoundaryPointSet *a, class BoundaryPointSet *b, const int n) {
     1780void Tesselation::AddTesselationLine(const Vector * const OptCenter, const BoundaryPointSet * const candidate, class BoundaryPointSet *a, class BoundaryPointSet *b, const int n)
     1781{
    17131782  bool insertNewLine = true;
    1714 
    17151783  LineMap::iterator FindLine = a->lines.find(b->node->nr);
     1784  BoundaryLineSet *WinningLine = NULL;
    17161785  if (FindLine != a->lines.end()) {
    1717     Log() << Verbose(1) << "INFO: There is at least one line between " << *a << " and " << *b << ": " << *(FindLine->second) << "." << endl;
    1718 
    1719     pair<LineMap::iterator,LineMap::iterator> FindPair;
     1786    DoLog(1) && (Log() << Verbose(1) << "INFO: There is at least one line between " << *a << " and " << *b << ": " << *(FindLine->second) << "." << endl);
     1787
     1788    pair<LineMap::iterator, LineMap::iterator> FindPair;
    17201789    FindPair = a->lines.equal_range(b->node->nr);
    17211790
    1722     for (FindLine = FindPair.first; FindLine != FindPair.second; FindLine++) {
     1791    for (FindLine = FindPair.first; (FindLine != FindPair.second) && (insertNewLine); FindLine++) {
     1792      DoLog(1) && (Log() << Verbose(1) << "INFO: Checking line " << *(FindLine->second) << " ..." << endl);
    17231793      // If there is a line with less than two attached triangles, we don't need a new line.
    1724       if (FindLine->second->triangles.size() < 2) {
    1725         insertNewLine = false;
    1726         Log() << Verbose(0) << "Using existing line " << *FindLine->second << endl;
    1727 
    1728         BPS[0] = FindLine->second->endpoints[0];
    1729         BPS[1] = FindLine->second->endpoints[1];
    1730         BLS[n] = FindLine->second;
    1731 
    1732         // remove existing line from OpenLines
    1733         CandidateMap::iterator CandidateLine = OpenLines.find(BLS[n]);
    1734         if (CandidateLine != OpenLines.end()) {
    1735           Log() << Verbose(1) << " Removing line from OpenLines." << endl;
    1736           delete(CandidateLine->second);
    1737           OpenLines.erase(CandidateLine);
    1738         } else {
    1739           eLog() << Verbose(1) << "Line exists and is attached to less than two triangles, but not in OpenLines!" << endl;
     1794      if (FindLine->second->triangles.size() == 1) {
     1795        CandidateMap::iterator Finder = OpenLines.find(FindLine->second);
     1796        if (!Finder->second->pointlist.empty())
     1797          DoLog(1) && (Log() << Verbose(1) << "INFO: line " << *(FindLine->second) << " is open with candidate " << **(Finder->second->pointlist.begin()) << "." << endl);
     1798        else
     1799          DoLog(1) && (Log() << Verbose(1) << "INFO: line " << *(FindLine->second) << " is open with no candidate." << endl);
     1800        // get open line
     1801        for (TesselPointList::const_iterator CandidateChecker = Finder->second->pointlist.begin(); CandidateChecker != Finder->second->pointlist.end(); ++CandidateChecker) {
     1802          if ((*(CandidateChecker) == candidate->node) && (OptCenter == NULL || OptCenter->DistanceSquared(&Finder->second->OptCenter) < MYEPSILON )) { // stop searching if candidate matches
     1803            DoLog(1) && (Log() << Verbose(1) << "ACCEPT: Candidate " << *(*CandidateChecker) << " has the right center " << Finder->second->OptCenter << "." << endl);
     1804            insertNewLine = false;
     1805            WinningLine = FindLine->second;
     1806            break;
     1807          } else {
     1808            DoLog(1) && (Log() << Verbose(1) << "REJECT: Candidate " << *(*CandidateChecker) << "'s center " << Finder->second->OptCenter << " does not match desired on " << *OptCenter << "." << endl);
     1809          }
    17401810        }
    1741 
    1742         break;
    17431811      }
    17441812    }
     
    17461814
    17471815  if (insertNewLine) {
    1748     AlwaysAddTesselationTriangleLine(a, b, n);
     1816    AddNewTesselationTriangleLine(a, b, n);
     1817  } else {
     1818    AddExistingTesselationTriangleLine(WinningLine, n);
    17491819  }
    17501820}
     
    17591829 * @param n index of Tesselation::BLS giving the line with both endpoints
    17601830 */
    1761 void Tesselation::AlwaysAddTesselationTriangleLine(class BoundaryPointSet *a, class BoundaryPointSet *b, const int n)
    1762 {
    1763         Info FunctionInfo(__func__);
    1764   Log() << Verbose(0) << "Adding open line [" << LinesOnBoundaryCount << "|" << *(a->node) << " and " << *(b->node) << "." << endl;
     1831void Tesselation::AddNewTesselationTriangleLine(class BoundaryPointSet *a, class BoundaryPointSet *b, const int n)
     1832{
     1833  Info FunctionInfo(__func__);
     1834  DoLog(0) && (Log() << Verbose(0) << "Adding open line [" << LinesOnBoundaryCount << "|" << *(a->node) << " and " << *(b->node) << "." << endl);
    17651835  BPS[0] = a;
    17661836  BPS[1] = b;
    1767   BLS[n] = new class BoundaryLineSet(BPS, LinesOnBoundaryCount);  // this also adds the line to the local maps
     1837  BLS[n] = new class BoundaryLineSet(BPS, LinesOnBoundaryCount); // this also adds the line to the local maps
    17681838  // add line to global map
    17691839  LinesOnBoundary.insert(LinePair(LinesOnBoundaryCount, BLS[n]));
     
    17721842  // also add to open lines
    17731843  CandidateForTesselation *CFT = new CandidateForTesselation(BLS[n]);
    1774   OpenLines.insert(pair< BoundaryLineSet *, CandidateForTesselation *> (BLS[n], CFT));
    1775 };
     1844  OpenLines.insert(pair<BoundaryLineSet *, CandidateForTesselation *> (BLS[n], CFT));
     1845}
     1846;
     1847
     1848/** Uses an existing line for a new triangle.
     1849 * Sets Tesselation::BLS[\a n] and removes the lines from Tesselation::OpenLines.
     1850 * \param *FindLine the line to add
     1851 * \param n index of the line to set in Tesselation::BLS
     1852 */
     1853void Tesselation::AddExistingTesselationTriangleLine(class BoundaryLineSet *Line, int n)
     1854{
     1855  Info FunctionInfo(__func__);
     1856  DoLog(0) && (Log() << Verbose(0) << "Using existing line " << *Line << endl);
     1857
     1858  // set endpoints and line
     1859  BPS[0] = Line->endpoints[0];
     1860  BPS[1] = Line->endpoints[1];
     1861  BLS[n] = Line;
     1862  // remove existing line from OpenLines
     1863  CandidateMap::iterator CandidateLine = OpenLines.find(BLS[n]);
     1864  if (CandidateLine != OpenLines.end()) {
     1865    DoLog(1) && (Log() << Verbose(1) << " Removing line from OpenLines." << endl);
     1866    delete (CandidateLine->second);
     1867    OpenLines.erase(CandidateLine);
     1868  } else {
     1869    DoeLog(1) && (eLog() << Verbose(1) << "Line exists and is attached to less than two triangles, but not in OpenLines!" << endl);
     1870  }
     1871}
     1872;
    17761873
    17771874/** Function adds triangle to global list.
     
    17801877void Tesselation::AddTesselationTriangle()
    17811878{
    1782         Info FunctionInfo(__func__);
    1783   Log() << Verbose(1) << "Adding triangle to global TrianglesOnBoundary map." << endl;
     1879  Info FunctionInfo(__func__);
     1880  DoLog(1) && (Log() << Verbose(1) << "Adding triangle to global TrianglesOnBoundary map." << endl);
    17841881
    17851882  // add triangle to global map
     
    17911888
    17921889  // NOTE: add triangle to local maps is done in constructor of BoundaryTriangleSet
    1793 };
     1890}
     1891;
    17941892
    17951893/** Function adds triangle to global list.
     
    17991897void Tesselation::AddTesselationTriangle(const int nr)
    18001898{
    1801         Info FunctionInfo(__func__);
    1802   Log() << Verbose(0) << "Adding triangle to global TrianglesOnBoundary map." << endl;
     1899  Info FunctionInfo(__func__);
     1900  DoLog(0) && (Log() << Verbose(0) << "Adding triangle to global TrianglesOnBoundary map." << endl);
    18031901
    18041902  // add triangle to global map
     
    18091907
    18101908  // NOTE: add triangle to local maps is done in constructor of BoundaryTriangleSet
    1811 };
     1909}
     1910;
    18121911
    18131912/** Removes a triangle from the tesselation.
     
    18181917void Tesselation::RemoveTesselationTriangle(class BoundaryTriangleSet *triangle)
    18191918{
    1820         Info FunctionInfo(__func__);
     1919  Info FunctionInfo(__func__);
    18211920  if (triangle == NULL)
    18221921    return;
    18231922  for (int i = 0; i < 3; i++) {
    18241923    if (triangle->lines[i] != NULL) {
    1825       Log() << Verbose(0) << "Removing triangle Nr." << triangle->Nr << " in line " << *triangle->lines[i] << "." << endl;
     1924      DoLog(0) && (Log() << Verbose(0) << "Removing triangle Nr." << triangle->Nr << " in line " << *triangle->lines[i] << "." << endl);
    18261925      triangle->lines[i]->triangles.erase(triangle->Nr);
    18271926      if (triangle->lines[i]->triangles.empty()) {
    1828           Log() << Verbose(0) << *triangle->lines[i] << " is no more attached to any triangle, erasing." << endl;
    1829           RemoveTesselationLine(triangle->lines[i]);
     1927        DoLog(0) && (Log() << Verbose(0) << *triangle->lines[i] << " is no more attached to any triangle, erasing." << endl);
     1928        RemoveTesselationLine(triangle->lines[i]);
    18301929      } else {
    1831         Log() << Verbose(0) << *triangle->lines[i] << " is still attached to another triangle: ";
    1832         OpenLines.insert(pair< BoundaryLineSet *, CandidateForTesselation *> (triangle->lines[i], NULL));
    1833         for(TriangleMap::iterator TriangleRunner = triangle->lines[i]->triangles.begin(); TriangleRunner != triangle->lines[i]->triangles.end(); TriangleRunner++)
    1834           Log() << Verbose(0) << "[" << (TriangleRunner->second)->Nr << "|" << *((TriangleRunner->second)->endpoints[0]) << ", " << *((TriangleRunner->second)->endpoints[1]) << ", " << *((TriangleRunner->second)->endpoints[2]) << "] \t";
    1835         Log() << Verbose(0) << endl;
    1836 //        for (int j=0;j<2;j++) {
    1837 //          Log() << Verbose(0) << "Lines of endpoint " << *(triangle->lines[i]->endpoints[j]) << ": ";
    1838 //          for(LineMap::iterator LineRunner = triangle->lines[i]->endpoints[j]->lines.begin(); LineRunner != triangle->lines[i]->endpoints[j]->lines.end(); LineRunner++)
    1839 //            Log() << Verbose(0) << "[" << *(LineRunner->second) << "] \t";
    1840 //          Log() << Verbose(0) << endl;
    1841 //        }
     1930        DoLog(0) && (Log() << Verbose(0) << *triangle->lines[i] << " is still attached to another triangle: ");
     1931        OpenLines.insert(pair<BoundaryLineSet *, CandidateForTesselation *> (triangle->lines[i], NULL));
     1932        for (TriangleMap::iterator TriangleRunner = triangle->lines[i]->triangles.begin(); TriangleRunner != triangle->lines[i]->triangles.end(); TriangleRunner++)
     1933          DoLog(0) && (Log() << Verbose(0) << "[" << (TriangleRunner->second)->Nr << "|" << *((TriangleRunner->second)->endpoints[0]) << ", " << *((TriangleRunner->second)->endpoints[1]) << ", " << *((TriangleRunner->second)->endpoints[2]) << "] \t");
     1934        DoLog(0) && (Log() << Verbose(0) << endl);
     1935        //        for (int j=0;j<2;j++) {
     1936        //          Log() << Verbose(0) << "Lines of endpoint " << *(triangle->lines[i]->endpoints[j]) << ": ";
     1937        //          for(LineMap::iterator LineRunner = triangle->lines[i]->endpoints[j]->lines.begin(); LineRunner != triangle->lines[i]->endpoints[j]->lines.end(); LineRunner++)
     1938        //            Log() << Verbose(0) << "[" << *(LineRunner->second) << "] \t";
     1939        //          Log() << Verbose(0) << endl;
     1940        //        }
    18421941      }
    1843       triangle->lines[i] = NULL;  // free'd or not: disconnect
     1942      triangle->lines[i] = NULL; // free'd or not: disconnect
    18441943    } else
    1845       eLog() << Verbose(1) << "This line " << i << " has already been free'd." << endl;
     1944      DoeLog(1) && (eLog() << Verbose(1) << "This line " << i << " has already been free'd." << endl);
    18461945  }
    18471946
    18481947  if (TrianglesOnBoundary.erase(triangle->Nr))
    1849     Log() << Verbose(0) << "Removing triangle Nr. " << triangle->Nr << "." << endl;
    1850   delete(triangle);
    1851 };
     1948    DoLog(0) && (Log() << Verbose(0) << "Removing triangle Nr. " << triangle->Nr << "." << endl);
     1949  delete (triangle);
     1950}
     1951;
    18521952
    18531953/** Removes a line from the tesselation.
     
    18571957void Tesselation::RemoveTesselationLine(class BoundaryLineSet *line)
    18581958{
    1859         Info FunctionInfo(__func__);
     1959  Info FunctionInfo(__func__);
    18601960  int Numbers[2];
    18611961
     
    18781978        for (LineMap::iterator Runner = erasor.first; Runner != erasor.second; Runner++)
    18791979          if ((*Runner).second == line) {
    1880             Log() << Verbose(0) << "Removing Line Nr. " << line->Nr << " in boundary point " << *line->endpoints[i] << "." << endl;
     1980            DoLog(0) && (Log() << Verbose(0) << "Removing Line Nr. " << line->Nr << " in boundary point " << *line->endpoints[i] << "." << endl);
    18811981            line->endpoints[i]->lines.erase(Runner);
    18821982            break;
     
    18841984      } else { // there's just a single line left
    18851985        if (line->endpoints[i]->lines.erase(line->Nr))
    1886           Log() << Verbose(0) << "Removing Line Nr. " << line->Nr << " in boundary point " << *line->endpoints[i] << "." << endl;
     1986          DoLog(0) && (Log() << Verbose(0) << "Removing Line Nr. " << line->Nr << " in boundary point " << *line->endpoints[i] << "." << endl);
    18871987      }
    18881988      if (line->endpoints[i]->lines.empty()) {
    1889         Log() << Verbose(0) << *line->endpoints[i] << " has no more lines it's attached to, erasing." << endl;
     1989        DoLog(0) && (Log() << Verbose(0) << *line->endpoints[i] << " has no more lines it's attached to, erasing." << endl);
    18901990        RemoveTesselationPoint(line->endpoints[i]);
    18911991      } else {
    1892         Log() << Verbose(0) << *line->endpoints[i] << " has still lines it's attached to: ";
    1893         for(LineMap::iterator LineRunner = line->endpoints[i]->lines.begin(); LineRunner != line->endpoints[i]->lines.end(); LineRunner++)
    1894           Log() << Verbose(0) << "[" << *(LineRunner->second) << "] \t";
    1895         Log() << Verbose(0) << endl;
     1992        DoLog(0) && (Log() << Verbose(0) << *line->endpoints[i] << " has still lines it's attached to: ");
     1993        for (LineMap::iterator LineRunner = line->endpoints[i]->lines.begin(); LineRunner != line->endpoints[i]->lines.end(); LineRunner++)
     1994          DoLog(0) && (Log() << Verbose(0) << "[" << *(LineRunner->second) << "] \t");
     1995        DoLog(0) && (Log() << Verbose(0) << endl);
    18961996      }
    1897       line->endpoints[i] = NULL;  // free'd or not: disconnect
     1997      line->endpoints[i] = NULL; // free'd or not: disconnect
    18981998    } else
    1899       eLog() << Verbose(1) << "Endpoint " << i << " has already been free'd." << endl;
     1999      DoeLog(1) && (eLog() << Verbose(1) << "Endpoint " << i << " has already been free'd." << endl);
    19002000  }
    19012001  if (!line->triangles.empty())
    1902     eLog() << Verbose(2) << "Memory Leak! I " << *line << " am still connected to some triangles." << endl;
     2002    DoeLog(2) && (eLog() << Verbose(2) << "Memory Leak! I " << *line << " am still connected to some triangles." << endl);
    19032003
    19042004  if (LinesOnBoundary.erase(line->Nr))
    1905     Log() << Verbose(0) << "Removing line Nr. " << line->Nr << "." << endl;
    1906   delete(line);
    1907 };
     2005    DoLog(0) && (Log() << Verbose(0) << "Removing line Nr. " << line->Nr << "." << endl);
     2006  delete (line);
     2007}
     2008;
    19082009
    19092010/** Removes a point from the tesselation.
     
    19142015void Tesselation::RemoveTesselationPoint(class BoundaryPointSet *point)
    19152016{
    1916         Info FunctionInfo(__func__);
     2017  Info FunctionInfo(__func__);
    19172018  if (point == NULL)
    19182019    return;
    19192020  if (PointsOnBoundary.erase(point->Nr))
    1920     Log() << Verbose(0) << "Removing point Nr. " << point->Nr << "." << endl;
    1921   delete(point);
    1922 };
     2021    DoLog(0) && (Log() << Verbose(0) << "Removing point Nr. " << point->Nr << "." << endl);
     2022  delete (point);
     2023}
     2024;
     2025
     2026/** Checks validity of a given sphere of a candidate line.
     2027 * \sa CandidateForTesselation::CheckValidity(), which is more evolved.
     2028 * We check CandidateForTesselation::OtherOptCenter
     2029 * \param &CandidateLine contains other degenerated candidates which we have to subtract as well
     2030 * \param RADIUS radius of sphere
     2031 * \param *LC LinkedCell structure with other atoms
     2032 * \return true - candidate triangle is degenerated, false - candidate triangle is not degenerated
     2033 */
     2034bool Tesselation::CheckDegeneracy(CandidateForTesselation &CandidateLine, const double RADIUS, const LinkedCell *LC) const
     2035{
     2036  Info FunctionInfo(__func__);
     2037
     2038  DoLog(1) && (Log() << Verbose(1) << "INFO: Checking whether sphere contains no others points ..." << endl);
     2039  bool flag = true;
     2040
     2041  DoLog(1) && (Log() << Verbose(1) << "Check by: draw sphere {" << CandidateLine.OtherOptCenter.x[0] << " " << CandidateLine.OtherOptCenter.x[1] << " " << CandidateLine.OtherOptCenter.x[2] << "} radius " << RADIUS << " resolution 30" << endl);
     2042  // get all points inside the sphere
     2043  TesselPointList *ListofPoints = LC->GetPointsInsideSphere(RADIUS, &CandidateLine.OtherOptCenter);
     2044
     2045  DoLog(1) && (Log() << Verbose(1) << "The following atoms are inside sphere at " << CandidateLine.OtherOptCenter << ":" << endl);
     2046  for (TesselPointList::const_iterator Runner = ListofPoints->begin(); Runner != ListofPoints->end(); ++Runner)
     2047    DoLog(1) && (Log() << Verbose(1) << "  " << *(*Runner) << " with distance " << (*Runner)->node->Distance(&CandidateLine.OtherOptCenter) << "." << endl);
     2048
     2049  // remove triangles's endpoints
     2050  for (int i = 0; i < 2; i++)
     2051    ListofPoints->remove(CandidateLine.BaseLine->endpoints[i]->node);
     2052
     2053  // remove other candidates
     2054  for (TesselPointList::const_iterator Runner = CandidateLine.pointlist.begin(); Runner != CandidateLine.pointlist.end(); ++Runner)
     2055    ListofPoints->remove(*Runner);
     2056
     2057  // check for other points
     2058  if (!ListofPoints->empty()) {
     2059    DoLog(1) && (Log() << Verbose(1) << "CheckDegeneracy: There are still " << ListofPoints->size() << " points inside the sphere." << endl);
     2060    flag = false;
     2061    DoLog(1) && (Log() << Verbose(1) << "External atoms inside of sphere at " << CandidateLine.OtherOptCenter << ":" << endl);
     2062    for (TesselPointList::const_iterator Runner = ListofPoints->begin(); Runner != ListofPoints->end(); ++Runner)
     2063      DoLog(1) && (Log() << Verbose(1) << "  " << *(*Runner) << " with distance " << (*Runner)->node->Distance(&CandidateLine.OtherOptCenter) << "." << endl);
     2064  }
     2065  delete (ListofPoints);
     2066
     2067  return flag;
     2068}
     2069;
    19232070
    19242071/** Checks whether the triangle consisting of the three points is already present.
     
    19332080int Tesselation::CheckPresenceOfTriangle(TesselPoint *Candidates[3]) const
    19342081{
    1935         Info FunctionInfo(__func__);
     2082  Info FunctionInfo(__func__);
    19362083  int adjacentTriangleCount = 0;
    19372084  class BoundaryPointSet *Points[3];
     
    19552102          for (; (FindLine != Points[i]->lines.end()) && (FindLine->first == Points[j]->node->nr); FindLine++) {
    19562103            TriangleMap *triangles = &FindLine->second->triangles;
    1957             Log() << Verbose(1) << "Current line is " << FindLine->first << ": " << *(FindLine->second) << " with triangles " << triangles << "." << endl;
     2104            DoLog(1) && (Log() << Verbose(1) << "Current line is " << FindLine->first << ": " << *(FindLine->second) << " with triangles " << triangles << "." << endl);
    19582105            for (TriangleMap::const_iterator FindTriangle = triangles->begin(); FindTriangle != triangles->end(); FindTriangle++) {
    19592106              if (FindTriangle->second->IsPresentTupel(Points)) {
     
    19612108              }
    19622109            }
    1963             Log() << Verbose(1) << "end." << endl;
     2110            DoLog(1) && (Log() << Verbose(1) << "end." << endl);
    19642111          }
    19652112          // Only one of the triangle lines must be considered for the triangle count.
     
    19712118  }
    19722119
    1973   Log() << Verbose(0) << "Found " << adjacentTriangleCount << " adjacent triangles for the point set." << endl;
     2120  DoLog(0) && (Log() << Verbose(0) << "Found " << adjacentTriangleCount << " adjacent triangles for the point set." << endl);
    19742121  return adjacentTriangleCount;
    1975 };
     2122}
     2123;
    19762124
    19772125/** Checks whether the triangle consisting of the three points is already present.
     
    19852133class BoundaryTriangleSet * Tesselation::GetPresentTriangle(TesselPoint *Candidates[3])
    19862134{
    1987         Info FunctionInfo(__func__);
     2135  Info FunctionInfo(__func__);
    19882136  class BoundaryTriangleSet *triangle = NULL;
    19892137  class BoundaryPointSet *Points[3];
     
    20232171
    20242172  return triangle;
    2025 };
    2026 
     2173}
     2174;
    20272175
    20282176/** Finds the starting triangle for FindNonConvexBorder().
     
    20332181 * \param RADIUS radius of virtual rolling sphere
    20342182 * \param *LC LinkedCell structure with neighbouring TesselPoint's
    2035  */
    2036 void Tesselation::FindStartingTriangle(const double RADIUS, const LinkedCell *LC)
    2037 {
    2038         Info FunctionInfo(__func__);
     2183 * \return true - a starting triangle has been created, false - no valid triple of points found
     2184 */
     2185bool Tesselation::FindStartingTriangle(const double RADIUS, const LinkedCell *LC)
     2186{
     2187  Info FunctionInfo(__func__);
    20392188  int i = 0;
    20402189  TesselPoint* MaxPoint[NDIM];
    20412190  TesselPoint* Temporary;
    20422191  double maxCoordinate[NDIM];
    2043   BoundaryLineSet BaseLine;
     2192  BoundaryLineSet *BaseLine = NULL;
    20442193  Vector helper;
    20452194  Vector Chord;
    20462195  Vector SearchDirection;
    2047   Vector CircleCenter;  // center of the circle, i.e. of the band of sphere's centers
     2196  Vector CircleCenter; // center of the circle, i.e. of the band of sphere's centers
    20482197  Vector CirclePlaneNormal; // normal vector defining the plane this circle lives in
    20492198  Vector SphereCenter;
     
    20582207
    20592208  // 1. searching topmost point with respect to each axis
    2060   for (int i=0;i<NDIM;i++) { // each axis
    2061     LC->n[i] = LC->N[i]-1; // current axis is topmost cell
    2062     for (LC->n[(i+1)%NDIM]=0;LC->n[(i+1)%NDIM]<LC->N[(i+1)%NDIM];LC->n[(i+1)%NDIM]++)
    2063       for (LC->n[(i+2)%NDIM]=0;LC->n[(i+2)%NDIM]<LC->N[(i+2)%NDIM];LC->n[(i+2)%NDIM]++) {
    2064         const LinkedNodes *List = LC->GetCurrentCell();
     2209  for (int i = 0; i < NDIM; i++) { // each axis
     2210    LC->n[i] = LC->N[i] - 1; // current axis is topmost cell
     2211    for (LC->n[(i + 1) % NDIM] = 0; LC->n[(i + 1) % NDIM] < LC->N[(i + 1) % NDIM]; LC->n[(i + 1) % NDIM]++)
     2212      for (LC->n[(i + 2) % NDIM] = 0; LC->n[(i + 2) % NDIM] < LC->N[(i + 2) % NDIM]; LC->n[(i + 2) % NDIM]++) {
     2213        const LinkedCell::LinkedNodes *List = LC->GetCurrentCell();
    20652214        //Log() << Verbose(1) << "Current cell is " << LC->n[0] << ", " << LC->n[1] << ", " << LC->n[2] << " with No. " << LC->index << "." << endl;
    20662215        if (List != NULL) {
    2067           for (LinkedNodes::const_iterator Runner = List->begin();Runner != List->end();Runner++) {
     2216          for (LinkedCell::LinkedNodes::const_iterator Runner = List->begin(); Runner != List->end(); Runner++) {
    20682217            if ((*Runner)->node->x[i] > maxCoordinate[i]) {
    2069               Log() << Verbose(1) << "New maximal for axis " << i << " node is " << *(*Runner) << " at " << *(*Runner)->node << "." << endl;
     2218              DoLog(1) && (Log() << Verbose(1) << "New maximal for axis " << i << " node is " << *(*Runner) << " at " << *(*Runner)->node << "." << endl);
    20702219              maxCoordinate[i] = (*Runner)->node->x[i];
    20712220              MaxPoint[i] = (*Runner);
     
    20732222          }
    20742223        } else {
    2075           eLog() << Verbose(1) << "The current cell " << LC->n[0] << "," << LC->n[1] << "," << LC->n[2] << " is invalid!" << endl;
     2224          DoeLog(1) && (eLog() << Verbose(1) << "The current cell " << LC->n[0] << "," << LC->n[1] << "," << LC->n[2] << " is invalid!" << endl);
    20762225        }
    20772226      }
    20782227  }
    20792228
    2080   Log() << Verbose(1) << "Found maximum coordinates: ";
    2081   for (int i=0;i<NDIM;i++)
    2082     Log() << Verbose(0) << i << ": " << *MaxPoint[i] << "\t";
    2083   Log() << Verbose(0) << endl;
     2229  DoLog(1) && (Log() << Verbose(1) << "Found maximum coordinates: ");
     2230  for (int i = 0; i < NDIM; i++)
     2231    DoLog(0) && (Log() << Verbose(0) << i << ": " << *MaxPoint[i] << "\t");
     2232  DoLog(0) && (Log() << Verbose(0) << endl);
    20842233
    20852234  BTS = NULL;
    2086   for (int k=0;k<NDIM;k++) {
     2235  for (int k = 0; k < NDIM; k++) {
    20872236    NormalVector.Zero();
    20882237    NormalVector.x[k] = 1.;
    2089     BaseLine.endpoints[0] = new BoundaryPointSet(MaxPoint[k]);
    2090     Log() << Verbose(0) << "Coordinates of start node at " << *BaseLine.endpoints[0]->node << "." << endl;
     2238    BaseLine = new BoundaryLineSet();
     2239    BaseLine->endpoints[0] = new BoundaryPointSet(MaxPoint[k]);
     2240    DoLog(0) && (Log() << Verbose(0) << "Coordinates of start node at " << *BaseLine->endpoints[0]->node << "." << endl);
    20912241
    20922242    double ShortestAngle;
    20932243    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.
    20942244
    2095     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_...
    2096     if (Temporary == NULL)  // have we found a second point?
     2245    Temporary = NULL;
     2246    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_...
     2247    if (Temporary == NULL) {
     2248      // have we found a second point?
     2249      delete BaseLine;
    20972250      continue;
    2098     BaseLine.endpoints[1] = new BoundaryPointSet(Temporary);
     2251    }
     2252    BaseLine->endpoints[1] = new BoundaryPointSet(Temporary);
    20992253
    21002254    // construct center of circle
    2101     CircleCenter.CopyVector(BaseLine.endpoints[0]->node->node);
    2102     CircleCenter.AddVector(BaseLine.endpoints[1]->node->node);
     2255    CircleCenter.CopyVector(BaseLine->endpoints[0]->node->node);
     2256    CircleCenter.AddVector(BaseLine->endpoints[1]->node->node);
    21032257    CircleCenter.Scale(0.5);
    21042258
    21052259    // construct normal vector of circle
    2106     CirclePlaneNormal.CopyVector(BaseLine.endpoints[0]->node->node);
    2107     CirclePlaneNormal.SubtractVector(BaseLine.endpoints[1]->node->node);
     2260    CirclePlaneNormal.CopyVector(BaseLine->endpoints[0]->node->node);
     2261    CirclePlaneNormal.SubtractVector(BaseLine->endpoints[1]->node->node);
    21082262
    21092263    double radius = CirclePlaneNormal.NormSquared();
    2110     double CircleRadius = sqrt(RADIUS*RADIUS - radius/4.);
     2264    double CircleRadius = sqrt(RADIUS * RADIUS - radius / 4.);
    21112265
    21122266    NormalVector.ProjectOntoPlane(&CirclePlaneNormal);
    21132267    NormalVector.Normalize();
    2114     ShortestAngle = 2.*M_PI; // This will indicate the quadrant.
     2268    ShortestAngle = 2. * M_PI; // This will indicate the quadrant.
    21152269
    21162270    SphereCenter.CopyVector(&NormalVector);
     
    21202274
    21212275    // look in one direction of baseline for initial candidate
    2122     SearchDirection.MakeNormalVector(&CirclePlaneNormal, &NormalVector);  // whether we look "left" first or "right" first is not important ...
     2276    SearchDirection.MakeNormalVector(&CirclePlaneNormal, &NormalVector); // whether we look "left" first or "right" first is not important ...
    21232277
    21242278    // adding point 1 and point 2 and add the line between them
    2125     Log() << Verbose(0) << "Coordinates of start node at " << *BaseLine.endpoints[0]->node << "." << endl;
    2126     Log() << Verbose(0) << "Found second point is at " << *BaseLine.endpoints[1]->node << ".\n";
     2279    DoLog(0) && (Log() << Verbose(0) << "Coordinates of start node at " << *BaseLine->endpoints[0]->node << "." << endl);
     2280    DoLog(0) && (Log() << Verbose(0) << "Found second point is at " << *BaseLine->endpoints[1]->node << ".\n");
    21272281
    21282282    //Log() << Verbose(1) << "INFO: OldSphereCenter is at " << helper << ".\n";
    2129     CandidateForTesselation OptCandidates(&BaseLine);
     2283    CandidateForTesselation OptCandidates(BaseLine);
    21302284    FindThirdPointForTesselation(NormalVector, SearchDirection, SphereCenter, OptCandidates, NULL, RADIUS, LC);
    2131     Log() << Verbose(0) << "List of third Points is:" << endl;
     2285    DoLog(0) && (Log() << Verbose(0) << "List of third Points is:" << endl);
    21322286    for (TesselPointList::iterator it = OptCandidates.pointlist.begin(); it != OptCandidates.pointlist.end(); it++) {
    2133         Log() << Verbose(0) << " " << *(*it) << endl;
    2134     }
    2135 
    2136     BTS = NULL;
    2137     AddCandidateTriangle(OptCandidates);
    2138 //    delete(BaseLine.endpoints[0]);
    2139 //    delete(BaseLine.endpoints[1]);
    2140 
    2141     if (BTS != NULL) // we have created one starting triangle
     2287      DoLog(0) && (Log() << Verbose(0) << " " << *(*it) << endl);
     2288    }
     2289    if (!OptCandidates.pointlist.empty()) {
     2290      BTS = NULL;
     2291      AddCandidatePolygon(OptCandidates, RADIUS, LC);
     2292    } else {
     2293      delete BaseLine;
     2294      continue;
     2295    }
     2296
     2297    if (BTS != NULL) { // we have created one starting triangle
     2298      delete BaseLine;
    21422299      break;
    2143     else {
     2300    } else {
    21442301      // remove all candidates from the list and then the list itself
    21452302      OptCandidates.pointlist.clear();
    21462303    }
    2147   }
    2148 };
     2304    delete BaseLine;
     2305  }
     2306
     2307  return (BTS != NULL);
     2308}
     2309;
    21492310
    21502311/** Checks for a given baseline and a third point candidate whether baselines of the found triangle don't have even better candidates.
     
    22172378//            if (fabs(OldSphereCenter.ScalarProduct(&SearchDirection)) > HULLEPSILON) {
    22182379//              // rotated the wrong way!
    2219 //              eLog() << Verbose(1) << "SearchDirection and RelativeOldSphereCenter are still not orthogonal!" << endl;
     2380//              DoeLog(1) && (eLog()<< Verbose(1) << "SearchDirection and RelativeOldSphereCenter are still not orthogonal!" << endl);
    22202381//            }
    22212382//
     
    22742435//          }
    22752436//        } else {
    2276 //          eLog() << Verbose(2) << "Baseline is connected to two triangles already?" << endl;
     2437//          DoeLog(2) && (eLog()<< Verbose(2) << "Baseline is connected to two triangles already?" << endl);
    22772438//        }
    22782439//      } else {
     
    22812442//    }
    22822443//  } else {
    2283 //    eLog() << Verbose(1) << "Could not find the TesselPoint " << *ThirdNode << "." << endl;
     2444//    DoeLog(1) && (eLog()<< Verbose(1) << "Could not find the TesselPoint " << *ThirdNode << "." << endl);
    22842445//  }
    22852446//
     
    22952456 * @param *LC LinkedCell structure with neighbouring points
    22962457 */
    2297 bool Tesselation::FindNextSuitableTriangle(CandidateForTesselation &CandidateLine, BoundaryTriangleSet &T, const double& RADIUS, const LinkedCell *LC)
    2298 {
    2299         Info FunctionInfo(__func__);
    2300   bool result = true;
    2301 
     2458bool Tesselation::FindNextSuitableTriangle(CandidateForTesselation &CandidateLine, const BoundaryTriangleSet &T, const double& RADIUS, const LinkedCell *LC)
     2459{
     2460  Info FunctionInfo(__func__);
    23022461  Vector CircleCenter;
    23032462  Vector CirclePlaneNormal;
     
    23052464  Vector SearchDirection;
    23062465  Vector helper;
    2307   TesselPoint *ThirdNode = NULL;
     2466  BoundaryPointSet *ThirdPoint = NULL;
    23082467  LineMap::iterator testline;
    23092468  double radius, CircleRadius;
    23102469
    2311   for (int i=0;i<3;i++)
    2312     if ((T.endpoints[i]->node != CandidateLine.BaseLine->endpoints[0]->node) && (T.endpoints[i]->node != CandidateLine.BaseLine->endpoints[1]->node)) {
    2313       ThirdNode = T.endpoints[i]->node;
     2470  for (int i = 0; i < 3; i++)
     2471    if ((T.endpoints[i] != CandidateLine.BaseLine->endpoints[0]) && (T.endpoints[i] != CandidateLine.BaseLine->endpoints[1])) {
     2472      ThirdPoint = T.endpoints[i];
    23142473      break;
    23152474    }
    2316   Log() << Verbose(0) << "Current baseline is " << *CandidateLine.BaseLine << " with ThirdNode " << *ThirdNode << " of triangle " << T << "." << endl;
     2475  DoLog(0) && (Log() << Verbose(0) << "Current baseline is " << *CandidateLine.BaseLine << " with ThirdPoint " << *ThirdPoint << " of triangle " << T << "." << endl);
     2476
     2477  CandidateLine.T = &T;
    23172478
    23182479  // construct center of circle
     
    23272488  // calculate squared radius of circle
    23282489  radius = CirclePlaneNormal.ScalarProduct(&CirclePlaneNormal);
    2329   if (radius/4. < RADIUS*RADIUS) {
     2490  if (radius / 4. < RADIUS * RADIUS) {
    23302491    // construct relative sphere center with now known CircleCenter
    23312492    RelativeSphereCenter.CopyVector(&T.SphereCenter);
    23322493    RelativeSphereCenter.SubtractVector(&CircleCenter);
    23332494
    2334     CircleRadius = RADIUS*RADIUS - radius/4.;
     2495    CircleRadius = RADIUS * RADIUS - radius / 4.;
    23352496    CirclePlaneNormal.Normalize();
    2336     Log() << Verbose(1) << "INFO: CircleCenter is at " << CircleCenter << ", CirclePlaneNormal is " << CirclePlaneNormal << " with circle radius " << sqrt(CircleRadius) << "." << endl;
    2337 
    2338     Log() << Verbose(1) << "INFO: OldSphereCenter is at " << T.SphereCenter << "." << endl;
     2497    DoLog(1) && (Log() << Verbose(1) << "INFO: CircleCenter is at " << CircleCenter << ", CirclePlaneNormal is " << CirclePlaneNormal << " with circle radius " << sqrt(CircleRadius) << "." << endl);
     2498
     2499    DoLog(1) && (Log() << Verbose(1) << "INFO: OldSphereCenter is at " << T.SphereCenter << "." << endl);
    23392500
    23402501    // construct SearchDirection and an "outward pointer"
    23412502    SearchDirection.MakeNormalVector(&RelativeSphereCenter, &CirclePlaneNormal);
    23422503    helper.CopyVector(&CircleCenter);
    2343     helper.SubtractVector(ThirdNode->node);
     2504    helper.SubtractVector(ThirdPoint->node->node);
    23442505    if (helper.ScalarProduct(&SearchDirection) < -HULLEPSILON)// ohoh, SearchDirection points inwards!
    23452506      SearchDirection.Scale(-1.);
    2346     Log() << Verbose(1) << "INFO: SearchDirection is " << SearchDirection << "." << endl;
     2507    DoLog(1) && (Log() << Verbose(1) << "INFO: SearchDirection is " << SearchDirection << "." << endl);
    23472508    if (fabs(RelativeSphereCenter.ScalarProduct(&SearchDirection)) > HULLEPSILON) {
    23482509      // rotated the wrong way!
    2349       eLog() << Verbose(1) << "SearchDirection and RelativeOldSphereCenter are still not orthogonal!" << endl;
     2510      DoeLog(1) && (eLog() << Verbose(1) << "SearchDirection and RelativeOldSphereCenter are still not orthogonal!" << endl);
    23502511    }
    23512512
    23522513    // add third point
    2353     FindThirdPointForTesselation(T.NormalVector, SearchDirection, T.SphereCenter, CandidateLine, ThirdNode, RADIUS, LC);
     2514    FindThirdPointForTesselation(T.NormalVector, SearchDirection, T.SphereCenter, CandidateLine, ThirdPoint, RADIUS, LC);
    23542515
    23552516  } else {
    2356     Log() << Verbose(0) << "Circumcircle for base line " << *CandidateLine.BaseLine << " and base triangle " << T << " is too big!" << endl;
     2517    DoLog(0) && (Log() << Verbose(0) << "Circumcircle for base line " << *CandidateLine.BaseLine << " and base triangle " << T << " is too big!" << endl);
    23572518  }
    23582519
    23592520  if (CandidateLine.pointlist.empty()) {
    2360     eLog() << Verbose(2) << "Could not find a suitable candidate." << endl;
     2521    DoeLog(2) && (eLog() << Verbose(2) << "Could not find a suitable candidate." << endl);
    23612522    return false;
    23622523  }
    2363   Log() << Verbose(0) << "Third Points are: " << endl;
     2524  DoLog(0) && (Log() << Verbose(0) << "Third Points are: " << endl);
    23642525  for (TesselPointList::iterator it = CandidateLine.pointlist.begin(); it != CandidateLine.pointlist.end(); ++it) {
    2365     Log() << Verbose(0) << " " << *(*it) << endl;
     2526    DoLog(0) && (Log() << Verbose(0) << " " << *(*it) << endl);
    23662527  }
    23672528
    23682529  return true;
    2369 
    2370 //  BoundaryLineSet *BaseRay = CandidateLine.BaseLine;
    2371 //  for (CandidateList::iterator it = OptCandidates->begin(); it != OptCandidates->end(); ++it) {
    2372 //    Log() << Verbose(0) << "Third point candidate is " << *(*it)->point
    2373 //    << " with circumsphere's center at " << (*it)->OptCenter << "." << endl;
    2374 //    Log() << Verbose(0) << "Baseline is " << *BaseRay << endl;
    2375 //
    2376 //    // check whether all edges of the new triangle still have space for one more triangle (i.e. TriangleCount <2)
    2377 //    TesselPoint *PointCandidates[3];
    2378 //    PointCandidates[0] = (*it)->point;
    2379 //    PointCandidates[1] = BaseRay->endpoints[0]->node;
    2380 //    PointCandidates[2] = BaseRay->endpoints[1]->node;
    2381 //    int existentTrianglesCount = CheckPresenceOfTriangle(PointCandidates);
    2382 //
    2383 //    BTS = NULL;
    2384 //    // check for present edges and whether we reach better candidates from them
    2385 //    //if (HasOtherBaselineBetterCandidate(BaseRay, (*it)->point, ShortestAngle, RADIUS, LC) ) {
    2386 //    if (0) {
    2387 //      result = false;
    2388 //      break;
    2389 //    } else {
    2390 //      // If there is no triangle, add it regularly.
    2391 //      if (existentTrianglesCount == 0) {
    2392 //        AddTesselationPoint((*it)->point, 0);
    2393 //        AddTesselationPoint(BaseRay->endpoints[0]->node, 1);
    2394 //        AddTesselationPoint(BaseRay->endpoints[1]->node, 2);
    2395 //
    2396 //        if (CheckLineCriteriaForDegeneratedTriangle((const BoundaryPointSet ** const )TPS)) {
    2397 //          CandidateLine.point = (*it)->point;
    2398 //          CandidateLine.OptCenter.CopyVector(&((*it)->OptCenter));
    2399 //          CandidateLine.OtherOptCenter.CopyVector(&((*it)->OtherOptCenter));
    2400 //          CandidateLine.ShortestAngle = ShortestAngle;
    2401 //        } else {
    2402 ////          eLog() << Verbose(1) << "This triangle consisting of ";
    2403 ////          Log() << Verbose(0) << *(*it)->point << ", ";
    2404 ////          Log() << Verbose(0) << *BaseRay->endpoints[0]->node << " and ";
    2405 ////          Log() << Verbose(0) << *BaseRay->endpoints[1]->node << " ";
    2406 ////          Log() << Verbose(0) << "exists and is not added, as it 0x80000000006fc150(does not seem helpful!" << endl;
    2407 //          result = false;
    2408 //        }
    2409 //      } else if ((existentTrianglesCount >= 1) && (existentTrianglesCount <= 3)) { // If there is a planar region within the structure, we need this triangle a second time.
    2410 //          AddTesselationPoint((*it)->point, 0);
    2411 //          AddTesselationPoint(BaseRay->endpoints[0]->node, 1);
    2412 //          AddTesselationPoint(BaseRay->endpoints[1]->node, 2);
    2413 //
    2414 //          // 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)
    2415 //          // i.e. at least one of the three lines must be present with TriangleCount <= 1
    2416 //          if (CheckLineCriteriaForDegeneratedTriangle((const BoundaryPointSet ** const)TPS) || CandidateLine.BaseLine->skipped) {
    2417 //            CandidateLine.point = (*it)->point;
    2418 //            CandidateLine.OptCenter.CopyVector(&(*it)->OptCenter);
    2419 //            CandidateLine.OtherOptCenter.CopyVector(&(*it)->OtherOptCenter);
    2420 //            CandidateLine.ShortestAngle = ShortestAngle+2.*M_PI;
    2421 //
    2422 //          } else {
    2423 ////            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;
    2424 //            result = false;
    2425 //          }
    2426 //      } else {
    2427 ////        Log() << Verbose(1) << "This triangle consisting of ";
    2428 ////        Log() << Verbose(0) << *(*it)->point << ", ";
    2429 ////        Log() << Verbose(0) << *BaseRay->endpoints[0]->node << " and ";
    2430 ////        Log() << Verbose(0) << *BaseRay->endpoints[1]->node << " ";
    2431 ////        Log() << Verbose(0) << "is invalid!" << endl;
    2432 //        result = false;
    2433 //      }
    2434 //    }
    2435 //
    2436 //    // set baseline to new ray from ref point (here endpoints[0]->node) to current candidate (here (*it)->point))
    2437 //    BaseRay = BLS[0];
    2438 //    if ((BTS != NULL) && (BTS->NormalVector.NormSquared() < MYEPSILON)) {
    2439 //      eLog() << Verbose(1) << "Triangle " << *BTS << " has zero normal vector!" << endl;
    2440 //      exit(255);
    2441 //    }
    2442 //
    2443 //  }
    2444 //
    2445 //  // remove all candidates from the list and then the list itself
    2446 //  class CandidateForTesselation *remover = NULL;
    2447 //  for (CandidateList::iterator it = OptCandidates->begin(); it != OptCandidates->end(); ++it) {
    2448 //    remover = *it;
    2449 //    delete(remover);
    2450 //  }
    2451 //  delete(OptCandidates);
    2452   return result;
    2453 };
     2530}
     2531;
     2532
     2533/** Walks through Tesselation::OpenLines() and finds candidates for newly created ones.
     2534 * \param *&LCList atoms in LinkedCell list
     2535 * \param RADIUS radius of the virtual sphere
     2536 * \return true - for all open lines without candidates so far, a candidate has been found,
     2537 *         false - at least one open line without candidate still
     2538 */
     2539bool Tesselation::FindCandidatesforOpenLines(const double RADIUS, const LinkedCell *&LCList)
     2540{
     2541  bool TesselationFailFlag = true;
     2542  CandidateForTesselation *baseline = NULL;
     2543  BoundaryTriangleSet *T = NULL;
     2544
     2545  for (CandidateMap::iterator Runner = OpenLines.begin(); Runner != OpenLines.end(); Runner++) {
     2546    baseline = Runner->second;
     2547    if (baseline->pointlist.empty()) {
     2548      assert((baseline->BaseLine->triangles.size() == 1) && ("Open line without exactly one attached triangle"));
     2549      T = (((baseline->BaseLine->triangles.begin()))->second);
     2550      DoLog(1) && (Log() << Verbose(1) << "Finding best candidate for open line " << *baseline->BaseLine << " of triangle " << *T << endl);
     2551      TesselationFailFlag = TesselationFailFlag && FindNextSuitableTriangle(*baseline, *T, RADIUS, LCList); //the line is there, so there is a triangle, but only one.
     2552    }
     2553  }
     2554  return TesselationFailFlag;
     2555}
     2556;
    24542557
    24552558/** Adds the present line and candidate point from \a &CandidateLine to the Tesselation.
    24562559 * \param CandidateLine triangle to add
    2457  * \NOTE we need the copy operator here as the original CandidateForTesselation is removed in AddTesselationLine()
    2458  */
    2459 void Tesselation::AddCandidateTriangle(CandidateForTesselation CandidateLine)
    2460 {
    2461         Info FunctionInfo(__func__);
     2560 * \param RADIUS Radius of sphere
     2561 * \param *LC LinkedCell structure
     2562 * \NOTE we need the copy operator here as the original CandidateForTesselation is removed in
     2563 * AddTesselationLine() in AddCandidateTriangle()
     2564 */
     2565void Tesselation::AddCandidatePolygon(CandidateForTesselation CandidateLine, const double RADIUS, const LinkedCell *LC)
     2566{
     2567  Info FunctionInfo(__func__);
    24622568  Vector Center;
    24632569  TesselPoint * const TurningPoint = CandidateLine.BaseLine->endpoints[0]->node;
     2570  TesselPointList::iterator Runner;
     2571  TesselPointList::iterator Sprinter;
    24642572
    24652573  // fill the set of neighbours
     
    24702578  TesselPointList *connectedClosestPoints = GetCircleOfSetOfPoints(&SetOfNeighbours, TurningPoint, CandidateLine.BaseLine->endpoints[1]->node->node);
    24712579
     2580  DoLog(0) && (Log() << Verbose(0) << "List of Candidates for Turning Point " << *TurningPoint << ":" << endl);
     2581  for (TesselPointList::iterator TesselRunner = connectedClosestPoints->begin(); TesselRunner != connectedClosestPoints->end(); ++TesselRunner)
     2582    DoLog(0) && (Log() << Verbose(0) << " " << **TesselRunner << endl);
     2583
    24722584  // go through all angle-sorted candidates (in degenerate n-nodes case we may have to add multiple triangles)
    2473   Log() << Verbose(0) << "List of Candidates for Turning Point: " << *TurningPoint << "." << endl;
    2474   for (TesselPointList::iterator TesselRunner = connectedClosestPoints->begin(); TesselRunner != connectedClosestPoints->end(); ++TesselRunner)
    2475     Log() << Verbose(0) << **TesselRunner << endl;
    2476   TesselPointList::iterator Runner = connectedClosestPoints->begin();
    2477   TesselPointList::iterator Sprinter = Runner;
     2585  Runner = connectedClosestPoints->begin();
     2586  Sprinter = Runner;
    24782587  Sprinter++;
    2479   while(Sprinter != connectedClosestPoints->end()) {
    2480     // add the points
     2588  while (Sprinter != connectedClosestPoints->end()) {
     2589    DoLog(0) && (Log() << Verbose(0) << "Current Runner is " << *(*Runner) << " and sprinter is " << *(*Sprinter) << "." << endl);
     2590
    24812591    AddTesselationPoint(TurningPoint, 0);
    2482     AddTesselationPoint((*Runner), 1);
    2483     AddTesselationPoint((*Sprinter), 2);
    2484 
    2485     // add the lines
    2486     AddTesselationLine(TPS[0], TPS[1], 0);
    2487     AddTesselationLine(TPS[0], TPS[2], 1);
    2488     AddTesselationLine(TPS[1], TPS[2], 2);
    2489 
    2490     // add the triangles
    2491     BTS = new class BoundaryTriangleSet(BLS, TrianglesOnBoundaryCount);
    2492     AddTesselationTriangle();
    2493     BTS->GetCenter(&Center);
    2494     Center.SubtractVector(&CandidateLine.OptCenter);
    2495     BTS->SphereCenter.CopyVector(&CandidateLine.OptCenter);
    2496     BTS->GetNormalVector(Center);
    2497 
    2498     Log() << Verbose(0) << "--> New triangle with " << *BTS << " and normal vector " << BTS->NormalVector << "." << endl;
     2592    AddTesselationPoint(*Runner, 1);
     2593    AddTesselationPoint(*Sprinter, 2);
     2594
     2595    AddCandidateTriangle(CandidateLine, Opt);
     2596
    24992597    Runner = Sprinter;
    25002598    Sprinter++;
    2501     Log() << Verbose(0) << "Current Runner is " << **Runner << "." << endl;
    2502     if (Sprinter != connectedClosestPoints->end())
    2503       Log() << Verbose(0) << " There are still more triangles to add." << endl;
    2504   }
    2505   delete(connectedClosestPoints);
     2599    if (Sprinter != connectedClosestPoints->end()) {
     2600      // fill the internal open lines with its respective candidate (otherwise lines in degenerate case are not picked)
     2601      FindDegeneratedCandidatesforOpenLines(*Sprinter, &CandidateLine.OptCenter); // Assume BTS contains last triangle
     2602      DoLog(0) && (Log() << Verbose(0) << " There are still more triangles to add." << endl);
     2603    }
     2604    // pick candidates for other open lines as well
     2605    FindCandidatesforOpenLines(RADIUS, LC);
     2606
     2607    // check whether we add a degenerate or a normal triangle
     2608    if (CheckDegeneracy(CandidateLine, RADIUS, LC)) {
     2609      // add normal and degenerate triangles
     2610      DoLog(1) && (Log() << Verbose(1) << "Triangle of endpoints " << *TPS[0] << "," << *TPS[1] << " and " << *TPS[2] << " is degenerated, adding both sides." << endl);
     2611      AddCandidateTriangle(CandidateLine, OtherOpt);
     2612
     2613      if (Sprinter != connectedClosestPoints->end()) {
     2614        // fill the internal open lines with its respective candidate (otherwise lines in degenerate case are not picked)
     2615        FindDegeneratedCandidatesforOpenLines(*Sprinter, &CandidateLine.OtherOptCenter);
     2616      }
     2617      // pick candidates for other open lines as well
     2618      FindCandidatesforOpenLines(RADIUS, LC);
     2619    }
     2620  }
     2621  delete (connectedClosestPoints);
    25062622};
     2623
     2624/** for polygons (multiple candidates for a baseline) sets internal edges to the correct next candidate.
     2625 * \param *Sprinter next candidate to which internal open lines are set
     2626 * \param *OptCenter OptCenter for this candidate
     2627 */
     2628void Tesselation::FindDegeneratedCandidatesforOpenLines(TesselPoint * const Sprinter, const Vector * const OptCenter)
     2629{
     2630  Info FunctionInfo(__func__);
     2631
     2632  pair<LineMap::iterator, LineMap::iterator> FindPair = TPS[0]->lines.equal_range(TPS[2]->node->nr);
     2633  for (LineMap::const_iterator FindLine = FindPair.first; FindLine != FindPair.second; FindLine++) {
     2634    DoLog(1) && (Log() << Verbose(1) << "INFO: Checking line " << *(FindLine->second) << " ..." << endl);
     2635    // If there is a line with less than two attached triangles, we don't need a new line.
     2636    if (FindLine->second->triangles.size() == 1) {
     2637      CandidateMap::iterator Finder = OpenLines.find(FindLine->second);
     2638      if (!Finder->second->pointlist.empty())
     2639        DoLog(1) && (Log() << Verbose(1) << "INFO: line " << *(FindLine->second) << " is open with candidate " << **(Finder->second->pointlist.begin()) << "." << endl);
     2640      else {
     2641        DoLog(1) && (Log() << Verbose(1) << "INFO: line " << *(FindLine->second) << " is open with no candidate, setting to next Sprinter" << (*Sprinter) << endl);
     2642        Finder->second->T = BTS;  // is last triangle
     2643        Finder->second->pointlist.push_back(Sprinter);
     2644        Finder->second->ShortestAngle = 0.;
     2645        Finder->second->OptCenter.CopyVector(OptCenter);
     2646      }
     2647    }
     2648  }
     2649};
     2650
     2651/** If a given \a *triangle is degenerated, this adds both sides.
     2652 * i.e. the triangle with same BoundaryPointSet's but NormalVector in opposite direction.
     2653 * Note that endpoints are stored in Tesselation::TPS
     2654 * \param CandidateLine CanddiateForTesselation structure for the desired BoundaryLine
     2655 * \param RADIUS radius of sphere
     2656 * \param *LC pointer to LinkedCell structure
     2657 */
     2658void Tesselation::AddDegeneratedTriangle(CandidateForTesselation &CandidateLine, const double RADIUS, const LinkedCell *LC)
     2659{
     2660  Info FunctionInfo(__func__);
     2661  Vector Center;
     2662  CandidateMap::const_iterator CandidateCheck = OpenLines.end();
     2663  BoundaryTriangleSet *triangle = NULL;
     2664
     2665  /// 1. Create or pick the lines for the first triangle
     2666  DoLog(0) && (Log() << Verbose(0) << "INFO: Creating/Picking lines for first triangle ..." << endl);
     2667  for (int i = 0; i < 3; i++) {
     2668    BLS[i] = NULL;
     2669    DoLog(0) && (Log() << Verbose(0) << "Current line is between " << *TPS[(i + 0) % 3] << " and " << *TPS[(i + 1) % 3] << ":" << endl);
     2670    AddTesselationLine(&CandidateLine.OptCenter, TPS[(i + 2) % 3], TPS[(i + 0) % 3], TPS[(i + 1) % 3], i);
     2671  }
     2672
     2673  /// 2. create the first triangle and NormalVector and so on
     2674  DoLog(0) && (Log() << Verbose(0) << "INFO: Adding first triangle with center at " << CandidateLine.OptCenter << " ..." << endl);
     2675  BTS = new class BoundaryTriangleSet(BLS, TrianglesOnBoundaryCount);
     2676  AddTesselationTriangle();
     2677
     2678  // create normal vector
     2679  BTS->GetCenter(&Center);
     2680  Center.SubtractVector(&CandidateLine.OptCenter);
     2681  BTS->SphereCenter.CopyVector(&CandidateLine.OptCenter);
     2682  BTS->GetNormalVector(Center);
     2683  // give some verbose output about the whole procedure
     2684  if (CandidateLine.T != NULL)
     2685    DoLog(0) && (Log() << Verbose(0) << "--> New triangle with " << *BTS << " and normal vector " << BTS->NormalVector << ", from " << *CandidateLine.T << " and angle " << CandidateLine.ShortestAngle << "." << endl);
     2686  else
     2687    DoLog(0) && (Log() << Verbose(0) << "--> New starting triangle with " << *BTS << " and normal vector " << BTS->NormalVector << " and no top triangle." << endl);
     2688  triangle = BTS;
     2689
     2690  /// 3. Gather candidates for each new line
     2691  DoLog(0) && (Log() << Verbose(0) << "INFO: Adding candidates to new lines ..." << endl);
     2692  for (int i = 0; i < 3; i++) {
     2693    DoLog(0) && (Log() << Verbose(0) << "Current line is between " << *TPS[(i + 0) % 3] << " and " << *TPS[(i + 1) % 3] << ":" << endl);
     2694    CandidateCheck = OpenLines.find(BLS[i]);
     2695    if ((CandidateCheck != OpenLines.end()) && (CandidateCheck->second->pointlist.empty())) {
     2696      if (CandidateCheck->second->T == NULL)
     2697        CandidateCheck->second->T = triangle;
     2698      FindNextSuitableTriangle(*(CandidateCheck->second), *CandidateCheck->second->T, RADIUS, LC);
     2699    }
     2700  }
     2701
     2702  /// 4. Create or pick the lines for the second triangle
     2703  DoLog(0) && (Log() << Verbose(0) << "INFO: Creating/Picking lines for second triangle ..." << endl);
     2704  for (int i = 0; i < 3; i++) {
     2705    DoLog(0) && (Log() << Verbose(0) << "Current line is between " << *TPS[(i + 0) % 3] << " and " << *TPS[(i + 1) % 3] << ":" << endl);
     2706    AddTesselationLine(&CandidateLine.OtherOptCenter, TPS[(i + 2) % 3], TPS[(i + 0) % 3], TPS[(i + 1) % 3], i);
     2707  }
     2708
     2709  /// 5. create the second triangle and NormalVector and so on
     2710  DoLog(0) && (Log() << Verbose(0) << "INFO: Adding second triangle with center at " << CandidateLine.OtherOptCenter << " ..." << endl);
     2711  BTS = new class BoundaryTriangleSet(BLS, TrianglesOnBoundaryCount);
     2712  AddTesselationTriangle();
     2713
     2714  BTS->SphereCenter.CopyVector(&CandidateLine.OtherOptCenter);
     2715  // create normal vector in other direction
     2716  BTS->GetNormalVector(&triangle->NormalVector);
     2717  BTS->NormalVector.Scale(-1.);
     2718  // give some verbose output about the whole procedure
     2719  if (CandidateLine.T != NULL)
     2720    DoLog(0) && (Log() << Verbose(0) << "--> New degenerate triangle with " << *BTS << " and normal vector " << BTS->NormalVector << ", from " << *CandidateLine.T << " and angle " << CandidateLine.ShortestAngle << "." << endl);
     2721  else
     2722    DoLog(0) && (Log() << Verbose(0) << "--> New degenerate starting triangle with " << *BTS << " and normal vector " << BTS->NormalVector << " and no top triangle." << endl);
     2723
     2724  /// 6. Adding triangle to new lines
     2725  DoLog(0) && (Log() << Verbose(0) << "INFO: Adding second triangles to new lines ..." << endl);
     2726  for (int i = 0; i < 3; i++) {
     2727    DoLog(0) && (Log() << Verbose(0) << "Current line is between " << *TPS[(i + 0) % 3] << " and " << *TPS[(i + 1) % 3] << ":" << endl);
     2728    CandidateCheck = OpenLines.find(BLS[i]);
     2729    if ((CandidateCheck != OpenLines.end()) && (CandidateCheck->second->pointlist.empty())) {
     2730      if (CandidateCheck->second->T == NULL)
     2731        CandidateCheck->second->T = BTS;
     2732    }
     2733  }
     2734}
     2735;
     2736
     2737/** Adds a triangle to the Tesselation structure from three given TesselPoint's.
     2738 * Note that endpoints are in Tesselation::TPS.
     2739 * \param CandidateLine CandidateForTesselation structure contains other information
     2740 * \param type which opt center to add (i.e. which side) and thus which NormalVector to take
     2741 */
     2742void Tesselation::AddCandidateTriangle(CandidateForTesselation &CandidateLine, enum centers type)
     2743{
     2744  Info FunctionInfo(__func__);
     2745  Vector Center;
     2746  Vector *OptCenter = (type == Opt) ? &CandidateLine.OptCenter : &CandidateLine.OtherOptCenter;
     2747
     2748  // add the lines
     2749  AddTesselationLine(OptCenter, TPS[2], TPS[0], TPS[1], 0);
     2750  AddTesselationLine(OptCenter, TPS[1], TPS[0], TPS[2], 1);
     2751  AddTesselationLine(OptCenter, TPS[0], TPS[1], TPS[2], 2);
     2752
     2753  // add the triangles
     2754  BTS = new class BoundaryTriangleSet(BLS, TrianglesOnBoundaryCount);
     2755  AddTesselationTriangle();
     2756
     2757  // create normal vector
     2758  BTS->GetCenter(&Center);
     2759  Center.SubtractVector(OptCenter);
     2760  BTS->SphereCenter.CopyVector(OptCenter);
     2761  BTS->GetNormalVector(Center);
     2762
     2763  // give some verbose output about the whole procedure
     2764  if (CandidateLine.T != NULL)
     2765    DoLog(0) && (Log() << Verbose(0) << "--> New" << ((type == OtherOpt) ? " degenerate " : " ") << "triangle with " << *BTS << " and normal vector " << BTS->NormalVector << ", from " << *CandidateLine.T << " and angle " << CandidateLine.ShortestAngle << "." << endl);
     2766  else
     2767    DoLog(0) && (Log() << Verbose(0) << "--> New" << ((type == OtherOpt) ? " degenerate " : " ") << "starting triangle with " << *BTS << " and normal vector " << BTS->NormalVector << " and no top triangle." << endl);
     2768}
     2769;
    25072770
    25082771/** Checks whether the quadragon of the two triangles connect to \a *Base is convex.
     
    25152778class BoundaryPointSet *Tesselation::IsConvexRectangle(class BoundaryLineSet *Base)
    25162779{
    2517         Info FunctionInfo(__func__);
     2780  Info FunctionInfo(__func__);
    25182781  class BoundaryPointSet *Spot = NULL;
    25192782  class BoundaryLineSet *OtherBase;
    25202783  Vector *ClosestPoint;
    25212784
    2522   int m=0;
    2523   for(TriangleMap::iterator runner = Base->triangles.begin(); runner != Base->triangles.end(); runner++)
    2524     for (int j=0;j<3;j++) // all of their endpoints and baselines
     2785  int m = 0;
     2786  for (TriangleMap::iterator runner = Base->triangles.begin(); runner != Base->triangles.end(); runner++)
     2787    for (int j = 0; j < 3; j++) // all of their endpoints and baselines
    25252788      if (!Base->ContainsBoundaryPoint(runner->second->endpoints[j])) // and neither of its endpoints
    25262789        BPS[m++] = runner->second->endpoints[j];
    2527   OtherBase = new class BoundaryLineSet(BPS,-1);
    2528 
    2529   Log() << Verbose(1) << "INFO: Current base line is " << *Base << "." << endl;
    2530   Log() << Verbose(1) << "INFO: Other base line is " << *OtherBase << "." << endl;
     2790  OtherBase = new class BoundaryLineSet(BPS, -1);
     2791
     2792  DoLog(1) && (Log() << Verbose(1) << "INFO: Current base line is " << *Base << "." << endl);
     2793  DoLog(1) && (Log() << Verbose(1) << "INFO: Other base line is " << *OtherBase << "." << endl);
    25312794
    25322795  // get the closest point on each line to the other line
     
    25342797
    25352798  // delete the temporary other base line
    2536   delete(OtherBase);
     2799  delete (OtherBase);
    25372800
    25382801  // get the distance vector from Base line to OtherBase line
     
    25412804  BaseLine.CopyVector(Base->endpoints[1]->node->node);
    25422805  BaseLine.SubtractVector(Base->endpoints[0]->node->node);
    2543   for (int i=0;i<2;i++) {
     2806  for (int i = 0; i < 2; i++) {
    25442807    DistanceToIntersection[i].CopyVector(ClosestPoint);
    25452808    DistanceToIntersection[i].SubtractVector(Base->endpoints[i]->node->node);
    25462809    distance[i] = BaseLine.ScalarProduct(&DistanceToIntersection[i]);
    25472810  }
    2548   delete(ClosestPoint);
    2549   if ((distance[0] * distance[1]) > 0)  { // have same sign?
    2550     Log() << Verbose(1) << "REJECT: Both SKPs have same sign: " << distance[0] << " and " << distance[1]  << ". " << *Base << "' rectangle is concave." << endl;
     2811  delete (ClosestPoint);
     2812  if ((distance[0] * distance[1]) > 0) { // have same sign?
     2813    DoLog(1) && (Log() << Verbose(1) << "REJECT: Both SKPs have same sign: " << distance[0] << " and " << distance[1] << ". " << *Base << "' rectangle is concave." << endl);
    25512814    if (distance[0] < distance[1]) {
    25522815      Spot = Base->endpoints[0];
     
    25552818    }
    25562819    return Spot;
    2557   } else {  // different sign, i.e. we are in between
    2558     Log() << Verbose(0) << "ACCEPT: Rectangle of triangles of base line " << *Base << " is convex." << endl;
     2820  } else { // different sign, i.e. we are in between
     2821    DoLog(0) && (Log() << Verbose(0) << "ACCEPT: Rectangle of triangles of base line " << *Base << " is convex." << endl);
    25592822    return NULL;
    25602823  }
    25612824
    2562 };
     2825}
     2826;
    25632827
    25642828void Tesselation::PrintAllBoundaryPoints(ofstream *out) const
    25652829{
    2566         Info FunctionInfo(__func__);
     2830  Info FunctionInfo(__func__);
    25672831  // print all lines
    2568   Log() << Verbose(0) << "Printing all boundary points for debugging:" << endl;
    2569   for (PointMap::const_iterator PointRunner = PointsOnBoundary.begin();PointRunner != PointsOnBoundary.end(); PointRunner++)
    2570     Log() << Verbose(0) << *(PointRunner->second) << endl;
    2571 };
     2832  DoLog(0) && (Log() << Verbose(0) << "Printing all boundary points for debugging:" << endl);
     2833  for (PointMap::const_iterator PointRunner = PointsOnBoundary.begin(); PointRunner != PointsOnBoundary.end(); PointRunner++)
     2834    DoLog(0) && (Log() << Verbose(0) << *(PointRunner->second) << endl);
     2835}
     2836;
    25722837
    25732838void Tesselation::PrintAllBoundaryLines(ofstream *out) const
    25742839{
    2575         Info FunctionInfo(__func__);
     2840  Info FunctionInfo(__func__);
    25762841  // print all lines
    2577   Log() << Verbose(0) << "Printing all boundary lines for debugging:" << endl;
     2842  DoLog(0) && (Log() << Verbose(0) << "Printing all boundary lines for debugging:" << endl);
    25782843  for (LineMap::const_iterator LineRunner = LinesOnBoundary.begin(); LineRunner != LinesOnBoundary.end(); LineRunner++)
    2579     Log() << Verbose(0) << *(LineRunner->second) << endl;
    2580 };
     2844    DoLog(0) && (Log() << Verbose(0) << *(LineRunner->second) << endl);
     2845}
     2846;
    25812847
    25822848void Tesselation::PrintAllBoundaryTriangles(ofstream *out) const
    25832849{
    2584         Info FunctionInfo(__func__);
     2850  Info FunctionInfo(__func__);
    25852851  // print all triangles
    2586   Log() << Verbose(0) << "Printing all boundary triangles for debugging:" << endl;
     2852  DoLog(0) && (Log() << Verbose(0) << "Printing all boundary triangles for debugging:" << endl);
    25872853  for (TriangleMap::const_iterator TriangleRunner = TrianglesOnBoundary.begin(); TriangleRunner != TrianglesOnBoundary.end(); TriangleRunner++)
    2588     Log() << Verbose(0) << *(TriangleRunner->second) << endl;
    2589 };
     2854    DoLog(0) && (Log() << Verbose(0) << *(TriangleRunner->second) << endl);
     2855}
     2856;
    25902857
    25912858/** For a given boundary line \a *Base and its two triangles, picks the central baseline that is "higher".
     
    25962863double Tesselation::PickFarthestofTwoBaselines(class BoundaryLineSet *Base)
    25972864{
    2598         Info FunctionInfo(__func__);
     2865  Info FunctionInfo(__func__);
    25992866  class BoundaryLineSet *OtherBase;
    26002867  Vector *ClosestPoint[2];
    26012868  double volume;
    26022869
    2603   int m=0;
    2604   for(TriangleMap::iterator runner = Base->triangles.begin(); runner != Base->triangles.end(); runner++)
    2605     for (int j=0;j<3;j++) // all of their endpoints and baselines
     2870  int m = 0;
     2871  for (TriangleMap::iterator runner = Base->triangles.begin(); runner != Base->triangles.end(); runner++)
     2872    for (int j = 0; j < 3; j++) // all of their endpoints and baselines
    26062873      if (!Base->ContainsBoundaryPoint(runner->second->endpoints[j])) // and neither of its endpoints
    26072874        BPS[m++] = runner->second->endpoints[j];
    2608   OtherBase = new class BoundaryLineSet(BPS,-1);
    2609 
    2610   Log() << Verbose(0) << "INFO: Current base line is " << *Base << "." << endl;
    2611   Log() << Verbose(0) << "INFO: Other base line is " << *OtherBase << "." << endl;
     2875  OtherBase = new class BoundaryLineSet(BPS, -1);
     2876
     2877  DoLog(0) && (Log() << Verbose(0) << "INFO: Current base line is " << *Base << "." << endl);
     2878  DoLog(0) && (Log() << Verbose(0) << "INFO: Other base line is " << *OtherBase << "." << endl);
    26122879
    26132880  // get the closest point on each line to the other line
     
    26242891
    26252892  // delete the temporary other base line and the closest points
    2626   delete(ClosestPoint[0]);
    2627   delete(ClosestPoint[1]);
    2628   delete(OtherBase);
     2893  delete (ClosestPoint[0]);
     2894  delete (ClosestPoint[1]);
     2895  delete (OtherBase);
    26292896
    26302897  if (Distance.NormSquared() < MYEPSILON) { // check for intersection
    2631     Log() << Verbose(0) << "REJECT: Both lines have an intersection: Nothing to do." << endl;
     2898    DoLog(0) && (Log() << Verbose(0) << "REJECT: Both lines have an intersection: Nothing to do." << endl);
    26322899    return false;
    26332900  } else { // check for sign against BaseLineNormal
     
    26352902    BaseLineNormal.Zero();
    26362903    if (Base->triangles.size() < 2) {
    2637       eLog() << Verbose(1) << "Less than two triangles are attached to this baseline!" << endl;
     2904      DoeLog(1) && (eLog() << Verbose(1) << "Less than two triangles are attached to this baseline!" << endl);
    26382905      return 0.;
    26392906    }
    26402907    for (TriangleMap::iterator runner = Base->triangles.begin(); runner != Base->triangles.end(); runner++) {
    2641       Log() << Verbose(1) << "INFO: Adding NormalVector " << runner->second->NormalVector << " of triangle " << *(runner->second) << "." << endl;
     2908      DoLog(1) && (Log() << Verbose(1) << "INFO: Adding NormalVector " << runner->second->NormalVector << " of triangle " << *(runner->second) << "." << endl);
    26422909      BaseLineNormal.AddVector(&(runner->second->NormalVector));
    26432910    }
    2644     BaseLineNormal.Scale(1./2.);
     2911    BaseLineNormal.Scale(1. / 2.);
    26452912
    26462913    if (Distance.ScalarProduct(&BaseLineNormal) > MYEPSILON) { // Distance points outwards, hence OtherBase higher than Base -> flip
    2647       Log() << Verbose(0) << "ACCEPT: Other base line would be higher: Flipping baseline." << endl;
     2914      DoLog(0) && (Log() << Verbose(0) << "ACCEPT: Other base line would be higher: Flipping baseline." << endl);
    26482915      // calculate volume summand as a general tetraeder
    26492916      return volume;
    2650     } else {  // Base higher than OtherBase -> do nothing
    2651       Log() << Verbose(0) << "REJECT: Base line is higher: Nothing to do." << endl;
     2917    } else { // Base higher than OtherBase -> do nothing
     2918      DoLog(0) && (Log() << Verbose(0) << "REJECT: Base line is higher: Nothing to do." << endl);
    26522919      return 0.;
    26532920    }
    26542921  }
    2655 };
     2922}
     2923;
    26562924
    26572925/** For a given baseline and its two connected triangles, flips the baseline.
     
    26642932class BoundaryLineSet * Tesselation::FlipBaseline(class BoundaryLineSet *Base)
    26652933{
    2666         Info FunctionInfo(__func__);
     2934  Info FunctionInfo(__func__);
    26672935  class BoundaryLineSet *OldLines[4], *NewLine;
    26682936  class BoundaryPointSet *OldPoints[2];
    26692937  Vector BaseLineNormal;
    26702938  int OldTriangleNrs[2], OldBaseLineNr;
    2671   int i,m;
     2939  int i, m;
    26722940
    26732941  // calculate NormalVector for later use
    26742942  BaseLineNormal.Zero();
    26752943  if (Base->triangles.size() < 2) {
    2676     eLog() << Verbose(1) << "Less than two triangles are attached to this baseline!" << endl;
     2944    DoeLog(1) && (eLog() << Verbose(1) << "Less than two triangles are attached to this baseline!" << endl);
    26772945    return NULL;
    26782946  }
    26792947  for (TriangleMap::iterator runner = Base->triangles.begin(); runner != Base->triangles.end(); runner++) {
    2680     Log() << Verbose(1) << "INFO: Adding NormalVector " << runner->second->NormalVector << " of triangle " << *(runner->second) << "." << endl;
     2948    DoLog(1) && (Log() << Verbose(1) << "INFO: Adding NormalVector " << runner->second->NormalVector << " of triangle " << *(runner->second) << "." << endl);
    26812949    BaseLineNormal.AddVector(&(runner->second->NormalVector));
    26822950  }
    2683   BaseLineNormal.Scale(-1./2.); // has to point inside for BoundaryTriangleSet::GetNormalVector()
     2951  BaseLineNormal.Scale(-1. / 2.); // has to point inside for BoundaryTriangleSet::GetNormalVector()
    26842952
    26852953  // get the two triangles
    26862954  // gather four endpoints and four lines
    2687   for (int j=0;j<4;j++)
     2955  for (int j = 0; j < 4; j++)
    26882956    OldLines[j] = NULL;
    2689   for (int j=0;j<2;j++)
     2957  for (int j = 0; j < 2; j++)
    26902958    OldPoints[j] = NULL;
    2691   i=0;
    2692   m=0;
    2693   Log() << Verbose(0) << "The four old lines are: ";
    2694   for(TriangleMap::iterator runner = Base->triangles.begin(); runner != Base->triangles.end(); runner++)
    2695     for (int j=0;j<3;j++) // all of their endpoints and baselines
     2959  i = 0;
     2960  m = 0;
     2961  DoLog(0) && (Log() << Verbose(0) << "The four old lines are: ");
     2962  for (TriangleMap::iterator runner = Base->triangles.begin(); runner != Base->triangles.end(); runner++)
     2963    for (int j = 0; j < 3; j++) // all of their endpoints and baselines
    26962964      if (runner->second->lines[j] != Base) { // pick not the central baseline
    26972965        OldLines[i++] = runner->second->lines[j];
    2698         Log() << Verbose(0) << *runner->second->lines[j] << "\t";
     2966        DoLog(0) && (Log() << Verbose(0) << *runner->second->lines[j] << "\t");
    26992967      }
    2700   Log() << Verbose(0) << endl;
    2701   Log() << Verbose(0) << "The two old points are: ";
    2702   for(TriangleMap::iterator runner = Base->triangles.begin(); runner != Base->triangles.end(); runner++)
    2703     for (int j=0;j<3;j++) // all of their endpoints and baselines
     2968  DoLog(0) && (Log() << Verbose(0) << endl);
     2969  DoLog(0) && (Log() << Verbose(0) << "The two old points are: ");
     2970  for (TriangleMap::iterator runner = Base->triangles.begin(); runner != Base->triangles.end(); runner++)
     2971    for (int j = 0; j < 3; j++) // all of their endpoints and baselines
    27042972      if (!Base->ContainsBoundaryPoint(runner->second->endpoints[j])) { // and neither of its endpoints
    27052973        OldPoints[m++] = runner->second->endpoints[j];
    2706         Log() << Verbose(0) << *runner->second->endpoints[j] << "\t";
     2974        DoLog(0) && (Log() << Verbose(0) << *runner->second->endpoints[j] << "\t");
    27072975      }
    2708   Log() << Verbose(0) << endl;
     2976  DoLog(0) && (Log() << Verbose(0) << endl);
    27092977
    27102978  // check whether everything is in place to create new lines and triangles
    2711   if (i<4) {
    2712     eLog() << Verbose(1) << "We have not gathered enough baselines!" << endl;
     2979  if (i < 4) {
     2980    DoeLog(1) && (eLog() << Verbose(1) << "We have not gathered enough baselines!" << endl);
    27132981    return NULL;
    27142982  }
    2715   for (int j=0;j<4;j++)
     2983  for (int j = 0; j < 4; j++)
    27162984    if (OldLines[j] == NULL) {
    2717       eLog() << Verbose(1) << "We have not gathered enough baselines!" << endl;
     2985      DoeLog(1) && (eLog() << Verbose(1) << "We have not gathered enough baselines!" << endl);
    27182986      return NULL;
    27192987    }
    2720   for (int j=0;j<2;j++)
     2988  for (int j = 0; j < 2; j++)
    27212989    if (OldPoints[j] == NULL) {
    2722       eLog() << Verbose(1) << "We have not gathered enough endpoints!" << endl;
     2990      DoeLog(1) && (eLog() << Verbose(1) << "We have not gathered enough endpoints!" << endl);
    27232991      return NULL;
    27242992    }
    27252993
    27262994  // remove triangles and baseline removes itself
    2727   Log() << Verbose(0) << "INFO: Deleting baseline " << *Base << " from global list." << endl;
     2995  DoLog(0) && (Log() << Verbose(0) << "INFO: Deleting baseline " << *Base << " from global list." << endl);
    27282996  OldBaseLineNr = Base->Nr;
    2729   m=0;
    2730   for(TriangleMap::iterator runner = Base->triangles.begin(); runner != Base->triangles.end(); runner++) {
    2731     Log() << Verbose(0) << "INFO: Deleting triangle " << *(runner->second) << "." << endl;
     2997  m = 0;
     2998  for (TriangleMap::iterator runner = Base->triangles.begin(); runner != Base->triangles.end(); runner++) {
     2999    DoLog(0) && (Log() << Verbose(0) << "INFO: Deleting triangle " << *(runner->second) << "." << endl);
    27323000    OldTriangleNrs[m++] = runner->second->Nr;
    27333001    RemoveTesselationTriangle(runner->second);
     
    27393007  NewLine = new class BoundaryLineSet(BPS, OldBaseLineNr);
    27403008  LinesOnBoundary.insert(LinePair(OldBaseLineNr, NewLine)); // no need for check for unique insertion as NewLine is definitely a new one
    2741   Log() << Verbose(0) << "INFO: Created new baseline " << *NewLine << "." << endl;
     3009  DoLog(0) && (Log() << Verbose(0) << "INFO: Created new baseline " << *NewLine << "." << endl);
    27423010
    27433011  // construct new triangles with flipped baseline
    2744   i=-1;
     3012  i = -1;
    27453013  if (OldLines[0]->IsConnectedTo(OldLines[2]))
    2746     i=2;
     3014    i = 2;
    27473015  if (OldLines[0]->IsConnectedTo(OldLines[3]))
    2748     i=3;
    2749   if (i!=-1) {
     3016    i = 3;
     3017  if (i != -1) {
    27503018    BLS[0] = OldLines[0];
    27513019    BLS[1] = OldLines[i];
     
    27543022    BTS->GetNormalVector(BaseLineNormal);
    27553023    AddTesselationTriangle(OldTriangleNrs[0]);
    2756     Log() << Verbose(0) << "INFO: Created new triangle " << *BTS << "." << endl;
    2757 
    2758     BLS[0] = (i==2 ? OldLines[3] : OldLines[2]);
     3024    DoLog(0) && (Log() << Verbose(0) << "INFO: Created new triangle " << *BTS << "." << endl);
     3025
     3026    BLS[0] = (i == 2 ? OldLines[3] : OldLines[2]);
    27593027    BLS[1] = OldLines[1];
    27603028    BLS[2] = NewLine;
     
    27623030    BTS->GetNormalVector(BaseLineNormal);
    27633031    AddTesselationTriangle(OldTriangleNrs[1]);
    2764     Log() << Verbose(0) << "INFO: Created new triangle " << *BTS << "." << endl;
     3032    DoLog(0) && (Log() << Verbose(0) << "INFO: Created new triangle " << *BTS << "." << endl);
    27653033  } else {
    2766     eLog() << Verbose(0) << "The four old lines do not connect, something's utterly wrong here!" << endl;
     3034    DoeLog(0) && (eLog() << Verbose(0) << "The four old lines do not connect, something's utterly wrong here!" << endl);
    27673035    return NULL;
    27683036  }
    27693037
    27703038  return NewLine;
    2771 };
    2772 
     3039}
     3040;
    27733041
    27743042/** Finds the second point of starting triangle.
     
    27823050void Tesselation::FindSecondPointForTesselation(TesselPoint* a, Vector Oben, TesselPoint*& OptCandidate, double Storage[3], double RADIUS, const LinkedCell *LC)
    27833051{
    2784         Info FunctionInfo(__func__);
     3052  Info FunctionInfo(__func__);
    27853053  Vector AngleCheck;
    27863054  class TesselPoint* Candidate = NULL;
     
    27913059  int Nupper[NDIM];
    27923060
    2793   if (LC->SetIndexToNode(a)) {  // get cell for the starting point
    2794     for(int i=0;i<NDIM;i++) // store indices of this cell
     3061  if (LC->SetIndexToNode(a)) { // get cell for the starting point
     3062    for (int i = 0; i < NDIM; i++) // store indices of this cell
    27953063      N[i] = LC->n[i];
    27963064  } else {
    2797     eLog() << Verbose(1) << "Point " << *a << " is not found in cell " << LC->index << "." << endl;
     3065    DoeLog(1) && (eLog() << Verbose(1) << "Point " << *a << " is not found in cell " << LC->index << "." << endl);
    27983066    return;
    27993067  }
    28003068  // then go through the current and all neighbouring cells and check the contained points for possible candidates
    2801   for (int i=0;i<NDIM;i++) {
    2802     Nlower[i] = ((N[i]-1) >= 0) ? N[i]-1 : 0;
    2803     Nupper[i] = ((N[i]+1) < LC->N[i]) ? N[i]+1 : LC->N[i]-1;
    2804   }
    2805   Log() << Verbose(0) << "LC Intervals from [" << N[0] << "<->" << LC->N[0] << ", " << N[1] << "<->" << LC->N[1] << ", " << N[2] << "<->" << LC->N[2] << "] :"
    2806     << " [" << Nlower[0] << "," << Nupper[0] << "], " << " [" << Nlower[1] << "," << Nupper[1] << "], " << " [" << Nlower[2] << "," << Nupper[2] << "], " << endl;
     3069  for (int i = 0; i < NDIM; i++) {
     3070    Nlower[i] = ((N[i] - 1) >= 0) ? N[i] - 1 : 0;
     3071    Nupper[i] = ((N[i] + 1) < LC->N[i]) ? N[i] + 1 : LC->N[i] - 1;
     3072  }
     3073  DoLog(0) && (Log() << Verbose(0) << "LC Intervals from [" << N[0] << "<->" << LC->N[0] << ", " << N[1] << "<->" << LC->N[1] << ", " << N[2] << "<->" << LC->N[2] << "] :" << " [" << Nlower[0] << "," << Nupper[0] << "], " << " [" << Nlower[1] << "," << Nupper[1] << "], " << " [" << Nlower[2] << "," << Nupper[2] << "], " << endl);
    28073074
    28083075  for (LC->n[0] = Nlower[0]; LC->n[0] <= Nupper[0]; LC->n[0]++)
    28093076    for (LC->n[1] = Nlower[1]; LC->n[1] <= Nupper[1]; LC->n[1]++)
    28103077      for (LC->n[2] = Nlower[2]; LC->n[2] <= Nupper[2]; LC->n[2]++) {
    2811         const LinkedNodes *List = LC->GetCurrentCell();
     3078        const LinkedCell::LinkedNodes *List = LC->GetCurrentCell();
    28123079        //Log() << Verbose(1) << "Current cell is " << LC->n[0] << ", " << LC->n[1] << ", " << LC->n[2] << " with No. " << LC->index << "." << endl;
    28133080        if (List != NULL) {
    2814           for (LinkedNodes::const_iterator Runner = List->begin(); Runner != List->end(); Runner++) {
     3081          for (LinkedCell::LinkedNodes::const_iterator Runner = List->begin(); Runner != List->end(); Runner++) {
    28153082            Candidate = (*Runner);
    28163083            // check if we only have one unique point yet ...
     
    28383105              norm = aCandidate.Norm();
    28393106              // second point shall have smallest angle with respect to Oben vector
    2840               if (norm < RADIUS*2.) {
     3107              if (norm < RADIUS * 2.) {
    28413108                angle = AngleCheck.Angle(&Oben);
    28423109                if (angle < Storage[0]) {
    28433110                  //Log() << Verbose(1) << "Old values of Storage: %lf %lf \n", Storage[0], Storage[1]);
    2844                   Log() << Verbose(1) << "Current candidate is " << *Candidate << ": Is a better candidate with distance " << norm << " and angle " << angle << " to oben " << Oben << ".\n";
     3111                  DoLog(1) && (Log() << Verbose(1) << "Current candidate is " << *Candidate << ": Is a better candidate with distance " << norm << " and angle " << angle << " to oben " << Oben << ".\n");
    28453112                  OptCandidate = Candidate;
    28463113                  Storage[0] = angle;
     
    28573124          }
    28583125        } else {
    2859           Log() << Verbose(0) << "Linked cell list is empty." << endl;
     3126          DoLog(0) && (Log() << Verbose(0) << "Linked cell list is empty." << endl);
    28603127        }
    28613128      }
    2862 };
    2863 
     3129}
     3130;
    28643131
    28653132/** This recursive function finds a third point, to form a triangle with two given ones.
     
    28893156 * @param OldSphereCenter center of sphere for base triangle, relative to center of BaseLine, giving null angle for the parameter circle
    28903157 * @param CandidateLine CandidateForTesselation with the current base line and list of candidates and ShortestAngle
    2891  * @param ThirdNode third point to avoid in search
     3158 * @param ThirdPoint third point to avoid in search
    28923159 * @param RADIUS radius of sphere
    28933160 * @param *LC LinkedCell structure with neighbouring points
    28943161 */
    2895 void Tesselation::FindThirdPointForTesselation(Vector &NormalVector, Vector &SearchDirection, Vector &OldSphereCenter, CandidateForTesselation &CandidateLine, const class TesselPoint  * const ThirdNode, const double RADIUS, const LinkedCell *LC) const
    2896 {
    2897         Info FunctionInfo(__func__);
    2898   Vector CircleCenter;  // center of the circle, i.e. of the band of sphere's centers
     3162void Tesselation::FindThirdPointForTesselation(const Vector &NormalVector, const Vector &SearchDirection, const Vector &OldSphereCenter, CandidateForTesselation &CandidateLine, const class BoundaryPointSet * const ThirdPoint, const double RADIUS, const LinkedCell *LC) const
     3163{
     3164  Info FunctionInfo(__func__);
     3165  Vector CircleCenter; // center of the circle, i.e. of the band of sphere's centers
    28993166  Vector CirclePlaneNormal; // normal vector defining the plane this circle lives in
    29003167  Vector SphereCenter;
    2901   Vector NewSphereCenter;   // center of the sphere defined by the two points of BaseLine and the one of Candidate, first possibility
    2902   Vector OtherNewSphereCenter;   // center of the sphere defined by the two points of BaseLine and the one of Candidate, second possibility
    2903   Vector NewNormalVector;   // normal vector of the Candidate's triangle
     3168  Vector NewSphereCenter; // center of the sphere defined by the two points of BaseLine and the one of Candidate, first possibility
     3169  Vector OtherNewSphereCenter; // center of the sphere defined by the two points of BaseLine and the one of Candidate, second possibility
     3170  Vector NewNormalVector; // normal vector of the Candidate's triangle
    29043171  Vector helper, OptCandidateCenter, OtherOptCandidateCenter;
    29053172  Vector RelativeOldSphereCenter;
     
    29123179  TesselPoint *Candidate = NULL;
    29133180
    2914   Log() << Verbose(1) << "INFO: NormalVector of BaseTriangle is " << NormalVector << "." << endl;
     3181  DoLog(1) && (Log() << Verbose(1) << "INFO: NormalVector of BaseTriangle is " << NormalVector << "." << endl);
     3182
     3183  // copy old center
     3184  CandidateLine.OldCenter.CopyVector(&OldSphereCenter);
     3185  CandidateLine.ThirdPoint = ThirdPoint;
     3186  CandidateLine.pointlist.clear();
    29153187
    29163188  // construct center of circle
     
    29263198  RelativeOldSphereCenter.SubtractVector(&CircleCenter);
    29273199
    2928   // calculate squared radius TesselPoint *ThirdNode,f circle
    2929   radius = CirclePlaneNormal.NormSquared()/4.;
    2930   if (radius < RADIUS*RADIUS) {
    2931     CircleRadius = RADIUS*RADIUS - radius;
     3200  // calculate squared radius TesselPoint *ThirdPoint,f circle
     3201  radius = CirclePlaneNormal.NormSquared() / 4.;
     3202  if (radius < RADIUS * RADIUS) {
     3203    CircleRadius = RADIUS * RADIUS - radius;
    29323204    CirclePlaneNormal.Normalize();
    2933     Log() << Verbose(1) << "INFO: CircleCenter is at " << CircleCenter << ", CirclePlaneNormal is " << CirclePlaneNormal << " with circle radius " << sqrt(CircleRadius) << "." << endl;
     3205    DoLog(1) && (Log() << Verbose(1) << "INFO: CircleCenter is at " << CircleCenter << ", CirclePlaneNormal is " << CirclePlaneNormal << " with circle radius " << sqrt(CircleRadius) << "." << endl);
    29343206
    29353207    // test whether old center is on the band's plane
    29363208    if (fabs(RelativeOldSphereCenter.ScalarProduct(&CirclePlaneNormal)) > HULLEPSILON) {
    2937       eLog() << Verbose(1) << "Something's very wrong here: RelativeOldSphereCenter is not on the band's plane as desired by " << fabs(RelativeOldSphereCenter.ScalarProduct(&CirclePlaneNormal)) << "!" << endl;
     3209      DoeLog(1) && (eLog() << Verbose(1) << "Something's very wrong here: RelativeOldSphereCenter is not on the band's plane as desired by " << fabs(RelativeOldSphereCenter.ScalarProduct(&CirclePlaneNormal)) << "!" << endl);
    29383210      RelativeOldSphereCenter.ProjectOntoPlane(&CirclePlaneNormal);
    29393211    }
    29403212    radius = RelativeOldSphereCenter.NormSquared();
    29413213    if (fabs(radius - CircleRadius) < HULLEPSILON) {
    2942       Log() << Verbose(1) << "INFO: RelativeOldSphereCenter is at " << RelativeOldSphereCenter << "." << endl;
     3214      DoLog(1) && (Log() << Verbose(1) << "INFO: RelativeOldSphereCenter is at " << RelativeOldSphereCenter << "." << endl);
    29433215
    29443216      // check SearchDirection
    2945       Log() << Verbose(1) << "INFO: SearchDirection is " << SearchDirection << "." << endl;
    2946       if (fabs(RelativeOldSphereCenter.ScalarProduct(&SearchDirection)) > HULLEPSILON) {  // rotated the wrong way!
    2947         eLog() << Verbose(1) << "SearchDirection and RelativeOldSphereCenter are not orthogonal!" << endl;
     3217      DoLog(1) && (Log() << Verbose(1) << "INFO: SearchDirection is " << SearchDirection << "." << endl);
     3218      if (fabs(RelativeOldSphereCenter.ScalarProduct(&SearchDirection)) > HULLEPSILON) { // rotated the wrong way!
     3219        DoeLog(1) && (eLog() << Verbose(1) << "SearchDirection and RelativeOldSphereCenter are not orthogonal!" << endl);
    29483220      }
    29493221
    29503222      // get cell for the starting point
    29513223      if (LC->SetIndexToVector(&CircleCenter)) {
    2952         for(int i=0;i<NDIM;i++) // store indices of this cell
    2953         N[i] = LC->n[i];
     3224        for (int i = 0; i < NDIM; i++) // store indices of this cell
     3225          N[i] = LC->n[i];
    29543226        //Log() << Verbose(1) << "INFO: Center cell is " << N[0] << ", " << N[1] << ", " << N[2] << " with No. " << LC->index << "." << endl;
    29553227      } else {
    2956         eLog() << Verbose(1) << "Vector " << CircleCenter << " is outside of LinkedCell's bounding box." << endl;
     3228        DoeLog(1) && (eLog() << Verbose(1) << "Vector " << CircleCenter << " is outside of LinkedCell's bounding box." << endl);
    29573229        return;
    29583230      }
    29593231      // then go through the current and all neighbouring cells and check the contained points for possible candidates
    29603232      //Log() << Verbose(1) << "LC Intervals:";
    2961       for (int i=0;i<NDIM;i++) {
    2962         Nlower[i] = ((N[i]-1) >= 0) ? N[i]-1 : 0;
    2963         Nupper[i] = ((N[i]+1) < LC->N[i]) ? N[i]+1 : LC->N[i]-1;
     3233      for (int i = 0; i < NDIM; i++) {
     3234        Nlower[i] = ((N[i] - 1) >= 0) ? N[i] - 1 : 0;
     3235        Nupper[i] = ((N[i] + 1) < LC->N[i]) ? N[i] + 1 : LC->N[i] - 1;
    29643236        //Log() << Verbose(0) << " [" << Nlower[i] << "," << Nupper[i] << "] ";
    29653237      }
     
    29683240        for (LC->n[1] = Nlower[1]; LC->n[1] <= Nupper[1]; LC->n[1]++)
    29693241          for (LC->n[2] = Nlower[2]; LC->n[2] <= Nupper[2]; LC->n[2]++) {
    2970             const LinkedNodes *List = LC->GetCurrentCell();
     3242            const LinkedCell::LinkedNodes *List = LC->GetCurrentCell();
    29713243            //Log() << Verbose(1) << "Current cell is " << LC->n[0] << ", " << LC->n[1] << ", " << LC->n[2] << " with No. " << LC->index << "." << endl;
    29723244            if (List != NULL) {
    2973               for (LinkedNodes::const_iterator Runner = List->begin(); Runner != List->end(); Runner++) {
     3245              for (LinkedCell::LinkedNodes::const_iterator Runner = List->begin(); Runner != List->end(); Runner++) {
    29743246                Candidate = (*Runner);
    29753247
    29763248                // check for three unique points
    2977                 Log() << Verbose(2) << "INFO: Current Candidate is " << *Candidate << " for BaseLine " << *CandidateLine.BaseLine << " with OldSphereCenter " << OldSphereCenter << "." << endl;
    2978                 if ((Candidate != CandidateLine.BaseLine->endpoints[0]->node) && (Candidate != CandidateLine.BaseLine->endpoints[1]->node) ){
     3249                DoLog(2) && (Log() << Verbose(2) << "INFO: Current Candidate is " << *Candidate << " for BaseLine " << *CandidateLine.BaseLine << " with OldSphereCenter " << OldSphereCenter << "." << endl);
     3250                if ((Candidate != CandidateLine.BaseLine->endpoints[0]->node) && (Candidate != CandidateLine.BaseLine->endpoints[1]->node)) {
    29793251
    29803252                  // find center on the plane
    29813253                  GetCenterofCircumcircle(&NewPlaneCenter, *CandidateLine.BaseLine->endpoints[0]->node->node, *CandidateLine.BaseLine->endpoints[1]->node->node, *Candidate->node);
    2982                   Log() << Verbose(1) << "INFO: NewPlaneCenter is " << NewPlaneCenter << "." << endl;
    2983 
    2984                   if (NewNormalVector.MakeNormalVector(CandidateLine.BaseLine->endpoints[0]->node->node, CandidateLine.BaseLine->endpoints[1]->node->node, Candidate->node)
    2985                   && (fabs(NewNormalVector.NormSquared()) > HULLEPSILON)
    2986                   ) {
    2987                     Log() << Verbose(1) << "INFO: NewNormalVector is " << NewNormalVector << "." << endl;
     3254                  DoLog(1) && (Log() << Verbose(1) << "INFO: NewPlaneCenter is " << NewPlaneCenter << "." << endl);
     3255
     3256                  if (NewNormalVector.MakeNormalVector(CandidateLine.BaseLine->endpoints[0]->node->node, CandidateLine.BaseLine->endpoints[1]->node->node, Candidate->node) && (fabs(NewNormalVector.NormSquared()) > HULLEPSILON)) {
     3257                    DoLog(1) && (Log() << Verbose(1) << "INFO: NewNormalVector is " << NewNormalVector << "." << endl);
    29883258                    radius = CandidateLine.BaseLine->endpoints[0]->node->node->DistanceSquared(&NewPlaneCenter);
    2989                     Log() << Verbose(1) << "INFO: CircleCenter is at " << CircleCenter << ", CirclePlaneNormal is " << CirclePlaneNormal << " with circle radius " << sqrt(CircleRadius) << "." << endl;
    2990                     Log() << Verbose(1) << "INFO: SearchDirection is " << SearchDirection << "." << endl;
    2991                     Log() << Verbose(1) << "INFO: Radius of CircumCenterCircle is " << radius << "." << endl;
    2992                     if (radius < RADIUS*RADIUS) {
     3259                    DoLog(1) && (Log() << Verbose(1) << "INFO: CircleCenter is at " << CircleCenter << ", CirclePlaneNormal is " << CirclePlaneNormal << " with circle radius " << sqrt(CircleRadius) << "." << endl);
     3260                    DoLog(1) && (Log() << Verbose(1) << "INFO: SearchDirection is " << SearchDirection << "." << endl);
     3261                    DoLog(1) && (Log() << Verbose(1) << "INFO: Radius of CircumCenterCircle is " << radius << "." << endl);
     3262                    if (radius < RADIUS * RADIUS) {
    29933263                      otherradius = CandidateLine.BaseLine->endpoints[1]->node->node->DistanceSquared(&NewPlaneCenter);
    2994                       if (fabs(radius - otherradius) > HULLEPSILON) {
    2995                         eLog() << Verbose(1) << "Distance to center of circumcircle is not the same from each corner of the triangle: " << fabs(radius-otherradius) << endl;
    2996                       }
    2997                       // construct both new centers
    2998                       NewSphereCenter.CopyVector(&NewPlaneCenter);
    2999                       OtherNewSphereCenter.CopyVector(&NewPlaneCenter);
    3000                       helper.CopyVector(&NewNormalVector);
    3001                       helper.Scale(sqrt(RADIUS*RADIUS - radius));
    3002                       Log() << Verbose(2) << "INFO: Distance of NewPlaneCenter " << NewPlaneCenter << " to either NewSphereCenter is " << helper.Norm() << " of vector " << helper << " with sphere radius " << RADIUS << "." << endl;
    3003                       NewSphereCenter.AddVector(&helper);
    3004                       Log() << Verbose(2) << "INFO: NewSphereCenter is at " << NewSphereCenter << "." << endl;
    3005                       // OtherNewSphereCenter is created by the same vector just in the other direction
    3006                       helper.Scale(-1.);
    3007                       OtherNewSphereCenter.AddVector(&helper);
    3008                       Log() << Verbose(2) << "INFO: OtherNewSphereCenter is at " << OtherNewSphereCenter << "." << endl;
    3009 
    3010                       alpha = GetPathLengthonCircumCircle(CircleCenter, CirclePlaneNormal, CircleRadius, NewSphereCenter, OldSphereCenter, NormalVector, SearchDirection);
    3011                       Otheralpha = GetPathLengthonCircumCircle(CircleCenter, CirclePlaneNormal, CircleRadius, OtherNewSphereCenter, OldSphereCenter, NormalVector, SearchDirection);
    3012                       alpha = min(alpha, Otheralpha);
    3013 
    3014                       // if there is a better candidate, drop the current list and add the new candidate
    3015                       // otherwise ignore the new candidate and keep the list
    3016                       if (CandidateLine.ShortestAngle > (alpha - HULLEPSILON)) {
    3017                         if (fabs(alpha - Otheralpha) > MYEPSILON) {
    3018                           CandidateLine.OptCenter.CopyVector(&NewSphereCenter);
    3019                           CandidateLine.OtherOptCenter.CopyVector(&OtherNewSphereCenter);
     3264                      if (fabs(radius - otherradius) < HULLEPSILON) {
     3265                        // construct both new centers
     3266                        NewSphereCenter.CopyVector(&NewPlaneCenter);
     3267                        OtherNewSphereCenter.CopyVector(&NewPlaneCenter);
     3268                        helper.CopyVector(&NewNormalVector);
     3269                        helper.Scale(sqrt(RADIUS * RADIUS - radius));
     3270                        DoLog(2) && (Log() << Verbose(2) << "INFO: Distance of NewPlaneCenter " << NewPlaneCenter << " to either NewSphereCenter is " << helper.Norm() << " of vector " << helper << " with sphere radius " << RADIUS << "." << endl);
     3271                        NewSphereCenter.AddVector(&helper);
     3272                        DoLog(2) && (Log() << Verbose(2) << "INFO: NewSphereCenter is at " << NewSphereCenter << "." << endl);
     3273                        // OtherNewSphereCenter is created by the same vector just in the other direction
     3274                        helper.Scale(-1.);
     3275                        OtherNewSphereCenter.AddVector(&helper);
     3276                        DoLog(2) && (Log() << Verbose(2) << "INFO: OtherNewSphereCenter is at " << OtherNewSphereCenter << "." << endl);
     3277
     3278                        alpha = GetPathLengthonCircumCircle(CircleCenter, CirclePlaneNormal, CircleRadius, NewSphereCenter, OldSphereCenter, NormalVector, SearchDirection);
     3279                        Otheralpha = GetPathLengthonCircumCircle(CircleCenter, CirclePlaneNormal, CircleRadius, OtherNewSphereCenter, OldSphereCenter, NormalVector, SearchDirection);
     3280                        if ((ThirdPoint != NULL) && (Candidate == ThirdPoint->node)) { // in that case only the other circlecenter is valid
     3281                          if (OldSphereCenter.DistanceSquared(&NewSphereCenter) < OldSphereCenter.DistanceSquared(&OtherNewSphereCenter))
     3282                            alpha = Otheralpha;
     3283                        } else
     3284                          alpha = min(alpha, Otheralpha);
     3285
     3286                        // if there is a better candidate, drop the current list and add the new candidate
     3287                        // otherwise ignore the new candidate and keep the list
     3288                        if (CandidateLine.ShortestAngle > (alpha - HULLEPSILON)) {
     3289                          if (fabs(alpha - Otheralpha) > MYEPSILON) {
     3290                            CandidateLine.OptCenter.CopyVector(&NewSphereCenter);
     3291                            CandidateLine.OtherOptCenter.CopyVector(&OtherNewSphereCenter);
     3292                          } else {
     3293                            CandidateLine.OptCenter.CopyVector(&OtherNewSphereCenter);
     3294                            CandidateLine.OtherOptCenter.CopyVector(&NewSphereCenter);
     3295                          }
     3296                          // if there is an equal candidate, add it to the list without clearing the list
     3297                          if ((CandidateLine.ShortestAngle - HULLEPSILON) < alpha) {
     3298                            CandidateLine.pointlist.push_back(Candidate);
     3299                            DoLog(0) && (Log() << Verbose(0) << "ACCEPT: We have found an equally good candidate: " << *(Candidate) << " with " << alpha << " and circumsphere's center at " << CandidateLine.OptCenter << "." << endl);
     3300                          } else {
     3301                            // remove all candidates from the list and then the list itself
     3302                            CandidateLine.pointlist.clear();
     3303                            CandidateLine.pointlist.push_back(Candidate);
     3304                            DoLog(0) && (Log() << Verbose(0) << "ACCEPT: We have found a better candidate: " << *(Candidate) << " with " << alpha << " and circumsphere's center at " << CandidateLine.OptCenter << "." << endl);
     3305                          }
     3306                          CandidateLine.ShortestAngle = alpha;
     3307                          DoLog(0) && (Log() << Verbose(0) << "INFO: There are " << CandidateLine.pointlist.size() << " candidates in the list now." << endl);
    30203308                        } else {
    3021                           CandidateLine.OptCenter.CopyVector(&OtherNewSphereCenter);
    3022                           CandidateLine.OtherOptCenter.CopyVector(&NewSphereCenter);
     3309                          if ((Candidate != NULL) && (CandidateLine.pointlist.begin() != CandidateLine.pointlist.end())) {
     3310                            DoLog(1) && (Log() << Verbose(1) << "REJECT: Old candidate " << *(*CandidateLine.pointlist.begin()) << " with " << CandidateLine.ShortestAngle << " is better than new one " << *Candidate << " with " << alpha << " ." << endl);
     3311                          } else {
     3312                            DoLog(1) && (Log() << Verbose(1) << "REJECT: Candidate " << *Candidate << " with " << alpha << " was rejected." << endl);
     3313                          }
    30233314                        }
    3024                         // if there is an equal candidate, add it to the list without clearing the list
    3025                         if ((CandidateLine.ShortestAngle - HULLEPSILON) < alpha) {
    3026                           CandidateLine.pointlist.push_back(Candidate);
    3027                           Log() << Verbose(0) << "ACCEPT: We have found an equally good candidate: " << *(Candidate) << " with "
    3028                             << alpha << " and circumsphere's center at " << CandidateLine.OptCenter << "." << endl;
    3029                         } else {
    3030                           // remove all candidates from the list and then the list itself
    3031                           CandidateLine.pointlist.clear();
    3032                           CandidateLine.pointlist.push_back(Candidate);
    3033                           Log() << Verbose(0) << "ACCEPT: We have found a better candidate: " << *(Candidate) << " with "
    3034                             << alpha << " and circumsphere's center at " << CandidateLine.OptCenter << "." << endl;
    3035                         }
    3036                         CandidateLine.ShortestAngle = alpha;
    3037                         Log() << Verbose(0) << "INFO: There are " << CandidateLine.pointlist.size() << " candidates in the list now." << endl;
    30383315                      } else {
    3039                         if ((Candidate != NULL) && (CandidateLine.pointlist.begin() != CandidateLine.pointlist.end())) {
    3040                           Log() << Verbose(1) << "REJECT: Old candidate " << *(Candidate) << " with " << CandidateLine.ShortestAngle << " is better than new one " << *Candidate << " with " << alpha << " ." << endl;
    3041                         } else {
    3042                           Log() << Verbose(1) << "REJECT: Candidate " << *Candidate << " with " << alpha << " was rejected." << endl;
    3043                         }
     3316                        DoLog(1) && (Log() << Verbose(1) << "REJECT: Distance to center of circumcircle is not the same from each corner of the triangle: " << fabs(radius - otherradius) << endl);
    30443317                      }
    30453318                    } else {
    3046                       Log() << Verbose(1) << "REJECT: NewSphereCenter " << NewSphereCenter << " for " << *Candidate << " is too far away: " << radius << "." << endl;
     3319                      DoLog(1) && (Log() << Verbose(1) << "REJECT: NewSphereCenter " << NewSphereCenter << " for " << *Candidate << " is too far away: " << radius << "." << endl);
    30473320                    }
    30483321                  } else {
    3049                     Log() << Verbose(1) << "REJECT: Three points from " << *CandidateLine.BaseLine << " and Candidate " << *Candidate << " are linear-dependent." << endl;
     3322                    DoLog(1) && (Log() << Verbose(1) << "REJECT: Three points from " << *CandidateLine.BaseLine << " and Candidate " << *Candidate << " are linear-dependent." << endl);
    30503323                  }
    30513324                } else {
    3052                   if (ThirdNode != NULL) {
    3053                     Log() << Verbose(1) << "REJECT: Base triangle " << *CandidateLine.BaseLine << " and " << *ThirdNode << " contains Candidate " << *Candidate << "." << endl;
     3325                  if (ThirdPoint != NULL) {
     3326                    DoLog(1) && (Log() << Verbose(1) << "REJECT: Base triangle " << *CandidateLine.BaseLine << " and " << *ThirdPoint << " contains Candidate " << *Candidate << "." << endl);
    30543327                  } else {
    3055                     Log() << Verbose(1) << "REJECT: Base triangle " << *CandidateLine.BaseLine << " contains Candidate " << *Candidate << "." << endl;
     3328                    DoLog(1) && (Log() << Verbose(1) << "REJECT: Base triangle " << *CandidateLine.BaseLine << " contains Candidate " << *Candidate << "." << endl);
    30563329                  }
    30573330                }
     
    30603333          }
    30613334    } else {
    3062       eLog() << Verbose(1) << "The projected center of the old sphere has radius " << radius << " instead of " << CircleRadius << "." << endl;
     3335      DoeLog(1) && (eLog() << Verbose(1) << "The projected center of the old sphere has radius " << radius << " instead of " << CircleRadius << "." << endl);
    30633336    }
    30643337  } else {
    3065     if (ThirdNode != NULL)
    3066       Log() << Verbose(1) << "Circumcircle for base line " << *CandidateLine.BaseLine << " and third node " << *ThirdNode << " is too big!" << endl;
     3338    if (ThirdPoint != NULL)
     3339      DoLog(1) && (Log() << Verbose(1) << "Circumcircle for base line " << *CandidateLine.BaseLine << " and third node " << *ThirdPoint << " is too big!" << endl);
    30673340    else
    3068       Log() << Verbose(1) << "Circumcircle for base line " << *CandidateLine.BaseLine << " is too big!" << endl;
    3069   }
    3070 
    3071   Log() << Verbose(1) << "INFO: Sorting candidate list ..." << endl;
     3341      DoLog(1) && (Log() << Verbose(1) << "Circumcircle for base line " << *CandidateLine.BaseLine << " is too big!" << endl);
     3342  }
     3343
     3344  DoLog(1) && (Log() << Verbose(1) << "INFO: Sorting candidate list ..." << endl);
    30723345  if (CandidateLine.pointlist.size() > 1) {
    30733346    CandidateLine.pointlist.unique();
    30743347    CandidateLine.pointlist.sort(); //SortCandidates);
    30753348  }
    3076 };
     3349
     3350  if ((!CandidateLine.pointlist.empty()) && (!CandidateLine.CheckValidity(RADIUS, LC))) {
     3351    DoeLog(0) && (eLog() << Verbose(0) << "There were other points contained in the rolling sphere as well!" << endl);
     3352    performCriticalExit();
     3353  }
     3354}
     3355;
    30773356
    30783357/** Finds the endpoint two lines are sharing.
     
    30833362class BoundaryPointSet *Tesselation::GetCommonEndpoint(const BoundaryLineSet * line1, const BoundaryLineSet * line2) const
    30843363{
    3085         Info FunctionInfo(__func__);
     3364  Info FunctionInfo(__func__);
    30863365  const BoundaryLineSet * lines[2] = { line1, line2 };
    30873366  class BoundaryPointSet *node = NULL;
     
    30903369  for (int i = 0; i < 2; i++)
    30913370    // for both lines
    3092     for (int j = 0; j < 2; j++)
    3093       { // for both endpoints
    3094         OrderTest = OrderMap.insert(pair<int, class BoundaryPointSet *> (
    3095             lines[i]->endpoints[j]->Nr, lines[i]->endpoints[j]));
    3096         if (!OrderTest.second)
    3097           { // if insertion fails, we have common endpoint
    3098             node = OrderTest.first->second;
    3099             Log() << Verbose(1) << "Common endpoint of lines " << *line1
    3100                 << " and " << *line2 << " is: " << *node << "." << endl;
    3101             j = 2;
    3102             i = 2;
    3103             break;
    3104           }
     3371    for (int j = 0; j < 2; j++) { // for both endpoints
     3372      OrderTest = OrderMap.insert(pair<int, class BoundaryPointSet *> (lines[i]->endpoints[j]->Nr, lines[i]->endpoints[j]));
     3373      if (!OrderTest.second) { // if insertion fails, we have common endpoint
     3374        node = OrderTest.first->second;
     3375        DoLog(1) && (Log() << Verbose(1) << "Common endpoint of lines " << *line1 << " and " << *line2 << " is: " << *node << "." << endl);
     3376        j = 2;
     3377        i = 2;
     3378        break;
    31053379      }
     3380    }
    31063381  return node;
    3107 };
     3382}
     3383;
    31083384
    31093385/** Finds the boundary points that are closest to a given Vector \a *x.
     
    31193395
    31203396  if (LinesOnBoundary.empty()) {
    3121     eLog() << Verbose(1) << "There is no tesselation structure to compare the point with, please create one first." << endl;
     3397    DoeLog(1) && (eLog() << Verbose(1) << "There is no tesselation structure to compare the point with, please create one first." << endl);
    31223398    return NULL;
    31233399  }
     
    31253401  // gather all points close to the desired one
    31263402  LC->SetIndexToVector(x); // ignore status as we calculate bounds below sensibly
    3127   for(int i=0;i<NDIM;i++) // store indices of this cell
     3403  for (int i = 0; i < NDIM; i++) // store indices of this cell
    31283404    N[i] = LC->n[i];
    3129   Log() << Verbose(1) << "INFO: Center cell is " << N[0] << ", " << N[1] << ", " << N[2] << " with No. " << LC->index << "." << endl;
    3130 
     3405  DoLog(1) && (Log() << Verbose(1) << "INFO: Center cell is " << N[0] << ", " << N[1] << ", " << N[2] << " with No. " << LC->index << "." << endl);
    31313406  DistanceToPointMap * points = new DistanceToPointMap;
    31323407  LC->GetNeighbourBounds(Nlower, Nupper);
     
    31353410    for (LC->n[1] = Nlower[1]; LC->n[1] <= Nupper[1]; LC->n[1]++)
    31363411      for (LC->n[2] = Nlower[2]; LC->n[2] <= Nupper[2]; LC->n[2]++) {
    3137         const LinkedNodes *List = LC->GetCurrentCell();
     3412        const LinkedCell::LinkedNodes *List = LC->GetCurrentCell();
    31383413        //Log() << Verbose(1) << "The current cell " << LC->n[0] << "," << LC->n[1] << "," << LC->n[2] << endl;
    31393414        if (List != NULL) {
    3140           for (LinkedNodes::const_iterator Runner = List->begin(); Runner != List->end(); Runner++) {
     3415          for (LinkedCell::LinkedNodes::const_iterator Runner = List->begin(); Runner != List->end(); Runner++) {
    31413416            FindPoint = PointsOnBoundary.find((*Runner)->nr);
    31423417            if (FindPoint != PointsOnBoundary.end()) {
    3143               points->insert(DistanceToPointPair (FindPoint->second->node->node->DistanceSquared(x), FindPoint->second) );
    3144               Log() << Verbose(1) << "INFO: Putting " << *FindPoint->second << " into the list." << endl;
     3418              points->insert(DistanceToPointPair(FindPoint->second->node->node->DistanceSquared(x), FindPoint->second));
     3419              DoLog(1) && (Log() << Verbose(1) << "INFO: Putting " << *FindPoint->second << " into the list." << endl);
    31453420            }
    31463421          }
    31473422        } else {
    3148           eLog() << Verbose(1) << "The current cell " << LC->n[0] << "," << LC->n[1] << "," << LC->n[2] << " is invalid!" << endl;
     3423          DoeLog(1) && (eLog() << Verbose(1) << "The current cell " << LC->n[0] << "," << LC->n[1] << "," << LC->n[2] << " is invalid!" << endl);
    31493424        }
    31503425      }
     
    31523427  // check whether we found some points
    31533428  if (points->empty()) {
    3154     eLog() << Verbose(1) << "There is no nearest point: too far away from the surface." << endl;
    3155     delete(points);
     3429    DoeLog(1) && (eLog() << Verbose(1) << "There is no nearest point: too far away from the surface." << endl);
     3430    delete (points);
    31563431    return NULL;
    31573432  }
    31583433  return points;
    3159 };
     3434}
     3435;
    31603436
    31613437/** Finds the boundary line that is closest to a given Vector \a *x.
     
    31673443{
    31683444  Info FunctionInfo(__func__);
    3169 
    31703445  // get closest points
    3171   DistanceToPointMap * points = FindClosestBoundaryPointsToVector(x,LC);
     3446  DistanceToPointMap * points = FindClosestBoundaryPointsToVector(x, LC);
    31723447  if (points == NULL) {
    3173     eLog() << Verbose(1) << "There is no nearest point: too far away from the surface." << endl;
     3448    DoeLog(1) && (eLog() << Verbose(1) << "There is no nearest point: too far away from the surface." << endl);
    31743449    return NULL;
    31753450  }
    31763451
    31773452  // for each point, check its lines, remember closest
    3178   Log() << Verbose(1) << "Finding closest BoundaryLine to " << *x << " ... " << endl;
     3453  DoLog(1) && (Log() << Verbose(1) << "Finding closest BoundaryLine to " << *x << " ... " << endl);
    31793454  BoundaryLineSet *ClosestLine = NULL;
    31803455  double MinDistance = -1.;
     
    32043479        helper.SubtractVector(&Center);
    32053480        const double lengthB = helper.ScalarProduct(&BaseLine);
    3206         if (lengthB*lengthA < 0) { // if have different sign
     3481        if (lengthB * lengthA < 0) { // if have different sign
    32073482          ClosestLine = LineRunner->second;
    32083483          MinDistance = distance;
    3209           Log() << Verbose(1) << "ACCEPT: New closest line is " << *ClosestLine << " with projected distance " << MinDistance << "." << endl;
     3484          DoLog(1) && (Log() << Verbose(1) << "ACCEPT: New closest line is " << *ClosestLine << " with projected distance " << MinDistance << "." << endl);
    32103485        } else {
    3211           Log() << Verbose(1) << "REJECT: Intersection is outside of the line section: " << lengthA << " and " << lengthB << "." << endl;
     3486          DoLog(1) && (Log() << Verbose(1) << "REJECT: Intersection is outside of the line section: " << lengthA << " and " << lengthB << "." << endl);
    32123487        }
    32133488      } else {
    3214         Log() << Verbose(1) << "REJECT: Point is too further away than present line: " << distance << " >> " << MinDistance << "." << endl;
     3489        DoLog(1) && (Log() << Verbose(1) << "REJECT: Point is too further away than present line: " << distance << " >> " << MinDistance << "." << endl);
    32153490      }
    32163491    }
    32173492  }
    3218   delete(points);
     3493  delete (points);
    32193494  // check whether closest line is "too close" :), then it's inside
    32203495  if (ClosestLine == NULL) {
    3221     Log() << Verbose(0) << "Is the only point, no one else is closeby." << endl;
     3496    DoLog(0) && (Log() << Verbose(0) << "Is the only point, no one else is closeby." << endl);
    32223497    return NULL;
    32233498  }
    32243499  return ClosestLine;
    3225 };
     3500}
     3501;
    32263502
    32273503/** Finds the triangle that is closest to a given Vector \a *x.
     
    32323508TriangleList * Tesselation::FindClosestTrianglesToVector(const Vector *x, const LinkedCell* LC) const
    32333509{
    3234         Info FunctionInfo(__func__);
    3235 
    3236         // get closest points
    3237         DistanceToPointMap * points = FindClosestBoundaryPointsToVector(x,LC);
     3510  Info FunctionInfo(__func__);
     3511  // get closest points
     3512  DistanceToPointMap * points = FindClosestBoundaryPointsToVector(x, LC);
    32383513  if (points == NULL) {
    3239     eLog() << Verbose(1) << "There is no nearest point: too far away from the surface." << endl;
     3514    DoeLog(1) && (eLog() << Verbose(1) << "There is no nearest point: too far away from the surface." << endl);
    32403515    return NULL;
    32413516  }
    32423517
    32433518  // for each point, check its lines, remember closest
    3244   Log() << Verbose(1) << "Finding closest BoundaryTriangle to " << *x << " ... " << endl;
     3519  DoLog(1) && (Log() << Verbose(1) << "Finding closest BoundaryTriangle to " << *x << " ... " << endl);
    32453520  LineSet ClosestLines;
    32463521  double MinDistance = 1e+16;
     
    32643539      const double lengthEndB = BaseLineIntersection.NormSquared();
    32653540
    3266       if ((lengthEndA > lengthBase) || (lengthEndB > lengthBase) || ((lengthEndA < MYEPSILON) || (lengthEndB < MYEPSILON))) {  // intersection would be outside, take closer endpoint
     3541      if ((lengthEndA > lengthBase) || (lengthEndB > lengthBase) || ((lengthEndA < MYEPSILON) || (lengthEndB < MYEPSILON))) { // intersection would be outside, take closer endpoint
    32673542        const double lengthEnd = Min(lengthEndA, lengthEndB);
    32683543        if (lengthEnd - MinDistance < -MYEPSILON) { // new best line
     
    32703545          ClosestLines.insert(LineRunner->second);
    32713546          MinDistance = lengthEnd;
    3272           Log() << Verbose(1) << "ACCEPT: Line " << *LineRunner->second << " to endpoint " << *LineRunner->second->endpoints[0]->node << " is closer with " << lengthEnd << "." << endl;
    3273         } else if  (fabs(lengthEnd - MinDistance) < MYEPSILON) { // additional best candidate
     3547          DoLog(1) && (Log() << Verbose(1) << "ACCEPT: Line " << *LineRunner->second << " to endpoint " << *LineRunner->second->endpoints[0]->node << " is closer with " << lengthEnd << "." << endl);
     3548        } else if (fabs(lengthEnd - MinDistance) < MYEPSILON) { // additional best candidate
    32743549          ClosestLines.insert(LineRunner->second);
    3275           Log() << Verbose(1) << "ACCEPT: Line " << *LineRunner->second << " to endpoint " << *LineRunner->second->endpoints[1]->node << " is equally good with " << lengthEnd << "." << endl;
     3550          DoLog(1) && (Log() << Verbose(1) << "ACCEPT: Line " << *LineRunner->second << " to endpoint " << *LineRunner->second->endpoints[1]->node << " is equally good with " << lengthEnd << "." << endl);
    32763551        } else { // line is worse
    3277           Log() << Verbose(1) << "REJECT: Line " << *LineRunner->second << " to either endpoints is further away than present closest line candidate: " << lengthEndA << ", " << lengthEndB << ", and distance is longer than baseline:" << lengthBase << "." << endl;
     3552          DoLog(1) && (Log() << Verbose(1) << "REJECT: Line " << *LineRunner->second << " to either endpoints is further away than present closest line candidate: " << lengthEndA << ", " << lengthEndB << ", and distance is longer than baseline:" << lengthBase << "." << endl);
    32783553        }
    32793554      } else { // intersection is closer, calculate
     
    32863561        const double distance = BaseLineIntersection.NormSquared();
    32873562        if (Center.NormSquared() > BaseLine.NormSquared()) {
    3288           eLog() << Verbose(0) << "Algorithmic error: In second case we have intersection outside of baseline!" << endl;
     3563          DoeLog(0) && (eLog() << Verbose(0) << "Algorithmic error: In second case we have intersection outside of baseline!" << endl);
    32893564        }
    32903565        if ((ClosestLines.empty()) || (distance < MinDistance)) {
    32913566          ClosestLines.insert(LineRunner->second);
    32923567          MinDistance = distance;
    3293           Log() << Verbose(1) << "ACCEPT: Intersection in between endpoints, new closest line " << *LineRunner->second << " is " << *ClosestLines.begin() << " with projected distance " << MinDistance << "." << endl;
     3568          DoLog(1) && (Log() << Verbose(1) << "ACCEPT: Intersection in between endpoints, new closest line " << *LineRunner->second << " is " << *ClosestLines.begin() << " with projected distance " << MinDistance << "." << endl);
    32943569        } else {
    3295           Log() << Verbose(2) << "REJECT: Point is further away from line " << *LineRunner->second << " than present closest line: " << distance << " >> " << MinDistance << "." << endl;
     3570          DoLog(2) && (Log() << Verbose(2) << "REJECT: Point is further away from line " << *LineRunner->second << " than present closest line: " << distance << " >> " << MinDistance << "." << endl);
    32963571        }
    32973572      }
    32983573    }
    32993574  }
    3300   delete(points);
     3575  delete (points);
    33013576
    33023577  // check whether closest line is "too close" :), then it's inside
    33033578  if (ClosestLines.empty()) {
    3304     Log() << Verbose(0) << "Is the only point, no one else is closeby." << endl;
     3579    DoLog(0) && (Log() << Verbose(0) << "Is the only point, no one else is closeby." << endl);
    33053580    return NULL;
    33063581  }
     
    33083583  for (LineSet::iterator LineRunner = ClosestLines.begin(); LineRunner != ClosestLines.end(); LineRunner++)
    33093584    for (TriangleMap::iterator Runner = (*LineRunner)->triangles.begin(); Runner != (*LineRunner)->triangles.end(); Runner++) {
    3310     candidates->push_back(Runner->second);
    3311   }
     3585      candidates->push_back(Runner->second);
     3586    }
    33123587  return candidates;
    3313 };
     3588}
     3589;
    33143590
    33153591/** Finds closest triangle to a point.
     
    33223598class BoundaryTriangleSet * Tesselation::FindClosestTriangleToVector(const Vector *x, const LinkedCell* LC) const
    33233599{
    3324         Info FunctionInfo(__func__);
     3600  Info FunctionInfo(__func__);
    33253601  class BoundaryTriangleSet *result = NULL;
    33263602  TriangleList *triangles = FindClosestTrianglesToVector(x, LC);
     
    33333609
    33343610  // go through all and pick the one with the best alignment to x
    3335   double MinAlignment = 2.*M_PI;
     3611  double MinAlignment = 2. * M_PI;
    33363612  for (TriangleList::iterator Runner = triangles->begin(); Runner != triangles->end(); Runner++) {
    33373613    (*Runner)->GetCenter(&Center);
     
    33423618      result = *Runner;
    33433619      MinAlignment = Alignment;
    3344       Log() << Verbose(1) << "ACCEPT: Triangle " << *result << " is better aligned with " << MinAlignment << "." << endl;
     3620      DoLog(1) && (Log() << Verbose(1) << "ACCEPT: Triangle " << *result << " is better aligned with " << MinAlignment << "." << endl);
    33453621    } else {
    3346       Log() << Verbose(1) << "REJECT: Triangle " << *result << " is worse aligned with " << MinAlignment << "." << endl;
    3347     }
    3348   }
    3349   delete(triangles);
     3622      DoLog(1) && (Log() << Verbose(1) << "REJECT: Triangle " << *result << " is worse aligned with " << MinAlignment << "." << endl);
     3623    }
     3624  }
     3625  delete (triangles);
    33503626
    33513627  return result;
    3352 };
     3628}
     3629;
    33533630
    33543631/** Checks whether the provided Vector is within the Tesselation structure.
     
    33623639{
    33633640  Info FunctionInfo(__func__);
    3364   TriangleIntersectionList Intersections(&Point,this,LC);
     3641  TriangleIntersectionList Intersections(&Point, this, LC);
    33653642
    33663643  return Intersections.IsInside();
    3367 };
     3644}
     3645;
    33683646
    33693647/** Returns the distance to the surface given by the tesselation.
     
    33953673
    33963674  if (triangle == NULL) {// is boundary point or only point in point cloud?
    3397     Log() << Verbose(1) << "No triangle given!" << endl;
     3675    DoLog(1) && (Log() << Verbose(1) << "No triangle given!" << endl);
    33983676    return -1.;
    33993677  } else {
    3400     Log() << Verbose(1) << "INFO: Closest triangle found is " << *triangle << " with normal vector " << triangle->NormalVector << "." << endl;
     3678    DoLog(1) && (Log() << Verbose(1) << "INFO: Closest triangle found is " << *triangle << " with normal vector " << triangle->NormalVector << "." << endl);
    34013679  }
    34023680
    34033681  triangle->GetCenter(&Center);
    3404   Log() << Verbose(2) << "INFO: Central point of the triangle is " << Center << "." << endl;
     3682  DoLog(2) && (Log() << Verbose(2) << "INFO: Central point of the triangle is " << Center << "." << endl);
    34053683  DistanceToCenter.CopyVector(&Center);
    34063684  DistanceToCenter.SubtractVector(&Point);
    3407   Log() << Verbose(2) << "INFO: Vector from point to test to center is " << DistanceToCenter << "." << endl;
     3685  DoLog(2) && (Log() << Verbose(2) << "INFO: Vector from point to test to center is " << DistanceToCenter << "." << endl);
    34083686
    34093687  // check whether we are on boundary
     
    34143692    Center.SubtractVector(&triangle->NormalVector); // points towards MolCenter
    34153693    DistanceToCenter.AddVector(&triangle->NormalVector); // points outside
    3416     Log() << Verbose(1) << "INFO: Calling Intersection with " << Center << " and " << DistanceToCenter << "." << endl;
     3694    DoLog(1) && (Log() << Verbose(1) << "INFO: Calling Intersection with " << Center << " and " << DistanceToCenter << "." << endl);
    34173695    if (triangle->GetIntersectionInsideTriangle(&Center, &DistanceToCenter, &Intersection)) {
    3418       Log() << Verbose(1) << Point << " is inner point: sufficiently close to boundary, " << Intersection << "." << endl;
     3696      DoLog(1) && (Log() << Verbose(1) << Point << " is inner point: sufficiently close to boundary, " << Intersection << "." << endl);
    34193697      return 0.;
    34203698    } else {
    3421       Log() << Verbose(1) << Point << " is NOT an inner point: on triangle plane but outside of triangle bounds." << endl;
     3699      DoLog(1) && (Log() << Verbose(1) << Point << " is NOT an inner point: on triangle plane but outside of triangle bounds." << endl);
    34223700      return false;
    34233701    }
     
    34253703    // calculate smallest distance
    34263704    distance = triangle->GetClosestPointInsideTriangle(&Point, &Intersection);
    3427     Log() << Verbose(1) << "Closest point on triangle is " << Intersection << "." << endl;
     3705    DoLog(1) && (Log() << Verbose(1) << "Closest point on triangle is " << Intersection << "." << endl);
    34283706
    34293707    // then check direction to boundary
    34303708    if (DistanceToCenter.ScalarProduct(&triangle->NormalVector) > MYEPSILON) {
    3431       Log() << Verbose(1) << Point << " is an inner point, " << distance << " below surface." << endl;
     3709      DoLog(1) && (Log() << Verbose(1) << Point << " is an inner point, " << distance << " below surface." << endl);
    34323710      return -distance;
    34333711    } else {
    3434       Log() << Verbose(1) << Point << " is NOT an inner point, " << distance << " above surface." << endl;
     3712      DoLog(1) && (Log() << Verbose(1) << Point << " is NOT an inner point, " << distance << " above surface." << endl);
    34353713      return +distance;
    34363714    }
    34373715  }
    3438 };
     3716}
     3717;
    34393718
    34403719/** Calculates minimum distance from \a&Point to a tesselated surface.
     
    34473726{
    34483727  Info FunctionInfo(__func__);
    3449   TriangleIntersectionList Intersections(&Point,this,LC);
     3728  TriangleIntersectionList Intersections(&Point, this, LC);
    34503729
    34513730  return Intersections.GetSmallestDistance();
    3452 };
     3731}
     3732;
    34533733
    34543734/** Calculates minimum distance from \a&Point to a tesselated surface.
     
    34613741{
    34623742  Info FunctionInfo(__func__);
    3463   TriangleIntersectionList Intersections(&Point,this,LC);
     3743  TriangleIntersectionList Intersections(&Point, this, LC);
    34643744
    34653745  return Intersections.GetClosestTriangle();
    3466 };
     3746}
     3747;
    34673748
    34683749/** Gets all points connected to the provided point by triangulation lines.
     
    34743755TesselPointSet * Tesselation::GetAllConnectedPoints(const TesselPoint* const Point) const
    34753756{
    3476         Info FunctionInfo(__func__);
    3477         TesselPointSet *connectedPoints = new TesselPointSet;
     3757  Info FunctionInfo(__func__);
     3758  TesselPointSet *connectedPoints = new TesselPointSet;
    34783759  class BoundaryPointSet *ReferencePoint = NULL;
    34793760  TesselPoint* current;
    34803761  bool takePoint = false;
    3481 
    34823762  // find the respective boundary point
    34833763  PointMap::const_iterator PointRunner = PointsOnBoundary.find(Point->nr);
     
    34853765    ReferencePoint = PointRunner->second;
    34863766  } else {
    3487     eLog() << Verbose(2) << "GetAllConnectedPoints() could not find the BoundaryPoint belonging to " << *Point << "." << endl;
     3767    DoeLog(2) && (eLog() << Verbose(2) << "GetAllConnectedPoints() could not find the BoundaryPoint belonging to " << *Point << "." << endl);
    34883768    ReferencePoint = NULL;
    34893769  }
     
    34913771  // little trick so that we look just through lines connect to the BoundaryPoint
    34923772  // OR fall-back to look through all lines if there is no such BoundaryPoint
    3493   const LineMap *Lines;;
     3773  const LineMap *Lines;
     3774  ;
    34943775  if (ReferencePoint != NULL)
    34953776    Lines = &(ReferencePoint->lines);
     
    34983779  LineMap::const_iterator findLines = Lines->begin();
    34993780  while (findLines != Lines->end()) {
    3500    takePoint = false;
    3501 
    3502    if (findLines->second->endpoints[0]->Nr == Point->nr) {
    3503      takePoint = true;
    3504      current = findLines->second->endpoints[1]->node;
    3505    } else if (findLines->second->endpoints[1]->Nr == Point->nr) {
    3506      takePoint = true;
    3507      current = findLines->second->endpoints[0]->node;
    3508    }
    3509 
    3510    if (takePoint) {
    3511      Log() << Verbose(1) << "INFO: Endpoint " << *current << " of line " << *(findLines->second) << " is enlisted." << endl;
    3512      connectedPoints->insert(current);
    3513    }
    3514 
    3515    findLines++;
     3781    takePoint = false;
     3782
     3783    if (findLines->second->endpoints[0]->Nr == Point->nr) {
     3784      takePoint = true;
     3785      current = findLines->second->endpoints[1]->node;
     3786    } else if (findLines->second->endpoints[1]->Nr == Point->nr) {
     3787      takePoint = true;
     3788      current = findLines->second->endpoints[0]->node;
     3789    }
     3790
     3791    if (takePoint) {
     3792      DoLog(1) && (Log() << Verbose(1) << "INFO: Endpoint " << *current << " of line " << *(findLines->second) << " is enlisted." << endl);
     3793      connectedPoints->insert(current);
     3794    }
     3795
     3796    findLines++;
    35163797  }
    35173798
    35183799  if (connectedPoints->empty()) { // if have not found any points
    3519     eLog() << Verbose(1) << "We have not found any connected points to " << *Point<< "." << endl;
     3800    DoeLog(1) && (eLog() << Verbose(1) << "We have not found any connected points to " << *Point << "." << endl);
    35203801    return NULL;
    35213802  }
    35223803
    35233804  return connectedPoints;
    3524 };
    3525 
     3805}
     3806;
    35263807
    35273808/** Gets all points connected to the provided point by triangulation lines, ordered such that we have the circle round the point.
     
    35393820TesselPointList * Tesselation::GetCircleOfConnectedTriangles(TesselPointSet *SetOfNeighbours, const TesselPoint* const Point, const Vector * const Reference) const
    35403821{
    3541         Info FunctionInfo(__func__);
     3822  Info FunctionInfo(__func__);
    35423823  map<double, TesselPoint*> anglesOfPoints;
    35433824  TesselPointList *connectedCircle = new TesselPointList;
     
    35463827  Vector OrthogonalVector;
    35473828  Vector helper;
    3548   const TesselPoint * const TrianglePoints[3] = {Point, NULL, NULL};
     3829  const TesselPoint * const TrianglePoints[3] = { Point, NULL, NULL };
    35493830  TriangleList *triangles = NULL;
    35503831
    35513832  if (SetOfNeighbours == NULL) {
    3552     eLog() << Verbose(2) << "Could not find any connected points!" << endl;
    3553     delete(connectedCircle);
     3833    DoeLog(2) && (eLog() << Verbose(2) << "Could not find any connected points!" << endl);
     3834    delete (connectedCircle);
    35543835    return NULL;
    35553836  }
     
    35613842      PlaneNormal.AddVector(&(*Runner)->NormalVector);
    35623843  } else {
    3563     eLog() << Verbose(0) << "Could not find any triangles for point " << *Point << "." << endl;
     3844    DoeLog(0) && (eLog() << Verbose(0) << "Could not find any triangles for point " << *Point << "." << endl);
    35643845    performCriticalExit();
    35653846  }
    3566   PlaneNormal.Scale(1.0/triangles->size());
    3567   Log() << Verbose(1) << "INFO: Calculated PlaneNormal of all circle points is " << PlaneNormal << "." << endl;
     3847  PlaneNormal.Scale(1.0 / triangles->size());
     3848  DoLog(1) && (Log() << Verbose(1) << "INFO: Calculated PlaneNormal of all circle points is " << PlaneNormal << "." << endl);
    35683849  PlaneNormal.Normalize();
    35693850
     
    35743855    AngleZero.ProjectOntoPlane(&PlaneNormal);
    35753856  }
    3576   if ((Reference == NULL) || (AngleZero.NormSquared() < MYEPSILON )) {
    3577     Log() << Verbose(1) << "Using alternatively " << *(*SetOfNeighbours->begin())->node << " as angle 0 referencer." << endl;
     3857  if ((Reference == NULL) || (AngleZero.NormSquared() < MYEPSILON)) {
     3858    DoLog(1) && (Log() << Verbose(1) << "Using alternatively " << *(*SetOfNeighbours->begin())->node << " as angle 0 referencer." << endl);
    35783859    AngleZero.CopyVector((*SetOfNeighbours->begin())->node);
    35793860    AngleZero.SubtractVector(Point->node);
    35803861    AngleZero.ProjectOntoPlane(&PlaneNormal);
    35813862    if (AngleZero.NormSquared() < MYEPSILON) {
    3582       eLog() << Verbose(0) << "CRITIAL: AngleZero is 0 even with alternative reference. The algorithm has to be changed here!" << endl;
     3863      DoeLog(0) && (eLog() << Verbose(0) << "CRITIAL: AngleZero is 0 even with alternative reference. The algorithm has to be changed here!" << endl);
    35833864      performCriticalExit();
    35843865    }
    35853866  }
    3586   Log() << Verbose(1) << "INFO: Reference vector on this plane representing angle 0 is " << AngleZero << "." << endl;
     3867  DoLog(1) && (Log() << Verbose(1) << "INFO: Reference vector on this plane representing angle 0 is " << AngleZero << "." << endl);
    35873868  if (AngleZero.NormSquared() > MYEPSILON)
    35883869    OrthogonalVector.MakeNormalVector(&PlaneNormal, &AngleZero);
    35893870  else
    35903871    OrthogonalVector.MakeNormalVector(&PlaneNormal);
    3591   Log() << Verbose(1) << "INFO: OrthogonalVector on plane is " << OrthogonalVector << "." << endl;
     3872  DoLog(1) && (Log() << Verbose(1) << "INFO: OrthogonalVector on plane is " << OrthogonalVector << "." << endl);
    35923873
    35933874  // go through all connected points and calculate angle
     
    35973878    helper.ProjectOntoPlane(&PlaneNormal);
    35983879    double angle = GetAngle(helper, AngleZero, OrthogonalVector);
    3599     Log() << Verbose(0) << "INFO: Calculated angle is " << angle << " for point " << **listRunner << "." << endl;
    3600     anglesOfPoints.insert(pair<double, TesselPoint*>(angle, (*listRunner)));
    3601   }
    3602 
    3603   for(map<double, TesselPoint*>::iterator AngleRunner = anglesOfPoints.begin(); AngleRunner != anglesOfPoints.end(); AngleRunner++) {
     3880    DoLog(0) && (Log() << Verbose(0) << "INFO: Calculated angle is " << angle << " for point " << **listRunner << "." << endl);
     3881    anglesOfPoints.insert(pair<double, TesselPoint*> (angle, (*listRunner)));
     3882  }
     3883
     3884  for (map<double, TesselPoint*>::iterator AngleRunner = anglesOfPoints.begin(); AngleRunner != anglesOfPoints.end(); AngleRunner++) {
    36043885    connectedCircle->push_back(AngleRunner->second);
    36053886  }
     
    36313912
    36323913  if (SetOfNeighbours == NULL) {
    3633     eLog() << Verbose(2) << "Could not find any connected points!" << endl;
    3634     delete(connectedCircle);
     3914    DoeLog(2) && (eLog() << Verbose(2) << "Could not find any connected points!" << endl);
     3915    delete (connectedCircle);
    36353916    return NULL;
    36363917  }
     
    36433924  }
    36443925
    3645   Log() << Verbose(1) << "INFO: Point is " << *Point << " and Reference is " << *Reference << "." << endl;
     3926  DoLog(1) && (Log() << Verbose(1) << "INFO: Point is " << *Point << " and Reference is " << *Reference << "." << endl);
    36463927  // calculate central point
    3647 
    36483928  TesselPointSet::const_iterator TesselA = SetOfNeighbours->begin();
    36493929  TesselPointSet::const_iterator TesselB = SetOfNeighbours->begin();
     
    36553935  while (TesselC != SetOfNeighbours->end()) {
    36563936    helper.MakeNormalVector((*TesselA)->node, (*TesselB)->node, (*TesselC)->node);
    3657     Log() << Verbose(0) << "Making normal vector out of " << *(*TesselA) << ", " << *(*TesselB) << " and " << *(*TesselC) << ":" << helper << endl;
     3937    DoLog(0) && (Log() << Verbose(0) << "Making normal vector out of " << *(*TesselA) << ", " << *(*TesselB) << " and " << *(*TesselC) << ":" << helper << endl);
    36583938    counter++;
    36593939    TesselA++;
     
    36643944  //Log() << Verbose(0) << "Summed vectors " << center << "; number of points " << connectedPoints.size()
    36653945  //  << "; scale factor " << counter;
    3666   PlaneNormal.Scale(1.0/(double)counter);
    3667 //  Log() << Verbose(1) << "INFO: Calculated center of all circle points is " << center << "." << endl;
    3668 //
    3669 //  // projection plane of the circle is at the closes Point and normal is pointing away from center of all circle points
    3670 //  PlaneNormal.CopyVector(Point->node);
    3671 //  PlaneNormal.SubtractVector(&center);
    3672 //  PlaneNormal.Normalize();
    3673   Log() << Verbose(1) << "INFO: Calculated plane normal of circle is " << PlaneNormal << "." << endl;
     3946  PlaneNormal.Scale(1.0 / (double) counter);
     3947  //  Log() << Verbose(1) << "INFO: Calculated center of all circle points is " << center << "." << endl;
     3948  //
     3949  //  // projection plane of the circle is at the closes Point and normal is pointing away from center of all circle points
     3950  //  PlaneNormal.CopyVector(Point->node);
     3951  //  PlaneNormal.SubtractVector(&center);
     3952  //  PlaneNormal.Normalize();
     3953  DoLog(1) && (Log() << Verbose(1) << "INFO: Calculated plane normal of circle is " << PlaneNormal << "." << endl);
    36743954
    36753955  // construct one orthogonal vector
     
    36793959    AngleZero.ProjectOntoPlane(&PlaneNormal);
    36803960  }
    3681   if ((Reference == NULL) || (AngleZero.NormSquared() < MYEPSILON )) {
    3682     Log() << Verbose(1) << "Using alternatively " << *(*SetOfNeighbours->begin())->node << " as angle 0 referencer." << endl;
     3961  if ((Reference == NULL) || (AngleZero.NormSquared() < MYEPSILON)) {
     3962    DoLog(1) && (Log() << Verbose(1) << "Using alternatively " << *(*SetOfNeighbours->begin())->node << " as angle 0 referencer." << endl);
    36833963    AngleZero.CopyVector((*SetOfNeighbours->begin())->node);
    36843964    AngleZero.SubtractVector(Point->node);
    36853965    AngleZero.ProjectOntoPlane(&PlaneNormal);
    36863966    if (AngleZero.NormSquared() < MYEPSILON) {
    3687       eLog() << Verbose(0) << "CRITIAL: AngleZero is 0 even with alternative reference. The algorithm has to be changed here!" << endl;
     3967      DoeLog(0) && (eLog() << Verbose(0) << "CRITIAL: AngleZero is 0 even with alternative reference. The algorithm has to be changed here!" << endl);
    36883968      performCriticalExit();
    36893969    }
    36903970  }
    3691   Log() << Verbose(1) << "INFO: Reference vector on this plane representing angle 0 is " << AngleZero << "." << endl;
     3971  DoLog(1) && (Log() << Verbose(1) << "INFO: Reference vector on this plane representing angle 0 is " << AngleZero << "." << endl);
    36923972  if (AngleZero.NormSquared() > MYEPSILON)
    36933973    OrthogonalVector.MakeNormalVector(&PlaneNormal, &AngleZero);
    36943974  else
    36953975    OrthogonalVector.MakeNormalVector(&PlaneNormal);
    3696   Log() << Verbose(1) << "INFO: OrthogonalVector on plane is " << OrthogonalVector << "." << endl;
     3976  DoLog(1) && (Log() << Verbose(1) << "INFO: OrthogonalVector on plane is " << OrthogonalVector << "." << endl);
    36973977
    36983978  // go through all connected points and calculate angle
    3699   pair <map<double, TesselPoint*>::iterator, bool > InserterTest;
     3979  pair<map<double, TesselPoint*>::iterator, bool> InserterTest;
    37003980  for (TesselPointSet::iterator listRunner = SetOfNeighbours->begin(); listRunner != SetOfNeighbours->end(); listRunner++) {
    37013981    helper.CopyVector((*listRunner)->node);
     
    37043984    double angle = GetAngle(helper, AngleZero, OrthogonalVector);
    37053985    if (angle > M_PI) // the correction is of no use here (and not desired)
    3706       angle = 2.*M_PI - angle;
    3707     Log() << Verbose(0) << "INFO: Calculated angle between " << helper << " and " << AngleZero << " is " << angle << " for point " << **listRunner << "." << endl;
    3708     InserterTest = anglesOfPoints.insert(pair<double, TesselPoint*>(angle, (*listRunner)));
     3986      angle = 2. * M_PI - angle;
     3987    DoLog(0) && (Log() << Verbose(0) << "INFO: Calculated angle between " << helper << " and " << AngleZero << " is " << angle << " for point " << **listRunner << "." << endl);
     3988    InserterTest = anglesOfPoints.insert(pair<double, TesselPoint*> (angle, (*listRunner)));
    37093989    if (!InserterTest.second) {
    3710       eLog() << Verbose(0) << "GetCircleOfSetOfPoints() got two atoms with same angle: " << *((InserterTest.first)->second) << " and " << (*listRunner) << endl;
     3990      DoeLog(0) && (eLog() << Verbose(0) << "GetCircleOfSetOfPoints() got two atoms with same angle: " << *((InserterTest.first)->second) << " and " << (*listRunner) << endl);
    37113991      performCriticalExit();
    37123992    }
    37133993  }
    37143994
    3715   for(map<double, TesselPoint*>::iterator AngleRunner = anglesOfPoints.begin(); AngleRunner != anglesOfPoints.end(); AngleRunner++) {
     3995  for (map<double, TesselPoint*>::iterator AngleRunner = anglesOfPoints.begin(); AngleRunner != anglesOfPoints.end(); AngleRunner++) {
    37163996    connectedCircle->push_back(AngleRunner->second);
    37173997  }
     
    37284008ListOfTesselPointList * Tesselation::GetPathsOfConnectedPoints(const TesselPoint* const Point) const
    37294009{
    3730         Info FunctionInfo(__func__);
     4010  Info FunctionInfo(__func__);
    37314011  map<double, TesselPoint*> anglesOfPoints;
    3732   list< TesselPointList *> *ListOfPaths = new list< TesselPointList *>;
     4012  list<TesselPointList *> *ListOfPaths = new list<TesselPointList *> ;
    37334013  TesselPointList *connectedPath = NULL;
    37344014  Vector center;
     
    37424022  class BoundaryLineSet *CurrentLine = NULL;
    37434023  class BoundaryLineSet *StartLine = NULL;
    3744 
    37454024  // find the respective boundary point
    37464025  PointMap::const_iterator PointRunner = PointsOnBoundary.find(Point->nr);
     
    37484027    ReferencePoint = PointRunner->second;
    37494028  } else {
    3750     eLog() << Verbose(1) << "GetPathOfConnectedPoints() could not find the BoundaryPoint belonging to " << *Point << "." << endl;
     4029    DoeLog(1) && (eLog() << Verbose(1) << "GetPathOfConnectedPoints() could not find the BoundaryPoint belonging to " << *Point << "." << endl);
    37514030    return NULL;
    37524031  }
    37534032
    3754   map <class BoundaryLineSet *, bool> TouchedLine;
    3755   map <class BoundaryTriangleSet *, bool> TouchedTriangle;
    3756   map <class BoundaryLineSet *, bool>::iterator LineRunner;
    3757   map <class BoundaryTriangleSet *, bool>::iterator TriangleRunner;
     4033  map<class BoundaryLineSet *, bool> TouchedLine;
     4034  map<class BoundaryTriangleSet *, bool> TouchedTriangle;
     4035  map<class BoundaryLineSet *, bool>::iterator LineRunner;
     4036  map<class BoundaryTriangleSet *, bool>::iterator TriangleRunner;
    37584037  for (LineMap::iterator Runner = ReferencePoint->lines.begin(); Runner != ReferencePoint->lines.end(); Runner++) {
    3759     TouchedLine.insert( pair <class BoundaryLineSet *, bool>(Runner->second, false) );
     4038    TouchedLine.insert(pair<class BoundaryLineSet *, bool> (Runner->second, false));
    37604039    for (TriangleMap::iterator Sprinter = Runner->second->triangles.begin(); Sprinter != Runner->second->triangles.end(); Sprinter++)
    3761       TouchedTriangle.insert( pair <class BoundaryTriangleSet *, bool>(Sprinter->second, false) );
     4040      TouchedTriangle.insert(pair<class BoundaryTriangleSet *, bool> (Sprinter->second, false));
    37624041  }
    37634042  if (!ReferencePoint->lines.empty()) {
     
    37654044      LineRunner = TouchedLine.find(runner->second);
    37664045      if (LineRunner == TouchedLine.end()) {
    3767         eLog() << Verbose(1) << "I could not find " << *runner->second << " in the touched list." << endl;
     4046        DoeLog(1) && (eLog() << Verbose(1) << "I could not find " << *runner->second << " in the touched list." << endl);
    37684047      } else if (!LineRunner->second) {
    37694048        LineRunner->second = true;
     
    37734052        StartLine = CurrentLine;
    37744053        CurrentPoint = CurrentLine->GetOtherEndpoint(ReferencePoint);
    3775         Log() << Verbose(1)<< "INFO: Beginning path retrieval at " << *CurrentPoint << " of line " << *CurrentLine << "." << endl;
     4054        DoLog(1) && (Log() << Verbose(1) << "INFO: Beginning path retrieval at " << *CurrentPoint << " of line " << *CurrentLine << "." << endl);
    37764055        do {
    37774056          // push current one
    3778           Log() << Verbose(1) << "INFO: Putting " << *CurrentPoint << " at end of path." << endl;
     4057          DoLog(1) && (Log() << Verbose(1) << "INFO: Putting " << *CurrentPoint << " at end of path." << endl);
    37794058          connectedPath->push_back(CurrentPoint->node);
    37804059
    37814060          // find next triangle
    37824061          for (TriangleMap::iterator Runner = CurrentLine->triangles.begin(); Runner != CurrentLine->triangles.end(); Runner++) {
    3783             Log() << Verbose(1) << "INFO: Inspecting triangle " << *Runner->second << "." << endl;
     4062            DoLog(1) && (Log() << Verbose(1) << "INFO: Inspecting triangle " << *Runner->second << "." << endl);
    37844063            if ((Runner->second != triangle)) { // look for first triangle not equal to old one
    37854064              triangle = Runner->second;
     
    37884067                if (!TriangleRunner->second) {
    37894068                  TriangleRunner->second = true;
    3790                   Log() << Verbose(1) << "INFO: Connecting triangle is " << *triangle << "." << endl;
     4069                  DoLog(1) && (Log() << Verbose(1) << "INFO: Connecting triangle is " << *triangle << "." << endl);
    37914070                  break;
    37924071                } else {
    3793                   Log() << Verbose(1) << "INFO: Skipping " << *triangle << ", as we have already visited it." << endl;
     4072                  DoLog(1) && (Log() << Verbose(1) << "INFO: Skipping " << *triangle << ", as we have already visited it." << endl);
    37944073                  triangle = NULL;
    37954074                }
    37964075              } else {
    3797                 eLog() << Verbose(1) << "I could not find " << *triangle << " in the touched list." << endl;
     4076                DoeLog(1) && (eLog() << Verbose(1) << "I could not find " << *triangle << " in the touched list." << endl);
    37984077                triangle = NULL;
    37994078              }
     
    38034082            break;
    38044083          // find next line
    3805           for (int i=0;i<3;i++) {
     4084          for (int i = 0; i < 3; i++) {
    38064085            if ((triangle->lines[i] != CurrentLine) && (triangle->lines[i]->ContainsBoundaryPoint(ReferencePoint))) { // not the current line and still containing Point
    38074086              CurrentLine = triangle->lines[i];
    3808               Log() << Verbose(1) << "INFO: Connecting line is " << *CurrentLine << "." << endl;
     4087              DoLog(1) && (Log() << Verbose(1) << "INFO: Connecting line is " << *CurrentLine << "." << endl);
    38094088              break;
    38104089            }
     
    38124091          LineRunner = TouchedLine.find(CurrentLine);
    38134092          if (LineRunner == TouchedLine.end())
    3814             eLog() << Verbose(1) << "I could not find " << *CurrentLine << " in the touched list." << endl;
     4093            DoeLog(1) && (eLog() << Verbose(1) << "I could not find " << *CurrentLine << " in the touched list." << endl);
    38154094          else
    38164095            LineRunner->second = true;
     
    38204099        } while (CurrentLine != StartLine);
    38214100        // last point is missing, as it's on start line
    3822         Log() << Verbose(1) << "INFO: Putting " << *CurrentPoint << " at end of path." << endl;
     4101        DoLog(1) && (Log() << Verbose(1) << "INFO: Putting " << *CurrentPoint << " at end of path." << endl);
    38234102        if (StartLine->GetOtherEndpoint(ReferencePoint)->node != connectedPath->back())
    38244103          connectedPath->push_back(StartLine->GetOtherEndpoint(ReferencePoint)->node);
     
    38264105        ListOfPaths->push_back(connectedPath);
    38274106      } else {
    3828         Log() << Verbose(1) << "INFO: Skipping " << *runner->second << ", as we have already visited it." << endl;
     4107        DoLog(1) && (Log() << Verbose(1) << "INFO: Skipping " << *runner->second << ", as we have already visited it." << endl);
    38294108      }
    38304109    }
    38314110  } else {
    3832     eLog() << Verbose(1) << "There are no lines attached to " << *ReferencePoint << "." << endl;
     4111    DoeLog(1) && (eLog() << Verbose(1) << "There are no lines attached to " << *ReferencePoint << "." << endl);
    38334112  }
    38344113
     
    38444123ListOfTesselPointList * Tesselation::GetClosedPathsOfConnectedPoints(const TesselPoint* const Point) const
    38454124{
    3846         Info FunctionInfo(__func__);
     4125  Info FunctionInfo(__func__);
    38474126  list<TesselPointList *> *ListofPaths = GetPathsOfConnectedPoints(Point);
    3848   list<TesselPointList *> *ListofClosedPaths = new list<TesselPointList *>;
     4127  list<TesselPointList *> *ListofClosedPaths = new list<TesselPointList *> ;
    38494128  TesselPointList *connectedPath = NULL;
    38504129  TesselPointList *newPath = NULL;
    38514130  int count = 0;
    3852 
    3853 
    38544131  TesselPointList::iterator CircleRunner;
    38554132  TesselPointList::iterator CircleStart;
    38564133
    3857   for(list<TesselPointList *>::iterator ListRunner = ListofPaths->begin(); ListRunner != ListofPaths->end(); ListRunner++) {
     4134  for (list<TesselPointList *>::iterator ListRunner = ListofPaths->begin(); ListRunner != ListofPaths->end(); ListRunner++) {
    38584135    connectedPath = *ListRunner;
    38594136
    3860     Log() << Verbose(1) << "INFO: Current path is " << connectedPath << "." << endl;
     4137    DoLog(1) && (Log() << Verbose(1) << "INFO: Current path is " << connectedPath << "." << endl);
    38614138
    38624139    // go through list, look for reappearance of starting Point and count
    38634140    CircleStart = connectedPath->begin();
    3864 
    38654141    // go through list, look for reappearance of starting Point and create list
    38664142    TesselPointList::iterator Marker = CircleStart;
     
    38684144      if ((*CircleRunner == *CircleStart) && (CircleRunner != CircleStart)) { // is not the very first point
    38694145        // we have a closed circle from Marker to new Marker
    3870         Log() << Verbose(1) << count+1 << ". closed path consists of: ";
     4146        DoLog(1) && (Log() << Verbose(1) << count + 1 << ". closed path consists of: ");
    38714147        newPath = new TesselPointList;
    38724148        TesselPointList::iterator CircleSprinter = Marker;
    38734149        for (; CircleSprinter != CircleRunner; CircleSprinter++) {
    38744150          newPath->push_back(*CircleSprinter);
    3875           Log() << Verbose(0) << (**CircleSprinter) << " <-> ";
     4151          DoLog(0) && (Log() << Verbose(0) << (**CircleSprinter) << " <-> ");
    38764152        }
    3877         Log() << Verbose(0) << ".." << endl;
     4153        DoLog(0) && (Log() << Verbose(0) << ".." << endl);
    38784154        count++;
    38794155        Marker = CircleRunner;
     
    38844160    }
    38854161  }
    3886   Log() << Verbose(1) << "INFO: " << count << " closed additional path(s) have been created." << endl;
     4162  DoLog(1) && (Log() << Verbose(1) << "INFO: " << count << " closed additional path(s) have been created." << endl);
    38874163
    38884164  // delete list of paths
     
    38904166    connectedPath = *(ListofPaths->begin());
    38914167    ListofPaths->remove(connectedPath);
    3892     delete(connectedPath);
    3893   }
    3894   delete(ListofPaths);
     4168    delete (connectedPath);
     4169  }
     4170  delete (ListofPaths);
    38954171
    38964172  // exit
    38974173  return ListofClosedPaths;
    3898 };
    3899 
     4174}
     4175;
    39004176
    39014177/** Gets all belonging triangles for a given BoundaryPointSet.
     
    39064182TriangleSet *Tesselation::GetAllTriangles(const BoundaryPointSet * const Point) const
    39074183{
    3908         Info FunctionInfo(__func__);
    3909         TriangleSet *connectedTriangles = new TriangleSet;
     4184  Info FunctionInfo(__func__);
     4185  TriangleSet *connectedTriangles = new TriangleSet;
    39104186
    39114187  if (Point == NULL) {
    3912     eLog() << Verbose(1) << "Point given is NULL." << endl;
     4188    DoeLog(1) && (eLog() << Verbose(1) << "Point given is NULL." << endl);
    39134189  } else {
    39144190    // go through its lines and insert all triangles
    39154191    for (LineMap::const_iterator LineRunner = Point->lines.begin(); LineRunner != Point->lines.end(); LineRunner++)
    39164192      for (TriangleMap::iterator TriangleRunner = (LineRunner->second)->triangles.begin(); TriangleRunner != (LineRunner->second)->triangles.end(); TriangleRunner++) {
    3917       connectedTriangles->insert(TriangleRunner->second);
    3918     }
     4193        connectedTriangles->insert(TriangleRunner->second);
     4194      }
    39194195  }
    39204196
    39214197  return connectedTriangles;
    3922 };
    3923 
     4198}
     4199;
    39244200
    39254201/** Removes a boundary point from the envelope while keeping it closed.
     
    39344210 * \return volume added to the volume inside the tesselated surface by the removal
    39354211 */
    3936 double Tesselation::RemovePointFromTesselatedSurface(class BoundaryPointSet *point) {
     4212double Tesselation::RemovePointFromTesselatedSurface(class BoundaryPointSet *point)
     4213{
    39374214  class BoundaryLineSet *line = NULL;
    39384215  class BoundaryTriangleSet *triangle = NULL;
     
    39424219
    39434220  if (point == NULL) {
    3944     eLog() << Verbose(1) << "Cannot remove the point " << point << ", it's NULL!" << endl;
     4221    DoeLog(1) && (eLog() << Verbose(1) << "Cannot remove the point " << point << ", it's NULL!" << endl);
    39454222    return 0.;
    39464223  } else
    3947     Log() << Verbose(0) << "Removing point " << *point << " from tesselated boundary ..." << endl;
     4224    DoLog(0) && (Log() << Verbose(0) << "Removing point " << *point << " from tesselated boundary ..." << endl);
    39484225
    39494226  // copy old location for the volume
     
    39524229  // get list of connected points
    39534230  if (point->lines.empty()) {
    3954     eLog() << Verbose(1) << "Cannot remove the point " << *point << ", it's connected to no lines!" << endl;
     4231    DoeLog(1) && (eLog() << Verbose(1) << "Cannot remove the point " << *point << ", it's connected to no lines!" << endl);
    39554232    return 0.;
    39564233  }
     
    39614238  // gather all triangles
    39624239  for (LineMap::iterator LineRunner = point->lines.begin(); LineRunner != point->lines.end(); LineRunner++)
    3963     count+=LineRunner->second->triangles.size();
     4240    count += LineRunner->second->triangles.size();
    39644241  TriangleMap Candidates;
    39654242  for (LineMap::iterator LineRunner = point->lines.begin(); LineRunner != point->lines.end(); LineRunner++) {
     
    39674244    for (TriangleMap::iterator TriangleRunner = line->triangles.begin(); TriangleRunner != line->triangles.end(); TriangleRunner++) {
    39684245      triangle = TriangleRunner->second;
    3969       Candidates.insert( TrianglePair (triangle->Nr, triangle) );
     4246      Candidates.insert(TrianglePair(triangle->Nr, triangle));
    39704247    }
    39714248  }
    39724249
    39734250  // remove all triangles
    3974   count=0;
     4251  count = 0;
    39754252  NormalVector.Zero();
    39764253  for (TriangleMap::iterator Runner = Candidates.begin(); Runner != Candidates.end(); Runner++) {
    3977     Log() << Verbose(1) << "INFO: Removing triangle " << *(Runner->second) << "." << endl;
     4254    DoLog(1) && (Log() << Verbose(1) << "INFO: Removing triangle " << *(Runner->second) << "." << endl);
    39784255    NormalVector.SubtractVector(&Runner->second->NormalVector); // has to point inward
    39794256    RemoveTesselationTriangle(Runner->second);
    39804257    count++;
    39814258  }
    3982   Log() << Verbose(1) << count << " triangles were removed." << endl;
     4259  DoLog(1) && (Log() << Verbose(1) << count << " triangles were removed." << endl);
    39834260
    39844261  list<TesselPointList *>::iterator ListAdvance = ListOfClosedPaths->begin();
     
    39894266  double smallestangle;
    39904267  Vector Point, Reference, OrthogonalVector;
    3991   if (count > 2) {  // less than three triangles, then nothing will be created
     4268  if (count > 2) { // less than three triangles, then nothing will be created
    39924269    class TesselPoint *TriangleCandidates[3];
    39934270    count = 0;
    3994     for ( ; ListRunner != ListOfClosedPaths->end(); ListRunner = ListAdvance) { // go through all closed paths
     4271    for (; ListRunner != ListOfClosedPaths->end(); ListRunner = ListAdvance) { // go through all closed paths
    39954272      if (ListAdvance != ListOfClosedPaths->end())
    39964273        ListAdvance++;
    39974274
    39984275      connectedPath = *ListRunner;
    3999 
    40004276      // re-create all triangles by going through connected points list
    40014277      LineList NewLines;
    4002       for (;!connectedPath->empty();) {
     4278      for (; !connectedPath->empty();) {
    40034279        // search middle node with widest angle to next neighbours
    40044280        EndNode = connectedPath->end();
    40054281        smallestangle = 0.;
    40064282        for (MiddleNode = connectedPath->begin(); MiddleNode != connectedPath->end(); MiddleNode++) {
    4007           Log() << Verbose(1) << "INFO: MiddleNode is " << **MiddleNode << "." << endl;
     4283          DoLog(1) && (Log() << Verbose(1) << "INFO: MiddleNode is " << **MiddleNode << "." << endl);
    40084284          // construct vectors to next and previous neighbour
    40094285          StartNode = MiddleNode;
     
    40264302          angle = GetAngle(Point, Reference, OrthogonalVector);
    40274303          //if (angle < M_PI)  // no wrong-sided triangles, please?
    4028             if(fabs(angle - M_PI) < fabs(smallestangle - M_PI)) { // get straightest angle (i.e. construct those triangles with smallest area first)
    4029               smallestangle = angle;
    4030               EndNode = MiddleNode;
    4031             }
     4304          if (fabs(angle - M_PI) < fabs(smallestangle - M_PI)) { // get straightest angle (i.e. construct those triangles with smallest area first)
     4305            smallestangle = angle;
     4306            EndNode = MiddleNode;
     4307          }
    40324308        }
    40334309        MiddleNode = EndNode;
    40344310        if (MiddleNode == connectedPath->end()) {
    4035           eLog() << Verbose(0) << "CRITICAL: Could not find a smallest angle!" << endl;
     4311          DoeLog(0) && (eLog() << Verbose(0) << "CRITICAL: Could not find a smallest angle!" << endl);
    40364312          performCriticalExit();
    40374313        }
     
    40434319        if (EndNode == connectedPath->end())
    40444320          EndNode = connectedPath->begin();
    4045         Log() << Verbose(2) << "INFO: StartNode is " << **StartNode << "." << endl;
    4046         Log() << Verbose(2) << "INFO: MiddleNode is " << **MiddleNode << "." << endl;
    4047         Log() << Verbose(2) << "INFO: EndNode is " << **EndNode << "." << endl;
    4048         Log() << Verbose(1) << "INFO: Attempting to create triangle " << (*StartNode)->Name << ", " << (*MiddleNode)->Name << " and " << (*EndNode)->Name << "." << endl;
     4321        DoLog(2) && (Log() << Verbose(2) << "INFO: StartNode is " << **StartNode << "." << endl);
     4322        DoLog(2) && (Log() << Verbose(2) << "INFO: MiddleNode is " << **MiddleNode << "." << endl);
     4323        DoLog(2) && (Log() << Verbose(2) << "INFO: EndNode is " << **EndNode << "." << endl);
     4324        DoLog(1) && (Log() << Verbose(1) << "INFO: Attempting to create triangle " << (*StartNode)->Name << ", " << (*MiddleNode)->Name << " and " << (*EndNode)->Name << "." << endl);
    40494325        TriangleCandidates[0] = *StartNode;
    40504326        TriangleCandidates[1] = *MiddleNode;
     
    40524328        triangle = GetPresentTriangle(TriangleCandidates);
    40534329        if (triangle != NULL) {
    4054           eLog() << Verbose(0) << "New triangle already present, skipping!" << endl;
     4330          DoeLog(0) && (eLog() << Verbose(0) << "New triangle already present, skipping!" << endl);
    40554331          StartNode++;
    40564332          MiddleNode++;
     
    40644340          continue;
    40654341        }
    4066         Log() << Verbose(3) << "Adding new triangle points."<< endl;
     4342        DoLog(3) && (Log() << Verbose(3) << "Adding new triangle points." << endl);
    40674343        AddTesselationPoint(*StartNode, 0);
    40684344        AddTesselationPoint(*MiddleNode, 1);
    40694345        AddTesselationPoint(*EndNode, 2);
    4070         Log() << Verbose(3) << "Adding new triangle lines."<< endl;
    4071         AddTesselationLine(TPS[0], TPS[1], 0);
    4072         AddTesselationLine(TPS[0], TPS[2], 1);
     4346        DoLog(3) && (Log() << Verbose(3) << "Adding new triangle lines." << endl);
     4347        AddTesselationLine(NULL, NULL, TPS[0], TPS[1], 0);
     4348        AddTesselationLine(NULL, NULL, TPS[0], TPS[2], 1);
    40734349        NewLines.push_back(BLS[1]);
    4074         AddTesselationLine(TPS[1], TPS[2], 2);
     4350        AddTesselationLine(NULL, NULL, TPS[1], TPS[2], 2);
    40754351        BTS = new class BoundaryTriangleSet(BLS, TrianglesOnBoundaryCount);
    40764352        BTS->GetNormalVector(NormalVector);
     
    40834359        // prepare nodes for next triangle
    40844360        StartNode = EndNode;
    4085         Log() << Verbose(2) << "Removing " << **MiddleNode << " from closed path, remaining points: " << connectedPath->size() << "." << endl;
     4361        DoLog(2) && (Log() << Verbose(2) << "Removing " << **MiddleNode << " from closed path, remaining points: " << connectedPath->size() << "." << endl);
    40864362        connectedPath->remove(*MiddleNode); // remove the middle node (it is surrounded by triangles)
    40874363        if (connectedPath->size() == 2) { // we are done
     
    40904366          break;
    40914367        } else if (connectedPath->size() < 2) { // something's gone wrong!
    4092           eLog() << Verbose(0) << "CRITICAL: There are only two endpoints left!" << endl;
     4368          DoeLog(0) && (eLog() << Verbose(0) << "CRITICAL: There are only two endpoints left!" << endl);
    40934369          performCriticalExit();
    40944370        } else {
     
    41104386        do {
    41114387          maxgain = 0;
    4112           for(LineList::iterator Runner = NewLines.begin(); Runner != NewLines.end(); Runner++) {
     4388          for (LineList::iterator Runner = NewLines.begin(); Runner != NewLines.end(); Runner++) {
    41134389            tmp = PickFarthestofTwoBaselines(*Runner);
    41144390            if (maxgain < tmp) {
     
    41194395          if (maxgain != 0) {
    41204396            volume += maxgain;
    4121             Log() << Verbose(1) << "Flipping baseline with highest volume" << **Candidate << "." << endl;
     4397            DoLog(1) && (Log() << Verbose(1) << "Flipping baseline with highest volume" << **Candidate << "." << endl);
    41224398            OtherBase = FlipBaseline(*Candidate);
    41234399            NewLines.erase(Candidate);
     
    41284404
    41294405      ListOfClosedPaths->remove(connectedPath);
    4130       delete(connectedPath);
    4131     }
    4132     Log() << Verbose(0) << count << " triangles were created." << endl;
     4406      delete (connectedPath);
     4407    }
     4408    DoLog(0) && (Log() << Verbose(0) << count << " triangles were created." << endl);
    41334409  } else {
    41344410    while (!ListOfClosedPaths->empty()) {
     
    41364412      connectedPath = *ListRunner;
    41374413      ListOfClosedPaths->remove(connectedPath);
    4138       delete(connectedPath);
    4139     }
    4140     Log() << Verbose(0) << "No need to create any triangles." << endl;
    4141   }
    4142   delete(ListOfClosedPaths);
    4143 
    4144   Log() << Verbose(0) << "Removed volume is " << volume << "." << endl;
     4414      delete (connectedPath);
     4415    }
     4416    DoLog(0) && (Log() << Verbose(0) << "No need to create any triangles." << endl);
     4417  }
     4418  delete (ListOfClosedPaths);
     4419
     4420  DoLog(0) && (Log() << Verbose(0) << "Removed volume is " << volume << "." << endl);
    41454421
    41464422  return volume;
    4147 };
    4148 
    4149 
     4423}
     4424;
    41504425
    41514426/**
     
    41594434TriangleList *Tesselation::FindTriangles(const TesselPoint* const Points[3]) const
    41604435{
    4161         Info FunctionInfo(__func__);
    4162         TriangleList *result = new TriangleList;
     4436  Info FunctionInfo(__func__);
     4437  TriangleList *result = new TriangleList;
    41634438  LineMap::const_iterator FindLine;
    41644439  TriangleMap::const_iterator FindTriangle;
     
    41844459      for (int i = 0; i < 3; i++) {
    41854460        if (TrianglePoints[i] != NULL) {
    4186           for (int j = i+1; j < 3; j++) {
     4461          for (int j = i + 1; j < 3; j++) {
    41874462            if (TrianglePoints[j] != NULL) {
    41884463              for (FindLine = TrianglePoints[i]->lines.find(TrianglePoints[j]->node->nr); // is a multimap!
    4189                   (FindLine != TrianglePoints[i]->lines.end()) && (FindLine->first == TrianglePoints[j]->node->nr);
    4190                   FindLine++) {
    4191                 for (FindTriangle = FindLine->second->triangles.begin();
    4192                     FindTriangle != FindLine->second->triangles.end();
    4193                     FindTriangle++) {
     4464              (FindLine != TrianglePoints[i]->lines.end()) && (FindLine->first == TrianglePoints[j]->node->nr); FindLine++) {
     4465                for (FindTriangle = FindLine->second->triangles.begin(); FindTriangle != FindLine->second->triangles.end(); FindTriangle++) {
    41944466                  if (FindTriangle->second->IsPresentTupel(TrianglePoints)) {
    41954467                    result->push_back(FindTriangle->second);
     
    42064478    case 1: // copy all triangles of the respective line
    42074479    {
    4208       int i=0;
     4480      int i = 0;
    42094481      for (; i < 3; i++)
    42104482        if (TrianglePoints[i] == NULL)
    42114483          break;
    4212       for (FindLine = TrianglePoints[(i+1)%3]->lines.find(TrianglePoints[(i+2)%3]->node->nr); // is a multimap!
    4213           (FindLine != TrianglePoints[(i+1)%3]->lines.end()) && (FindLine->first == TrianglePoints[(i+2)%3]->node->nr);
    4214           FindLine++) {
    4215         for (FindTriangle = FindLine->second->triangles.begin();
    4216             FindTriangle != FindLine->second->triangles.end();
    4217             FindTriangle++) {
     4484      for (FindLine = TrianglePoints[(i + 1) % 3]->lines.find(TrianglePoints[(i + 2) % 3]->node->nr); // is a multimap!
     4485      (FindLine != TrianglePoints[(i + 1) % 3]->lines.end()) && (FindLine->first == TrianglePoints[(i + 2) % 3]->node->nr); FindLine++) {
     4486        for (FindTriangle = FindLine->second->triangles.begin(); FindTriangle != FindLine->second->triangles.end(); FindTriangle++) {
    42184487          if (FindTriangle->second->IsPresentTupel(TrianglePoints)) {
    42194488            result->push_back(FindTriangle->second);
     
    42254494    case 2: // copy all triangles of the respective point
    42264495    {
    4227       int i=0;
     4496      int i = 0;
    42284497      for (; i < 3; i++)
    42294498        if (TrianglePoints[i] != NULL)
     
    42434512    }
    42444513    default:
    4245       eLog() << Verbose(0) << "Number of wildcards is greater than 3, cannot happen!" << endl;
     4514      DoeLog(0) && (eLog() << Verbose(0) << "Number of wildcards is greater than 3, cannot happen!" << endl);
    42464515      performCriticalExit();
    42474516      break;
     
    42514520}
    42524521
    4253 struct BoundaryLineSetCompare {
    4254   bool operator() (const BoundaryLineSet * const a, const BoundaryLineSet * const b) {
     4522struct BoundaryLineSetCompare
     4523{
     4524  bool operator()(const BoundaryLineSet * const a, const BoundaryLineSet * const b)
     4525  {
    42554526    int lowerNra = -1;
    42564527    int lowerNrb = -1;
     
    42704541    else if (a->endpoints[lowerNra] > b->endpoints[lowerNrb])
    42714542      return false;
    4272     else {  // both lower-numbered endpoints are the same ...
    4273      if (a->endpoints[(lowerNra+1)%2] < b->endpoints[(lowerNrb+1)%2])
    4274        return true;
    4275      else if (a->endpoints[(lowerNra+1)%2] > b->endpoints[(lowerNrb+1)%2])
    4276        return false;
     4543    else { // both lower-numbered endpoints are the same ...
     4544      if (a->endpoints[(lowerNra + 1) % 2] < b->endpoints[(lowerNrb + 1) % 2])
     4545        return true;
     4546      else if (a->endpoints[(lowerNra + 1) % 2] > b->endpoints[(lowerNrb + 1) % 2])
     4547        return false;
    42774548    }
    42784549    return false;
    4279   };
     4550  }
     4551  ;
    42804552};
    42814553
     
    42904562IndexToIndex * Tesselation::FindAllDegeneratedLines()
    42914563{
    4292         Info FunctionInfo(__func__);
    4293         UniqueLines AllLines;
     4564  Info FunctionInfo(__func__);
     4565  UniqueLines AllLines;
    42944566  IndexToIndex * DegeneratedLines = new IndexToIndex;
    42954567
    42964568  // sanity check
    42974569  if (LinesOnBoundary.empty()) {
    4298     eLog() << Verbose(2) << "FindAllDegeneratedTriangles() was called without any tesselation structure.";
     4570    DoeLog(2) && (eLog() << Verbose(2) << "FindAllDegeneratedTriangles() was called without any tesselation structure.");
    42994571    return DegeneratedLines;
    43004572  }
    4301 
    43024573  LineMap::iterator LineRunner1;
    4303   pair< UniqueLines::iterator, bool> tester;
     4574  pair<UniqueLines::iterator, bool> tester;
    43044575  for (LineRunner1 = LinesOnBoundary.begin(); LineRunner1 != LinesOnBoundary.end(); ++LineRunner1) {
    4305     tester = AllLines.insert( LineRunner1->second );
     4576    tester = AllLines.insert(LineRunner1->second);
    43064577    if (!tester.second) { // found degenerated line
    4307       DegeneratedLines->insert ( pair<int, int> (LineRunner1->second->Nr, (*tester.first)->Nr) );
    4308       DegeneratedLines->insert ( pair<int, int> ((*tester.first)->Nr, LineRunner1->second->Nr) );
     4578      DegeneratedLines->insert(pair<int, int> (LineRunner1->second->Nr, (*tester.first)->Nr));
     4579      DegeneratedLines->insert(pair<int, int> ((*tester.first)->Nr, LineRunner1->second->Nr));
    43094580    }
    43104581  }
     
    43124583  AllLines.clear();
    43134584
    4314   Log() << Verbose(0) << "FindAllDegeneratedLines() found " << DegeneratedLines->size() << " lines." << endl;
     4585  DoLog(0) && (Log() << Verbose(0) << "FindAllDegeneratedLines() found " << DegeneratedLines->size() << " lines." << endl);
    43154586  IndexToIndex::iterator it;
    43164587  for (it = DegeneratedLines->begin(); it != DegeneratedLines->end(); it++) {
     
    43184589    const LineMap::const_iterator Line2 = LinesOnBoundary.find((*it).second);
    43194590    if (Line1 != LinesOnBoundary.end() && Line2 != LinesOnBoundary.end())
    4320       Log() << Verbose(0) << *Line1->second << " => " << *Line2->second << endl;
     4591      DoLog(0) && (Log() << Verbose(0) << *Line1->second << " => " << *Line2->second << endl);
    43214592    else
    4322       eLog() << Verbose(1) << "Either " << (*it).first << " or " << (*it).second << " are not in LinesOnBoundary!" << endl;
     4593      DoeLog(1) && (eLog() << Verbose(1) << "Either " << (*it).first << " or " << (*it).second << " are not in LinesOnBoundary!" << endl);
    43234594  }
    43244595
     
    43344605IndexToIndex * Tesselation::FindAllDegeneratedTriangles()
    43354606{
    4336         Info FunctionInfo(__func__);
     4607  Info FunctionInfo(__func__);
    43374608  IndexToIndex * DegeneratedLines = FindAllDegeneratedLines();
    43384609  IndexToIndex * DegeneratedTriangles = new IndexToIndex;
    4339 
    43404610  TriangleMap::iterator TriangleRunner1, TriangleRunner2;
    43414611  LineMap::iterator Liner;
     
    43524622    for (TriangleRunner1 = line1->triangles.begin(); TriangleRunner1 != line1->triangles.end(); ++TriangleRunner1) {
    43534623      for (TriangleRunner2 = line2->triangles.begin(); TriangleRunner2 != line2->triangles.end(); ++TriangleRunner2) {
    4354         if ((TriangleRunner1->second != TriangleRunner2->second)
    4355           && (TriangleRunner1->second->IsPresentTupel(TriangleRunner2->second))) {
    4356           DegeneratedTriangles->insert( pair<int, int> (TriangleRunner1->second->Nr, TriangleRunner2->second->Nr) );
    4357           DegeneratedTriangles->insert( pair<int, int> (TriangleRunner2->second->Nr, TriangleRunner1->second->Nr) );
     4624        if ((TriangleRunner1->second != TriangleRunner2->second) && (TriangleRunner1->second->IsPresentTupel(TriangleRunner2->second))) {
     4625          DegeneratedTriangles->insert(pair<int, int> (TriangleRunner1->second->Nr, TriangleRunner2->second->Nr));
     4626          DegeneratedTriangles->insert(pair<int, int> (TriangleRunner2->second->Nr, TriangleRunner1->second->Nr));
    43584627        }
    43594628      }
    43604629    }
    43614630  }
    4362   delete(DegeneratedLines);
    4363 
    4364   Log() << Verbose(0) << "FindAllDegeneratedTriangles() found " << DegeneratedTriangles->size() << " triangles:" << endl;
     4631  delete (DegeneratedLines);
     4632
     4633  DoLog(0) && (Log() << Verbose(0) << "FindAllDegeneratedTriangles() found " << DegeneratedTriangles->size() << " triangles:" << endl);
    43654634  IndexToIndex::iterator it;
    43664635  for (it = DegeneratedTriangles->begin(); it != DegeneratedTriangles->end(); it++)
    4367       Log() << Verbose(0) << (*it).first << " => " << (*it).second << endl;
     4636    DoLog(0) && (Log() << Verbose(0) << (*it).first << " => " << (*it).second << endl);
    43684637
    43694638  return DegeneratedTriangles;
     
    43764645void Tesselation::RemoveDegeneratedTriangles()
    43774646{
    4378         Info FunctionInfo(__func__);
     4647  Info FunctionInfo(__func__);
    43794648  IndexToIndex * DegeneratedTriangles = FindAllDegeneratedTriangles();
    43804649  TriangleMap::iterator finder;
    43814650  BoundaryTriangleSet *triangle = NULL, *partnerTriangle = NULL;
    4382   int count  = 0;
    4383 
    4384   for (IndexToIndex::iterator TriangleKeyRunner = DegeneratedTriangles->begin();
    4385     TriangleKeyRunner != DegeneratedTriangles->end(); ++TriangleKeyRunner
    4386   ) {
     4651  int count = 0;
     4652
     4653  for (IndexToIndex::iterator TriangleKeyRunner = DegeneratedTriangles->begin(); TriangleKeyRunner != DegeneratedTriangles->end(); ++TriangleKeyRunner) {
    43874654    finder = TrianglesOnBoundary.find(TriangleKeyRunner->first);
    43884655    if (finder != TrianglesOnBoundary.end())
     
    44014668        trianglesShareLine = trianglesShareLine || triangle->lines[i] == partnerTriangle->lines[j];
    44024669
    4403     if (trianglesShareLine
    4404       && (triangle->endpoints[1]->LinesCount > 2)
    4405       && (triangle->endpoints[2]->LinesCount > 2)
    4406       && (triangle->endpoints[0]->LinesCount > 2)
    4407     ) {
     4670    if (trianglesShareLine && (triangle->endpoints[1]->LinesCount > 2) && (triangle->endpoints[2]->LinesCount > 2) && (triangle->endpoints[0]->LinesCount > 2)) {
    44084671      // check whether we have to fix lines
    44094672      BoundaryTriangleSet *Othertriangle = NULL;
     
    44254688            // the line of triangle receives the degenerated ones
    44264689            triangle->lines[i]->triangles.erase(Othertriangle->Nr);
    4427             triangle->lines[i]->triangles.insert( TrianglePair( partnerTriangle->Nr, partnerTriangle) );
    4428             for (int k=0;k<3;k++)
     4690            triangle->lines[i]->triangles.insert(TrianglePair(partnerTriangle->Nr, partnerTriangle));
     4691            for (int k = 0; k < 3; k++)
    44294692              if (triangle->lines[i] == Othertriangle->lines[k]) {
    44304693                Othertriangle->lines[k] = partnerTriangle->lines[j];
     
    44324695              }
    44334696            // the line of partnerTriangle receives the non-degenerated ones
    4434             partnerTriangle->lines[j]->triangles.erase( partnerTriangle->Nr);
    4435             partnerTriangle->lines[j]->triangles.insert( TrianglePair( Othertriangle->Nr, Othertriangle) );
     4697            partnerTriangle->lines[j]->triangles.erase(partnerTriangle->Nr);
     4698            partnerTriangle->lines[j]->triangles.insert(TrianglePair(Othertriangle->Nr, Othertriangle));
    44364699            partnerTriangle->lines[j] = triangle->lines[i];
    44374700          }
     
    44394702      // erase the pair
    44404703      count += (int) DegeneratedTriangles->erase(triangle->Nr);
    4441       Log() << Verbose(0) << "RemoveDegeneratedTriangles() removes triangle " << *triangle << "." << endl;
     4704      DoLog(0) && (Log() << Verbose(0) << "RemoveDegeneratedTriangles() removes triangle " << *triangle << "." << endl);
    44424705      RemoveTesselationTriangle(triangle);
    44434706      count += (int) DegeneratedTriangles->erase(partnerTriangle->Nr);
    4444       Log() << Verbose(0) << "RemoveDegeneratedTriangles() removes triangle " << *partnerTriangle << "." << endl;
     4707      DoLog(0) && (Log() << Verbose(0) << "RemoveDegeneratedTriangles() removes triangle " << *partnerTriangle << "." << endl);
    44454708      RemoveTesselationTriangle(partnerTriangle);
    44464709    } else {
    4447       Log() << Verbose(0) << "RemoveDegeneratedTriangles() does not remove triangle " << *triangle
    4448         << " and its partner " << *partnerTriangle << " because it is essential for at"
    4449         << " least one of the endpoints to be kept in the tesselation structure." << endl;
    4450     }
    4451   }
    4452   delete(DegeneratedTriangles);
     4710      DoLog(0) && (Log() << Verbose(0) << "RemoveDegeneratedTriangles() does not remove triangle " << *triangle << " and its partner " << *partnerTriangle << " because it is essential for at" << " least one of the endpoints to be kept in the tesselation structure." << endl);
     4711    }
     4712  }
     4713  delete (DegeneratedTriangles);
    44534714  if (count > 0)
    44544715    LastTriangle = NULL;
    44554716
    4456   Log() << Verbose(0) << "RemoveDegeneratedTriangles() removed " << count << " triangles:" << endl;
     4717  DoLog(0) && (Log() << Verbose(0) << "RemoveDegeneratedTriangles() removed " << count << " triangles:" << endl);
    44574718}
    44584719
     
    44674728void Tesselation::AddBoundaryPointByDegeneratedTriangle(class TesselPoint *point, LinkedCell *LC)
    44684729{
    4469         Info FunctionInfo(__func__);
     4730  Info FunctionInfo(__func__);
    44704731  // find nearest boundary point
    44714732  class TesselPoint *BackupPoint = NULL;
     
    44804741    NearestBoundaryPoint = PointRunner->second;
    44814742  } else {
    4482     eLog() << Verbose(1) << "I cannot find the boundary point." << endl;
     4743    DoeLog(1) && (eLog() << Verbose(1) << "I cannot find the boundary point." << endl);
    44834744    return;
    44844745  }
    4485   Log() << Verbose(0) << "Nearest point on boundary is " << NearestPoint->Name << "." << endl;
     4746  DoLog(0) && (Log() << Verbose(0) << "Nearest point on boundary is " << NearestPoint->Name << "." << endl);
    44864747
    44874748  // go through its lines and find the best one to split
     
    44984759    CenterToPoint.SubtractVector(point->node);
    44994760    angle = CenterToPoint.Angle(&BaseLine);
    4500     if (fabs(angle - M_PI/2.) < fabs(BestAngle - M_PI/2.)) {
     4761    if (fabs(angle - M_PI / 2.) < fabs(BestAngle - M_PI / 2.)) {
    45014762      BestAngle = angle;
    45024763      BestLine = Runner->second;
     
    45084769  BestLine->triangles.erase(TempTriangle->Nr);
    45094770  int nr = -1;
    4510   for (int i=0;i<3; i++) {
     4771  for (int i = 0; i < 3; i++) {
    45114772    if (TempTriangle->lines[i] == BestLine) {
    45124773      nr = i;
     
    45164777
    45174778  // create new triangle to connect point (connects automatically with the missing spot of the chosen line)
    4518   Log() << Verbose(2) << "Adding new triangle points."<< endl;
     4779  DoLog(2) && (Log() << Verbose(2) << "Adding new triangle points." << endl);
    45194780  AddTesselationPoint((BestLine->endpoints[0]->node), 0);
    45204781  AddTesselationPoint((BestLine->endpoints[1]->node), 1);
    45214782  AddTesselationPoint(point, 2);
    4522   Log() << Verbose(2) << "Adding new triangle lines."<< endl;
    4523   AddTesselationLine(TPS[0], TPS[1], 0);
    4524   AddTesselationLine(TPS[0], TPS[2], 1);
    4525   AddTesselationLine(TPS[1], TPS[2], 2);
     4783  DoLog(2) && (Log() << Verbose(2) << "Adding new triangle lines." << endl);
     4784  AddTesselationLine(NULL, NULL, TPS[0], TPS[1], 0);
     4785  AddTesselationLine(NULL, NULL, TPS[0], TPS[2], 1);
     4786  AddTesselationLine(NULL, NULL, TPS[1], TPS[2], 2);
    45264787  BTS = new class BoundaryTriangleSet(BLS, TrianglesOnBoundaryCount);
    45274788  BTS->GetNormalVector(TempTriangle->NormalVector);
    45284789  BTS->NormalVector.Scale(-1.);
    4529   Log() << Verbose(1) << "INFO: NormalVector of new triangle is " << BTS->NormalVector << "." << endl;
     4790  DoLog(1) && (Log() << Verbose(1) << "INFO: NormalVector of new triangle is " << BTS->NormalVector << "." << endl);
    45304791  AddTesselationTriangle();
    45314792
    45324793  // create other side of this triangle and close both new sides of the first created triangle
    4533   Log() << Verbose(2) << "Adding new triangle points."<< endl;
     4794  DoLog(2) && (Log() << Verbose(2) << "Adding new triangle points." << endl);
    45344795  AddTesselationPoint((BestLine->endpoints[0]->node), 0);
    45354796  AddTesselationPoint((BestLine->endpoints[1]->node), 1);
    45364797  AddTesselationPoint(point, 2);
    4537   Log() << Verbose(2) << "Adding new triangle lines."<< endl;
    4538   AddTesselationLine(TPS[0], TPS[1], 0);
    4539   AddTesselationLine(TPS[0], TPS[2], 1);
    4540   AddTesselationLine(TPS[1], TPS[2], 2);
     4798  DoLog(2) && (Log() << Verbose(2) << "Adding new triangle lines." << endl);
     4799  AddTesselationLine(NULL, NULL, TPS[0], TPS[1], 0);
     4800  AddTesselationLine(NULL, NULL, TPS[0], TPS[2], 1);
     4801  AddTesselationLine(NULL, NULL, TPS[1], TPS[2], 2);
    45414802  BTS = new class BoundaryTriangleSet(BLS, TrianglesOnBoundaryCount);
    45424803  BTS->GetNormalVector(TempTriangle->NormalVector);
    4543   Log() << Verbose(1) << "INFO: NormalVector of other new triangle is " << BTS->NormalVector << "." << endl;
     4804  DoLog(1) && (Log() << Verbose(1) << "INFO: NormalVector of other new triangle is " << BTS->NormalVector << "." << endl);
    45444805  AddTesselationTriangle();
    45454806
    45464807  // add removed triangle to the last open line of the second triangle
    4547   for (int i=0;i<3;i++) { // look for the same line as BestLine (only it's its degenerated companion)
     4808  for (int i = 0; i < 3; i++) { // look for the same line as BestLine (only it's its degenerated companion)
    45484809    if ((BTS->lines[i]->ContainsBoundaryPoint(BestLine->endpoints[0])) && (BTS->lines[i]->ContainsBoundaryPoint(BestLine->endpoints[1]))) {
    4549       if (BestLine == BTS->lines[i]){
    4550         eLog() << Verbose(0) << "BestLine is same as found line, something's wrong here!" << endl;
     4810      if (BestLine == BTS->lines[i]) {
     4811        DoeLog(0) && (eLog() << Verbose(0) << "BestLine is same as found line, something's wrong here!" << endl);
    45514812        performCriticalExit();
    45524813      }
    4553       BTS->lines[i]->triangles.insert( pair<int, class BoundaryTriangleSet *> (TempTriangle->Nr, TempTriangle) );
     4814      BTS->lines[i]->triangles.insert(pair<int, class BoundaryTriangleSet *> (TempTriangle->Nr, TempTriangle));
    45544815      TempTriangle->lines[nr] = BTS->lines[i];
    45554816      break;
    45564817    }
    45574818  }
    4558 };
     4819}
     4820;
    45594821
    45604822/** Writes the envelope to file.
     
    45654827void Tesselation::Output(const char *filename, const PointCloud * const cloud)
    45664828{
    4567         Info FunctionInfo(__func__);
     4829  Info FunctionInfo(__func__);
    45684830  ofstream *tempstream = NULL;
    45694831  string NameofTempFile;
     
    45714833
    45724834  if (LastTriangle != NULL) {
    4573     sprintf(NumberName, "-%04d-%s_%s_%s", (int)TrianglesOnBoundary.size(), LastTriangle->endpoints[0]->node->Name, LastTriangle->endpoints[1]->node->Name, LastTriangle->endpoints[2]->node->Name);
     4835    sprintf(NumberName, "-%04d-%s_%s_%s", (int) TrianglesOnBoundary.size(), LastTriangle->endpoints[0]->node->Name, LastTriangle->endpoints[1]->node->Name, LastTriangle->endpoints[2]->node->Name);
    45744836    if (DoTecplotOutput) {
    45754837      string NameofTempFile(filename);
    45764838      NameofTempFile.append(NumberName);
    4577       for(size_t npos = NameofTempFile.find_first_of(' '); npos != string::npos; npos = NameofTempFile.find(' ', npos))
    4578       NameofTempFile.erase(npos, 1);
     4839      for (size_t npos = NameofTempFile.find_first_of(' '); npos != string::npos; npos = NameofTempFile.find(' ', npos))
     4840        NameofTempFile.erase(npos, 1);
    45794841      NameofTempFile.append(TecplotSuffix);
    4580       Log() << Verbose(0) << "Writing temporary non convex hull to file " << NameofTempFile << ".\n";
     4842      DoLog(0) && (Log() << Verbose(0) << "Writing temporary non convex hull to file " << NameofTempFile << ".\n");
    45814843      tempstream = new ofstream(NameofTempFile.c_str(), ios::trunc);
    45824844      WriteTecplotFile(tempstream, this, cloud, TriangleFilesWritten);
    45834845      tempstream->close();
    45844846      tempstream->flush();
    4585       delete(tempstream);
     4847      delete (tempstream);
    45864848    }
    45874849
     
    45894851      string NameofTempFile(filename);
    45904852      NameofTempFile.append(NumberName);
    4591       for(size_t npos = NameofTempFile.find_first_of(' '); npos != string::npos; npos = NameofTempFile.find(' ', npos))
    4592       NameofTempFile.erase(npos, 1);
     4853      for (size_t npos = NameofTempFile.find_first_of(' '); npos != string::npos; npos = NameofTempFile.find(' ', npos))
     4854        NameofTempFile.erase(npos, 1);
    45934855      NameofTempFile.append(Raster3DSuffix);
    4594       Log() << Verbose(0) << "Writing temporary non convex hull to file " << NameofTempFile << ".\n";
     4856      DoLog(0) && (Log() << Verbose(0) << "Writing temporary non convex hull to file " << NameofTempFile << ".\n");
    45954857      tempstream = new ofstream(NameofTempFile.c_str(), ios::trunc);
    45964858      WriteRaster3dFile(tempstream, this, cloud);
     
    45984860      tempstream->close();
    45994861      tempstream->flush();
    4600       delete(tempstream);
     4862      delete (tempstream);
    46014863    }
    46024864  }
    46034865  if (DoTecplotOutput || DoRaster3DOutput)
    46044866    TriangleFilesWritten++;
    4605 };
    4606 
    4607 struct BoundaryPolygonSetCompare {
    4608   bool operator()(const BoundaryPolygonSet * s1, const BoundaryPolygonSet * s2) const {
     4867}
     4868;
     4869
     4870struct BoundaryPolygonSetCompare
     4871{
     4872  bool operator()(const BoundaryPolygonSet * s1, const BoundaryPolygonSet * s2) const
     4873  {
    46094874    if (s1->endpoints.size() < s2->endpoints.size())
    46104875      return true;
     
    46354900{
    46364901  Info FunctionInfo(__func__);
    4637 
    46384902  /// 2. Go through all BoundaryPointSet's, check their triangles' NormalVector
    46394903  IndexToIndex *DegeneratedTriangles = FindAllDegeneratedTriangles();
    4640   set < BoundaryPointSet *> EndpointCandidateList;
    4641   pair < set < BoundaryPointSet *>::iterator, bool > InsertionTester;
    4642   pair < map < int, Vector *>::iterator, bool > TriangleInsertionTester;
     4904  set<BoundaryPointSet *> EndpointCandidateList;
     4905  pair<set<BoundaryPointSet *>::iterator, bool> InsertionTester;
     4906  pair<map<int, Vector *>::iterator, bool> TriangleInsertionTester;
    46434907  for (PointMap::const_iterator Runner = PointsOnBoundary.begin(); Runner != PointsOnBoundary.end(); Runner++) {
    4644     Log() << Verbose(0) << "Current point is " << *Runner->second << "." << endl;
    4645     map < int, Vector *> TriangleVectors;
     4908    DoLog(0) && (Log() << Verbose(0) << "Current point is " << *Runner->second << "." << endl);
     4909    map<int, Vector *> TriangleVectors;
    46464910    // gather all NormalVectors
    4647     Log() << Verbose(1) << "Gathering triangles ..." << endl;
     4911    DoLog(1) && (Log() << Verbose(1) << "Gathering triangles ..." << endl);
    46484912    for (LineMap::const_iterator LineRunner = (Runner->second)->lines.begin(); LineRunner != (Runner->second)->lines.end(); LineRunner++)
    46494913      for (TriangleMap::const_iterator TriangleRunner = (LineRunner->second)->triangles.begin(); TriangleRunner != (LineRunner->second)->triangles.end(); TriangleRunner++) {
    46504914        if (DegeneratedTriangles->find(TriangleRunner->second->Nr) == DegeneratedTriangles->end()) {
    4651           TriangleInsertionTester = TriangleVectors.insert( pair< int, Vector *> ((TriangleRunner->second)->Nr, &((TriangleRunner->second)->NormalVector)) );
     4915          TriangleInsertionTester = TriangleVectors.insert(pair<int, Vector *> ((TriangleRunner->second)->Nr, &((TriangleRunner->second)->NormalVector)));
    46524916          if (TriangleInsertionTester.second)
    4653             Log() << Verbose(1) << " Adding triangle " << *(TriangleRunner->second) << " to triangles to check-list." << endl;
     4917            DoLog(1) && (Log() << Verbose(1) << " Adding triangle " << *(TriangleRunner->second) << " to triangles to check-list." << endl);
    46544918        } else {
    4655           Log() << Verbose(1) << " NOT adding triangle " << *(TriangleRunner->second) << " as it's a simply degenerated one." << endl;
     4919          DoLog(1) && (Log() << Verbose(1) << " NOT adding triangle " << *(TriangleRunner->second) << " as it's a simply degenerated one." << endl);
    46564920        }
    46574921      }
    46584922    // check whether there are two that are parallel
    4659     Log() << Verbose(1) << "Finding two parallel triangles ..." << endl;
    4660     for (map < int, Vector *>::iterator VectorWalker = TriangleVectors.begin(); VectorWalker != TriangleVectors.end(); VectorWalker++)
    4661       for (map < int, Vector *>::iterator VectorRunner = VectorWalker; VectorRunner != TriangleVectors.end(); VectorRunner++)
     4923    DoLog(1) && (Log() << Verbose(1) << "Finding two parallel triangles ..." << endl);
     4924    for (map<int, Vector *>::iterator VectorWalker = TriangleVectors.begin(); VectorWalker != TriangleVectors.end(); VectorWalker++)
     4925      for (map<int, Vector *>::iterator VectorRunner = VectorWalker; VectorRunner != TriangleVectors.end(); VectorRunner++)
    46624926        if (VectorWalker != VectorRunner) { // skip equals
    4663           const double SCP = VectorWalker->second->ScalarProduct(VectorRunner->second);  // ScalarProduct should result in -1. for degenerated triangles
    4664           Log() << Verbose(1) << "Checking " << *VectorWalker->second<< " against " << *VectorRunner->second << ": " << SCP << endl;
     4927          const double SCP = VectorWalker->second->ScalarProduct(VectorRunner->second); // ScalarProduct should result in -1. for degenerated triangles
     4928          DoLog(1) && (Log() << Verbose(1) << "Checking " << *VectorWalker->second << " against " << *VectorRunner->second << ": " << SCP << endl);
    46654929          if (fabs(SCP + 1.) < ParallelEpsilon) {
    46664930            InsertionTester = EndpointCandidateList.insert((Runner->second));
    46674931            if (InsertionTester.second)
    4668               Log() << Verbose(0) << " Adding " << *Runner->second << " to endpoint candidate list." << endl;
     4932              DoLog(0) && (Log() << Verbose(0) << " Adding " << *Runner->second << " to endpoint candidate list." << endl);
    46694933            // and break out of both loops
    46704934            VectorWalker = TriangleVectors.end();
     
    46744938        }
    46754939  }
    4676 
     4940  delete (DegeneratedTriangles);
    46774941  /// 3. Find connected endpoint candidates and put them into a polygon
    46784942  UniquePolygonSet ListofDegeneratedPolygons;
     
    46804944  BoundaryPointSet *OtherWalker = NULL;
    46814945  BoundaryPolygonSet *Current = NULL;
    4682   stack <BoundaryPointSet*> ToCheckConnecteds;
     4946  stack<BoundaryPointSet*> ToCheckConnecteds;
    46834947  while (!EndpointCandidateList.empty()) {
    46844948    Walker = *(EndpointCandidateList.begin());
    4685     if (Current == NULL) {  // create a new polygon with current candidate
    4686       Log() << Verbose(0) << "Starting new polygon set at point " << *Walker << endl;
     4949    if (Current == NULL) { // create a new polygon with current candidate
     4950      DoLog(0) && (Log() << Verbose(0) << "Starting new polygon set at point " << *Walker << endl);
    46874951      Current = new BoundaryPolygonSet;
    46884952      Current->endpoints.insert(Walker);
     
    46974961      for (LineMap::const_iterator LineWalker = Walker->lines.begin(); LineWalker != Walker->lines.end(); LineWalker++) {
    46984962        OtherWalker = (LineWalker->second)->GetOtherEndpoint(Walker);
    4699         Log() << Verbose(1) << "Checking " << *OtherWalker << endl;
    4700         set < BoundaryPointSet *>::iterator Finder = EndpointCandidateList.find(OtherWalker);
    4701         if (Finder != EndpointCandidateList.end()) {  // found a connected partner
    4702           Log() << Verbose(1) << " Adding to polygon." << endl;
     4963        DoLog(1) && (Log() << Verbose(1) << "Checking " << *OtherWalker << endl);
     4964        set<BoundaryPointSet *>::iterator Finder = EndpointCandidateList.find(OtherWalker);
     4965        if (Finder != EndpointCandidateList.end()) { // found a connected partner
     4966          DoLog(1) && (Log() << Verbose(1) << " Adding to polygon." << endl);
    47034967          Current->endpoints.insert(OtherWalker);
    4704           EndpointCandidateList.erase(Finder);  // remove from candidates
    4705           ToCheckConnecteds.push(OtherWalker);  // but check its partners too
     4968          EndpointCandidateList.erase(Finder); // remove from candidates
     4969          ToCheckConnecteds.push(OtherWalker); // but check its partners too
    47064970        } else {
    4707           Log() << Verbose(1) << " is not connected to " << *Walker << endl;
     4971          DoLog(1) && (Log() << Verbose(1) << " is not connected to " << *Walker << endl);
    47084972        }
    47094973      }
    47104974    }
    47114975
    4712     Log() << Verbose(0) << "Final polygon is " << *Current << endl;
     4976    DoLog(0) && (Log() << Verbose(0) << "Final polygon is " << *Current << endl);
    47134977    ListofDegeneratedPolygons.insert(Current);
    47144978    Current = NULL;
     
    47174981  const int counter = ListofDegeneratedPolygons.size();
    47184982
    4719   Log() << Verbose(0) << "The following " << counter << " degenerated polygons have been found: " << endl;
     4983  DoLog(0) && (Log() << Verbose(0) << "The following " << counter << " degenerated polygons have been found: " << endl);
    47204984  for (UniquePolygonSet::iterator PolygonRunner = ListofDegeneratedPolygons.begin(); PolygonRunner != ListofDegeneratedPolygons.end(); PolygonRunner++)
    4721     Log() << Verbose(0) << " " << **PolygonRunner << endl;
     4985    DoLog(0) && (Log() << Verbose(0) << " " << **PolygonRunner << endl);
    47224986
    47234987  /// 4. Go through all these degenerated polygons
    47244988  for (UniquePolygonSet::iterator PolygonRunner = ListofDegeneratedPolygons.begin(); PolygonRunner != ListofDegeneratedPolygons.end(); PolygonRunner++) {
    4725     stack <int> TriangleNrs;
     4989    stack<int> TriangleNrs;
    47264990    Vector NormalVector;
    47274991    /// 4a. Gather all triangles of this polygon
     
    47304994    // check whether number is bigger than 2, otherwise it's just a simply degenerated one and nothing to do.
    47314995    if (T->size() == 2) {
    4732       Log() << Verbose(1) << " Skipping degenerated polygon, is just a (already simply degenerated) triangle." << endl;
    4733       delete(T);
     4996      DoLog(1) && (Log() << Verbose(1) << " Skipping degenerated polygon, is just a (already simply degenerated) triangle." << endl);
     4997      delete (T);
    47344998      continue;
    47354999    }
     
    47405004    // connections to either polygon ...
    47415005    if (T->size() % 2 != 0) {
    4742       eLog() << Verbose(0) << " degenerated polygon contains an odd number of triangles, probably contains bridging non-degenerated ones, too!" << endl;
     5006      DoeLog(0) && (eLog() << Verbose(0) << " degenerated polygon contains an odd number of triangles, probably contains bridging non-degenerated ones, too!" << endl);
    47435007      performCriticalExit();
    47445008    }
    4745 
    4746     TriangleSet::iterator TriangleWalker = T->begin();  // is the inner iterator
     5009    TriangleSet::iterator TriangleWalker = T->begin(); // is the inner iterator
    47475010    /// 4a. Get NormalVector for one side (this is "front")
    47485011    NormalVector.CopyVector(&(*TriangleWalker)->NormalVector);
    4749     Log() << Verbose(1) << "\"front\" defining triangle is " << **TriangleWalker << " and Normal vector of \"front\" side is " << NormalVector << endl;
     5012    DoLog(1) && (Log() << Verbose(1) << "\"front\" defining triangle is " << **TriangleWalker << " and Normal vector of \"front\" side is " << NormalVector << endl);
    47505013    TriangleWalker++;
    47515014    TriangleSet::iterator TriangleSprinter = TriangleWalker; // is the inner advanced iterator
     
    47565019      triangle = *TriangleWalker;
    47575020      TriangleSprinter++;
    4758       Log() << Verbose(1) << "Current triangle to test for removal: " << *triangle << endl;
     5021      DoLog(1) && (Log() << Verbose(1) << "Current triangle to test for removal: " << *triangle << endl);
    47595022      if (triangle->NormalVector.ScalarProduct(&NormalVector) < 0) { // if from other side, then delete and remove from list
    4760         Log() << Verbose(1) << " Removing ... " << endl;
     5023        DoLog(1) && (Log() << Verbose(1) << " Removing ... " << endl);
    47615024        TriangleNrs.push(triangle->Nr);
    47625025        T->erase(TriangleWalker);
    47635026        RemoveTesselationTriangle(triangle);
    47645027      } else
    4765         Log() << Verbose(1) << " Keeping ... " << endl;
     5028        DoLog(1) && (Log() << Verbose(1) << " Keeping ... " << endl);
    47665029    }
    47675030    /// 4c. Copy all "front" triangles but with inverse NormalVector
    47685031    TriangleWalker = T->begin();
    4769     while (TriangleWalker != T->end()) {  // go through all front triangles
    4770       Log() << Verbose(1) << " Re-creating triangle " << **TriangleWalker << " with NormalVector " << (*TriangleWalker)->NormalVector << endl;
     5032    while (TriangleWalker != T->end()) { // go through all front triangles
     5033      DoLog(1) && (Log() << Verbose(1) << " Re-creating triangle " << **TriangleWalker << " with NormalVector " << (*TriangleWalker)->NormalVector << endl);
    47715034      for (int i = 0; i < 3; i++)
    47725035        AddTesselationPoint((*TriangleWalker)->endpoints[i]->node, i);
    4773       AddTesselationLine(TPS[0], TPS[1], 0);
    4774       AddTesselationLine(TPS[0], TPS[2], 1);
    4775       AddTesselationLine(TPS[1], TPS[2], 2);
     5036      AddTesselationLine(NULL, NULL, TPS[0], TPS[1], 0);
     5037      AddTesselationLine(NULL, NULL, TPS[0], TPS[2], 1);
     5038      AddTesselationLine(NULL, NULL, TPS[1], TPS[2], 2);
    47765039      if (TriangleNrs.empty())
    4777         eLog() << Verbose(0) << "No more free triangle numbers!" << endl;
     5040        DoeLog(0) && (eLog() << Verbose(0) << "No more free triangle numbers!" << endl);
    47785041      BTS = new BoundaryTriangleSet(BLS, TriangleNrs.top()); // copy triangle ...
    47795042      AddTesselationTriangle(); // ... and add
     
    47845047    }
    47855048    if (!TriangleNrs.empty()) {
    4786       eLog() << Verbose(0) << "There have been less triangles created than removed!" << endl;
    4787     }
    4788     delete(T);  // remove the triangleset
    4789   }
    4790 
     5049      DoeLog(0) && (eLog() << Verbose(0) << "There have been less triangles created than removed!" << endl);
     5050    }
     5051    delete (T); // remove the triangleset
     5052  }
    47915053  IndexToIndex * SimplyDegeneratedTriangles = FindAllDegeneratedTriangles();
    4792   Log() << Verbose(0) << "Final list of simply degenerated triangles found, containing " << SimplyDegeneratedTriangles->size() << " triangles:" << endl;
     5054  DoLog(0) && (Log() << Verbose(0) << "Final list of simply degenerated triangles found, containing " << SimplyDegeneratedTriangles->size() << " triangles:" << endl);
    47935055  IndexToIndex::iterator it;
    47945056  for (it = SimplyDegeneratedTriangles->begin(); it != SimplyDegeneratedTriangles->end(); it++)
    4795       Log() << Verbose(0) << (*it).first << " => " << (*it).second << endl;
    4796   delete(SimplyDegeneratedTriangles);
    4797 
     5057    DoLog(0) && (Log() << Verbose(0) << (*it).first << " => " << (*it).second << endl);
     5058  delete (SimplyDegeneratedTriangles);
    47985059  /// 5. exit
    47995060  UniquePolygonSet::iterator PolygonRunner;
    48005061  while (!ListofDegeneratedPolygons.empty()) {
    48015062    PolygonRunner = ListofDegeneratedPolygons.begin();
    4802     delete(*PolygonRunner);
     5063    delete (*PolygonRunner);
    48035064    ListofDegeneratedPolygons.erase(PolygonRunner);
    48045065  }
    48055066
    48065067  return counter;
    4807 };
     5068}
     5069;
Note: See TracChangeset for help on using the changeset viewer.