Ignore:
Timestamp:
Aug 20, 2009, 7:48:07 AM (16 years ago)
Author:
Frederik Heber <heber@…>
Children:
5f4960, 6c6d84
Parents:
78dac6 (diff), d6b011 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
git-author:
Frederik Heber <heber@…> (08/19/09 14:40:33)
git-committer:
Frederik Heber <heber@…> (08/20/09 07:48:07)
Message:

Merge branch 'ConcaveHull' of ssh://stud64d-02/home/metzler/workspace/espack into Ticket14

Conflicts:

molecuilder/src/boundary.cpp
molecuilder/src/tesselation.cpp

File:
1 edited

Legend:

Unmodified
Added
Removed
  • molecuilder/src/tesselation.cpp

    r78dac6 r84b811  
    219219    return true;
    220220  }
    221   double angle = getAngle(helper[0], helper[1], BaseLineNormal);
     221  double angle = GetAngle(helper[0], helper[1], BaseLineNormal);
    222222  if ((angle - M_PI) > -MYEPSILON) {
    223223    *out << Verbose(2) << "ACCEPT: Angle is greater than pi: convex." << endl;
     
    14021402
    14031403
    1404 /** Finds the starting triangle for find_non_convex_border().
    1405  * Looks at the outermost point per axis, then Find_second_point_for_Tesselation()
    1406  * for the second and Find_next_suitable_point_via_Angle_of_Sphere() for the third
     1404/** Finds the starting triangle for FindNonConvexBorder().
     1405 * Looks at the outermost point per axis, then FindSecondPointForTesselation()
     1406 * for the second and FindNextSuitablePointViaAngleOfSphere() for the third
    14071407 * point are called.
    14081408 * \param *out output stream for debugging
     
    14101410 * \param *LC LinkedCell structure with neighbouring TesselPoint's
    14111411 */
    1412 void Tesselation::Find_starting_triangle(ofstream *out, const double RADIUS, LinkedCell *LC)
    1413 {
    1414   cout << Verbose(1) << "Begin of Find_starting_triangle\n";
     1412void Tesselation::FindStartingTriangle(ofstream *out, const double RADIUS, LinkedCell *LC)
     1413{
     1414  cout << Verbose(1) << "Begin of FindStartingTriangle\n";
    14151415  int i = 0;
    14161416  LinkedNodes *List = NULL;
     
    14181418  TesselPoint* SecondPoint = NULL;
    14191419  TesselPoint* MaxPoint[NDIM];
    1420   double max_coordinate[NDIM];
     1420  double maxCoordinate[NDIM];
    14211421  Vector Oben;
    14221422  Vector helper;
     
    14281428  for (i = 0; i < 3; i++) {
    14291429    MaxPoint[i] = NULL;
    1430     max_coordinate[i] = -1;
     1430    maxCoordinate[i] = -1;
    14311431  }
    14321432
     
    14401440        if (List != NULL) {
    14411441          for (LinkedNodes::iterator Runner = List->begin();Runner != List->end();Runner++) {
    1442             if ((*Runner)->node->x[i] > max_coordinate[i]) {
     1442            if ((*Runner)->node->x[i] > maxCoordinate[i]) {
    14431443              cout << Verbose(2) << "New maximal for axis " << i << " node is " << *(*Runner) << " at " << *(*Runner)->node << "." << endl;
    1444               max_coordinate[i] = (*Runner)->node->x[i];
     1444              maxCoordinate[i] = (*Runner)->node->x[i];
    14451445              MaxPoint[i] = (*Runner);
    14461446            }
     
    14581458
    14591459  BTS = NULL;
    1460   CandidateList *Opt_Candidates = new CandidateList();
     1460  CandidateList *OptCandidates = new CandidateList();
    14611461  for (int k=0;k<NDIM;k++) {
    14621462    Oben.x[k] = 1.;
     
    14651465
    14661466    double ShortestAngle;
    1467     TesselPoint* Opt_Candidate = NULL;
     1467    TesselPoint* OptCandidate = NULL;
    14681468    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.
    14691469
    1470     Find_second_point_for_Tesselation(FirstPoint, NULL, Oben, Opt_Candidate, &ShortestAngle, RADIUS, LC); // we give same point as next candidate as its bonds are looked into in find_second_...
    1471     SecondPoint = Opt_Candidate;
     1470    FindSecondPointForTesselation(FirstPoint, NULL, Oben, OptCandidate, &ShortestAngle, RADIUS, LC); // we give same point as next candidate as its bonds are looked into in find_second_...
     1471    SecondPoint = OptCandidate;
    14721472    if (SecondPoint == NULL)  // have we found a second point?
    14731473      continue;
     
    15001500
    15011501    //cout << Verbose(2) << "INFO: OldSphereCenter is at " << helper << ".\n";
    1502     Find_third_point_for_Tesselation(
    1503       Oben, SearchDirection, helper, BLS[0], NULL, *&Opt_Candidates, &ShortestAngle, RADIUS, LC
     1502    FindThirdPointForTesselation(
     1503      Oben, SearchDirection, helper, BLS[0], NULL, *&OptCandidates, &ShortestAngle, RADIUS, LC
    15041504    );
    15051505    cout << Verbose(1) << "List of third Points is ";
    1506     for (CandidateList::iterator it = Opt_Candidates->begin(); it != Opt_Candidates->end(); ++it) {
     1506    for (CandidateList::iterator it = OptCandidates->begin(); it != OptCandidates->end(); ++it) {
    15071507        cout << " " << *(*it)->point;
    15081508    }
    15091509    cout << endl;
    15101510
    1511     for (CandidateList::iterator it = Opt_Candidates->begin(); it != Opt_Candidates->end(); ++it) {
     1511    for (CandidateList::iterator it = OptCandidates->begin(); it != OptCandidates->end(); ++it) {
    15121512      // add third triangle point
    15131513      AddTesselationPoint((*it)->point, 2);
     
    15261526
    15271527      // if we do not reach the end with the next step of iteration, we need to setup a new first line
    1528       if (it != Opt_Candidates->end()--) {
     1528      if (it != OptCandidates->end()--) {
    15291529        FirstPoint = (*it)->BaseLine->endpoints[0]->node;
    15301530        SecondPoint = (*it)->point;
     
    15411541      // remove all candidates from the list and then the list itself
    15421542      class CandidateForTesselation *remover = NULL;
    1543       for (CandidateList::iterator it = Opt_Candidates->begin(); it != Opt_Candidates->end(); ++it) {
     1543      for (CandidateList::iterator it = OptCandidates->begin(); it != OptCandidates->end(); ++it) {
    15441544        remover = *it;
    15451545        delete(remover);
    15461546      }
    1547       Opt_Candidates->clear();
     1547      OptCandidates->clear();
    15481548    }
    15491549  }
     
    15511551  // remove all candidates from the list and then the list itself
    15521552  class CandidateForTesselation *remover = NULL;
    1553   for (CandidateList::iterator it = Opt_Candidates->begin(); it != Opt_Candidates->end(); ++it) {
     1553  for (CandidateList::iterator it = OptCandidates->begin(); it != OptCandidates->end(); ++it) {
    15541554    remover = *it;
    15551555    delete(remover);
    15561556  }
    1557   delete(Opt_Candidates);
    1558   cout << Verbose(1) << "End of Find_starting_triangle\n";
     1557  delete(OptCandidates);
     1558  cout << Verbose(1) << "End of FindStartingTriangle\n";
    15591559};
    15601560
     
    15681568 * @param *LC LinkedCell structure with neighbouring points
    15691569 */
    1570 bool Tesselation::Find_next_suitable_triangle(ofstream *out, BoundaryLineSet &Line, BoundaryTriangleSet &T, const double& RADIUS, int N, LinkedCell *LC)
    1571 {
    1572   cout << Verbose(0) << "Begin of Find_next_suitable_triangle\n";
     1570bool Tesselation::FindNextSuitableTriangle(ofstream *out, BoundaryLineSet &Line, BoundaryTriangleSet &T, const double& RADIUS, int N, LinkedCell *LC)
     1571{
     1572  cout << Verbose(0) << "Begin of FindNextSuitableTriangle\n";
    15731573  bool result = true;
    1574   CandidateList *Opt_Candidates = new CandidateList();
     1574  CandidateList *OptCandidates = new CandidateList();
    15751575
    15761576  Vector CircleCenter;
     
    16291629
    16301630    // add third point
    1631     Find_third_point_for_Tesselation(
    1632       T.NormalVector, SearchDirection, OldSphereCenter, &Line, ThirdNode, Opt_Candidates,
     1631    FindThirdPointForTesselation(
     1632      T.NormalVector, SearchDirection, OldSphereCenter, &Line, ThirdNode, OptCandidates,
    16331633      &ShortestAngle, RADIUS, LC
    16341634    );
     
    16381638  }
    16391639
    1640   if (Opt_Candidates->begin() == Opt_Candidates->end()) {
     1640  if (OptCandidates->begin() == OptCandidates->end()) {
    16411641    cerr << "WARNING: Could not find a suitable candidate." << endl;
    16421642    return false;
    16431643  }
    16441644  cout << Verbose(1) << "Third Points are ";
    1645   for (CandidateList::iterator it = Opt_Candidates->begin(); it != Opt_Candidates->end(); ++it) {
     1645  for (CandidateList::iterator it = OptCandidates->begin(); it != OptCandidates->end(); ++it) {
    16461646    cout << " " << *(*it)->point;
    16471647  }
     
    16491649
    16501650  BoundaryLineSet *BaseRay = &Line;
    1651   for (CandidateList::iterator it = Opt_Candidates->begin(); it != Opt_Candidates->end(); ++it) {
     1651  for (CandidateList::iterator it = OptCandidates->begin(); it != OptCandidates->end(); ++it) {
    16521652    cout << Verbose(1) << " Third point candidate is " << *(*it)->point
    16531653    << " with circumsphere's center at " << (*it)->OptCenter << "." << endl;
     
    16681668      AddTesselationPoint(BaseRay->endpoints[1]->node, 2);
    16691669
    1670       if (CheckLineCriteriaforDegeneratedTriangle(TPS)) {
     1670      if (CheckLineCriteriaForDegeneratedTriangle(TPS)) {
    16711671        AddTesselationLine(TPS[0], TPS[1], 0);
    16721672        AddTesselationLine(TPS[0], TPS[2], 1);
     
    16971697        // 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)
    16981698        // i.e. at least one of the three lines must be present with TriangleCount <= 1
    1699         if (CheckLineCriteriaforDegeneratedTriangle(TPS)) {
     1699        if (CheckLineCriteriaForDegeneratedTriangle(TPS)) {
    17001700          AddTesselationLine(TPS[0], TPS[1], 0);
    17011701          AddTesselationLine(TPS[0], TPS[2], 1);
     
    17351735  // remove all candidates from the list and then the list itself
    17361736  class CandidateForTesselation *remover = NULL;
    1737   for (CandidateList::iterator it = Opt_Candidates->begin(); it != Opt_Candidates->end(); ++it) {
     1737  for (CandidateList::iterator it = OptCandidates->begin(); it != OptCandidates->end(); ++it) {
    17381738    remover = *it;
    17391739    delete(remover);
    17401740  }
    1741   delete(Opt_Candidates);
    1742   cout << Verbose(0) << "End of Find_next_suitable_triangle\n";
     1741  delete(OptCandidates);
     1742  cout << Verbose(0) << "End of FindNextSuitableTriangle\n";
    17431743  return result;
    17441744};
     
    20472047 * \param *Candidate pointer to candidate node on return
    20482048 * \param Oben vector indicating the outside
    2049  * \param Opt_Candidate reference to recommended candidate on return
     2049 * \param OptCandidate reference to recommended candidate on return
    20502050 * \param Storage[3] array storing angles and other candidate information
    20512051 * \param RADIUS radius of virtual sphere
    20522052 * \param *LC LinkedCell structure with neighbouring points
    20532053 */
    2054 void Tesselation::Find_second_point_for_Tesselation(TesselPoint* a, TesselPoint* Candidate, Vector Oben, TesselPoint*& Opt_Candidate, double Storage[3], double RADIUS, LinkedCell *LC)
    2055 {
    2056   cout << Verbose(2) << "Begin of Find_second_point_for_Tesselation" << endl;
     2054void Tesselation::FindSecondPointForTesselation(TesselPoint* a, TesselPoint* Candidate, Vector Oben, TesselPoint*& OptCandidate, double Storage[3], double RADIUS, LinkedCell *LC)
     2055{
     2056  cout << Verbose(2) << "Begin of FindSecondPointForTesselation" << endl;
    20572057  Vector AngleCheck;
    20582058  double norm = -1., angle;
     
    20922092            if (a != Candidate) {
    20932093              // Calculate center of the circle with radius RADIUS through points a and Candidate
    2094               Vector OrthogonalizedOben, a_Candidate, Center;
     2094              Vector OrthogonalizedOben, aCandidate, Center;
    20952095              double distance, scaleFactor;
    20962096
    20972097              OrthogonalizedOben.CopyVector(&Oben);
    2098               a_Candidate.CopyVector(a->node);
    2099               a_Candidate.SubtractVector(Candidate->node);
    2100               OrthogonalizedOben.ProjectOntoPlane(&a_Candidate);
     2098              aCandidate.CopyVector(a->node);
     2099              aCandidate.SubtractVector(Candidate->node);
     2100              OrthogonalizedOben.ProjectOntoPlane(&aCandidate);
    21012101              OrthogonalizedOben.Normalize();
    2102               distance = 0.5 * a_Candidate.Norm();
     2102              distance = 0.5 * aCandidate.Norm();
    21032103              scaleFactor = sqrt(((RADIUS * RADIUS) - (distance * distance)));
    21042104              OrthogonalizedOben.Scale(scaleFactor);
     
    21112111              AngleCheck.CopyVector(&Center);
    21122112              AngleCheck.SubtractVector(a->node);
    2113               norm = a_Candidate.Norm();
     2113              norm = aCandidate.Norm();
    21142114              // second point shall have smallest angle with respect to Oben vector
    21152115              if (norm < RADIUS*2.) {
     
    21182118                  //cout << Verbose(3) << "Old values of Storage: %lf %lf \n", Storage[0], Storage[1]);
    21192119                  cout << Verbose(3) << "Current candidate is " << *Candidate << ": Is a better candidate with distance " << norm << " and angle " << angle << " to oben " << Oben << ".\n";
    2120                   Opt_Candidate = Candidate;
     2120                  OptCandidate = Candidate;
    21212121                  Storage[0] = angle;
    21222122                  //cout << Verbose(3) << "Changing something in Storage: %lf %lf. \n", Storage[0], Storage[2]);
    21232123                } else {
    2124                   //cout << Verbose(3) << "Current candidate is " << *Candidate << ": Looses with angle " << angle << " to a better candidate " << *Opt_Candidate << endl;
     2124                  //cout << Verbose(3) << "Current candidate is " << *Candidate << ": Looses with angle " << angle << " to a better candidate " << *OptCandidate << endl;
    21252125                }
    21262126              } else {
     
    21352135        }
    21362136      }
    2137   cout << Verbose(2) << "End of Find_second_point_for_Tesselation" << endl;
     2137  cout << Verbose(2) << "End of FindSecondPointForTesselation" << endl;
    21382138};
    21392139
     
    21612161 * holds. Then, the normalized projection onto the SearchDirection is either +1 or -1 and thus states whether
    21622162 * the angle is uniquely in either (0,M_PI] or [M_PI, 2.*M_PI).
    2163  * @param NormalVector normal direction of the base triangle (here the unit axis vector, \sa Find_starting_triangle())
     2163 * @param NormalVector normal direction of the base triangle (here the unit axis vector, \sa FindStartingTriangle())
    21642164 * @param SearchDirection general direction where to search for the next point, relative to center of BaseLine
    21652165 * @param OldSphereCenter center of sphere for base triangle, relative to center of BaseLine, giving null angle for the parameter circle
     
    21672167 * @param ThirdNode third point to avoid in search
    21682168 * @param candidates list of equally good candidates to return
    2169  * @param ShortestAngle the current path length on this circle band for the current Opt_Candidate
     2169 * @param ShortestAngle the current path length on this circle band for the current OptCandidate
    21702170 * @param RADIUS radius of sphere
    21712171 * @param *LC LinkedCell structure with neighbouring points
    21722172 */
    2173 void Tesselation::Find_third_point_for_Tesselation(Vector NormalVector, Vector SearchDirection, Vector OldSphereCenter, class BoundaryLineSet *BaseLine, class TesselPoint  *ThirdNode, CandidateList* &candidates, double *ShortestAngle, const double RADIUS, LinkedCell *LC)
     2173void Tesselation::FindThirdPointForTesselation(Vector NormalVector, Vector SearchDirection, Vector OldSphereCenter, class BoundaryLineSet *BaseLine, class TesselPoint  *ThirdNode, CandidateList* &candidates, double *ShortestAngle, const double RADIUS, LinkedCell *LC)
    21742174{
    21752175  Vector CircleCenter;  // center of the circle, i.e. of the band of sphere's centers
     
    21882188  CandidateForTesselation *optCandidate = NULL;
    21892189
    2190   cout << Verbose(1) << "Begin of Find_third_point_for_Tesselation" << endl;
     2190  cout << Verbose(1) << "Begin of FindThirdPointForTesselation" << endl;
    21912191
    21922192  //cout << Verbose(2) << "INFO: NormalVector of BaseTriangle is " << NormalVector << "." << endl;
     
    23452345  if (candidates->size() > 1) {
    23462346    candidates->unique();
    2347     candidates->sort(sortCandidates);
    2348   }
    2349 
    2350   cout << Verbose(1) << "End of Find_third_point_for_Tesselation" << endl;
     2347    candidates->sort(SortCandidates);
     2348  }
     2349
     2350  cout << Verbose(1) << "End of FindThirdPointForTesselation" << endl;
    23512351};
    23522352
     
    23972397  }
    23982398
    2399   trianglePoints[0] = findClosestPoint(x, SecondPoint, LC);
     2399  trianglePoints[0] = FindClosestPoint(x, SecondPoint, LC);
    24002400 
    24012401  // check whether closest point is "too close" :), then it's inside
     
    24082408    return NULL;
    24092409  }
    2410   list<TesselPoint*> *connectedPoints = getCircleOfConnectedPoints(out, trianglePoints[0]);
    2411   list<TesselPoint*> *connectedClosestPoints = getNeighboursonCircleofConnectedPoints(out, connectedPoints, trianglePoints[0], x);
     2410  list<TesselPoint*> *connectedPoints = GetCircleOfConnectedPoints(out, trianglePoints[0]);
     2411  list<TesselPoint*> *connectedClosestPoints = GetNeighboursOnCircleOfConnectedPoints(out, connectedPoints, trianglePoints[0], x);
    24122412  delete(connectedPoints);
    24132413  trianglePoints[1] = connectedClosestPoints->front();
     
    24972497 * @return list of the all points linked to the provided one
    24982498 */
    2499 list<TesselPoint*> * Tesselation::getCircleOfConnectedPoints(ofstream *out, TesselPoint* Point)
     2499list<TesselPoint*> * Tesselation::GetCircleOfConnectedPoints(ofstream *out, TesselPoint* Point)
    25002500{
    25012501  list<TesselPoint*> *connectedPoints = new list<TesselPoint*>;
     
    25582558 * @return list of the two points linked to the provided one and closest to the point to be checked,
    25592559 */
    2560 list<TesselPoint*> * Tesselation::getNeighboursonCircleofConnectedPoints(ofstream *out, list<TesselPoint*> *connectedPoints, TesselPoint* Point, Vector* Reference)
     2560list<TesselPoint*> * Tesselation::GetNeighboursOnCircleOfConnectedPoints(ofstream *out, list<TesselPoint*> *connectedPoints, TesselPoint* Point, Vector* Reference)
    25612561{
    25622562  map<double, TesselPoint*> anglesOfPoints;
     
    25972597    helper.SubtractVector(Point->node);
    25982598    helper.ProjectOntoPlane(&PlaneNormal);
    2599     double angle = getAngle(helper, AngleZero, OrthogonalVector);
     2599    double angle = GetAngle(helper, AngleZero, OrthogonalVector);
    26002600    *out << Verbose(2) << "INFO: Calculated angle is " << angle << " for point " << **listRunner << "." << endl;
    26012601    anglesOfPoints.insert(pair<double, TesselPoint*>(angle, (*listRunner)));
     
    26442644    return 0.;
    26452645  }
    2646   list<TesselPoint*> *CircleofPoints = getCircleOfConnectedPoints(out, point->node);
     2646  list<TesselPoint*> *CircleofPoints = GetCircleOfConnectedPoints(out, point->node);
    26472647
    26482648  // remove all triangles
     
    27162716 * \return true - there is such a line (i.e. creation of degenerated triangle is valid), false - no such line (don't create)
    27172717 */
    2718 bool CheckLineCriteriaforDegeneratedTriangle(class BoundaryPointSet *nodes[3])
     2718bool CheckLineCriteriaForDegeneratedTriangle(class BoundaryPointSet *nodes[3])
    27192719{
    27202720  bool result = false;
     
    27502750/** Sort function for the candidate list.
    27512751 */
    2752 bool sortCandidates(CandidateForTesselation* candidate1, CandidateForTesselation* candidate2)
     2752bool SortCandidates(CandidateForTesselation* candidate1, CandidateForTesselation* candidate2)
    27532753{
    27542754  Vector BaseLineVector, OrthogonalVector, helper;
     
    28002800 * @return point which is second closest to the provided one
    28012801 */
    2802 TesselPoint* findSecondClosestPoint(const Vector* Point, LinkedCell* LC)
     2802TesselPoint* FindSecondClosestPoint(const Vector* Point, LinkedCell* LC)
    28032803{
    28042804  LinkedNodes *List = NULL;
     
    28462846};
    28472847
    2848 
    2849 
    28502848/**
    28512849 * Finds the point which is closest to the provided one.
     
    28572855 * @return point which is closest to the provided one, NULL if none found
    28582856 */
    2859 TesselPoint* findClosestPoint(const Vector* Point, TesselPoint *&SecondPoint, LinkedCell* LC)
     2857TesselPoint* FindClosestPoint(const Vector* Point, TesselPoint *&SecondPoint, LinkedCell* LC)
    28602858{
    28612859  LinkedNodes *List = NULL;
     
    29042902  return closestPoint;
    29052903};
    2906 
    29072904
    29082905/**
     
    29712968}
    29722969
     2970/**
     2971 * Finds all degenerated triangles within the tesselation structure.
     2972 *
     2973 * @return map of keys of degenerated triangle pairs, each triangle occurs twice
     2974 *         in the list, once as key and once as value
     2975 */
     2976map<int, int> Tesselation::FindAllDegeneratedTriangles()
     2977{
     2978  map<int, int> DegeneratedTriangles;
     2979
     2980  // sanity check
     2981  if (LinesOnBoundary.empty()) {
     2982    cout << Verbose(1) << "Warning: FindAllDegeneratedTriangles() was called without any tesselation structure.";
     2983    return DegeneratedTriangles;
     2984  }
     2985
     2986  LineMap::iterator LineRunner1, LineRunner2;
     2987
     2988  for (LineRunner1 = LinesOnBoundary.begin(); LineRunner1 != LinesOnBoundary.end(); ++LineRunner1) {
     2989    for (LineRunner2 = LinesOnBoundary.begin(); LineRunner2 != LinesOnBoundary.end(); ++LineRunner2) {
     2990      if ((LineRunner1->second != LineRunner2->second)
     2991        && (LineRunner1->second->endpoints[0] == LineRunner2->second->endpoints[0])
     2992        && (LineRunner1->second->endpoints[1] == LineRunner2->second->endpoints[1])
     2993      ) {
     2994        TriangleMap::iterator TriangleRunner1 = LineRunner1->second->triangles.begin(),
     2995          TriangleRunner2 = LineRunner2->second->triangles.begin();
     2996
     2997        for (; TriangleRunner1 != LineRunner1->second->triangles.end(); ++TriangleRunner1) {
     2998          for (; TriangleRunner2 != LineRunner2->second->triangles.end(); ++TriangleRunner2) {
     2999            if ((TriangleRunner1->second != TriangleRunner2->second)
     3000              && (TriangleRunner1->second->endpoints[0] == TriangleRunner2->second->endpoints[0])
     3001              && (TriangleRunner1->second->endpoints[1] == TriangleRunner2->second->endpoints[1])
     3002              && (TriangleRunner1->second->endpoints[2] == TriangleRunner2->second->endpoints[2])
     3003            ) {
     3004              DegeneratedTriangles[TriangleRunner1->second->Nr] = TriangleRunner2->second->Nr;
     3005              DegeneratedTriangles[TriangleRunner2->second->Nr] = TriangleRunner1->second->Nr;
     3006            }
     3007          }
     3008        }
     3009      }
     3010    }
     3011  }
     3012
     3013  cout << Verbose(1) << "FindAllDegeneratedTriangles() found " << DegeneratedTriangles.size() << " triangles." << endl;
     3014  map<int,int>::iterator it;
     3015  for (it = DegeneratedTriangles.begin(); it != DegeneratedTriangles.end(); it++)
     3016      cout << Verbose(2) << (*it).first << " => " << (*it).second << endl;
     3017
     3018  return DegeneratedTriangles;
     3019}
     3020
     3021/**
     3022 * Purges degenerated triangles from the tesselation structure if they are not
     3023 * necessary to keep a single point within the structure.
     3024 */
     3025void Tesselation::RemoveDegeneratedTriangles()
     3026{
     3027  map<int, int> DegeneratedTriangles = FindAllDegeneratedTriangles();
     3028
     3029  for (map<int, int>::iterator TriangleKeyRunner = DegeneratedTriangles.begin();
     3030    TriangleKeyRunner != DegeneratedTriangles.end(); ++TriangleKeyRunner
     3031  ) {
     3032    BoundaryTriangleSet *triangle = TrianglesOnBoundary.find(TriangleKeyRunner->first)->second,
     3033      *partnerTriangle = TrianglesOnBoundary.find(TriangleKeyRunner->second)->second;
     3034
     3035    bool trianglesShareLine = false;
     3036    for (int i = 0; i < 3; ++i)
     3037      for (int j = 0; j < 3; ++j)
     3038        trianglesShareLine = trianglesShareLine || triangle->lines[i] == partnerTriangle->lines[j];
     3039
     3040    if (trianglesShareLine
     3041      && (triangle->endpoints[1]->LinesCount > 2)
     3042      && (triangle->endpoints[2]->LinesCount > 2)
     3043      && (triangle->endpoints[0]->LinesCount > 2)
     3044    ) {
     3045      cout << Verbose(1) << "RemoveDegeneratedTriangles() removes triangle " << *triangle << "." << endl;
     3046      RemoveTesselationTriangle(triangle);
     3047      cout << Verbose(1) << "RemoveDegeneratedTriangles() removes triangle " << *partnerTriangle << "." << endl;
     3048      RemoveTesselationTriangle(partnerTriangle);
     3049      DegeneratedTriangles.erase(DegeneratedTriangles.find(partnerTriangle->Nr));
     3050    } else {
     3051      cout << Verbose(1) << "RemoveDegeneratedTriangles() does not remove triangle " << *triangle
     3052        << " and its partner " << *partnerTriangle << " because it is essential for at"
     3053        << " least one of the endpoints to be kept in the tesselation structure." << endl;
     3054    }
     3055  }
     3056}
     3057
    29733058/** Gets the angle between a point and a reference relative to the provided center.
    29743059 * We have two shanks point and reference between which the angle is calculated
     
    29803065 * @return angle between point and reference
    29813066 */
    2982 double getAngle(const Vector &point, const Vector &reference, const Vector OrthogonalVector)
     3067double GetAngle(const Vector &point, const Vector &reference, const Vector OrthogonalVector)
    29833068{
    29843069  if (reference.IsZero())
Note: See TracChangeset for help on using the changeset viewer.