Revision: 54528
          http://brlcad.svn.sourceforge.net/brlcad/?rev=54528&view=rev
Author:   indianlarry
Date:     2013-03-04 17:28:50 +0000 (Mon, 04 Mar 2013)
Log Message:
-----------
Added function AddPointCheckForDuplicates() to class SweepContext to extend the 
package to check for duplicates in both the constrained polygon inputs 
(SweepContext(std::vector<Point*> &polyline) constructor, AddOuterLoop() and 
AddHole() functions) or from the new AddPointCheckForDuplicatees().

Modified Paths:
--------------
    brlcad/trunk/src/other/poly2tri/poly2tri/sweep/sweep_context.cc
    brlcad/trunk/src/other/poly2tri/poly2tri/sweep/sweep_context.h

Modified: brlcad/trunk/src/other/poly2tri/poly2tri/sweep/sweep_context.cc
===================================================================
--- brlcad/trunk/src/other/poly2tri/poly2tri/sweep/sweep_context.cc     
2013-03-04 17:06:14 UTC (rev 54527)
+++ brlcad/trunk/src/other/poly2tri/poly2tri/sweep/sweep_context.cc     
2013-03-04 17:28:50 UTC (rev 54528)
@@ -34,41 +34,75 @@
 
 namespace p2t {
 
+bool SweepContext::lessthanpoint::operator() (const Point* a, const Point* b) 
const
+{
+    if (a->y < b->y) {
+       return true;
+    } else if (a->y == b->y) {
+       return (a->x < b->x);
+    }
+    return false;
+}
+
 SweepContext::SweepContext()
 {
   basin = Basin();
   edge_event = EdgeEvent();
 }
 
-SweepContext::SweepContext(std::vector<Point*> &polyline) : points_(polyline)
+SweepContext::SweepContext(std::vector<Point*> &polyline)
 {
+  std::vector<Point*> polylineunique;
 
   basin = Basin();
   edge_event = EdgeEvent();
 
-  InitEdges(points_);
+  for(unsigned int i = 0; i < polyline.size(); i++) {
+    Point *p = AddPointCheckForDuplicates(polyline[i]);
+    polylineunique.push_back(p);
+  }
+  InitEdges(polylineunique);
+
 }
 
 void SweepContext::AddOuterLoop(std::vector<Point*> &polyline)
 {
-  InitEdges(polyline);
+  std::vector<Point*> polylineunique;
   for(unsigned int i = 0; i < polyline.size(); i++) {
-    points_.push_back(polyline[i]);
+    Point *p = AddPointCheckForDuplicates(polyline[i]);
+    polylineunique.push_back(p);
   }
+  InitEdges(polylineunique);
+
 }
 
 void SweepContext::AddHole(std::vector<Point*> &polyline)
 {
-  InitEdges(polyline);
+  std::vector<Point*> polylineunique;
   for(unsigned int i = 0; i < polyline.size(); i++) {
-    points_.push_back(polyline[i]);
+    Point *p = AddPointCheckForDuplicates(polyline[i]);
+    polylineunique.push_back(p);
   }
+  InitEdges(polylineunique);
 }
 
 void SweepContext::AddPoint(Point* point) {
   points_.push_back(point);
 }
 
+Point* SweepContext::AddPointCheckForDuplicates(Point* point) {
+    std::pair<std::set<Point*,lessthanpoint>::iterator,bool> result;
+
+    result = points_set_.insert(point);
+    if (result.second) {
+       points_.push_back(point);
+       return point;
+    }
+    Point* found_point = *points_set_.find(point);
+    delete point;
+    return found_point;
+}
+
 std::vector<Triangle*>& SweepContext::GetTriangles()
 {
   return triangles_;
@@ -214,6 +248,7 @@
         delete edge_list[i];
     }
     points_.clear();
+    points_set_.clear();
 }
 
 }
\ No newline at end of file

Modified: brlcad/trunk/src/other/poly2tri/poly2tri/sweep/sweep_context.h
===================================================================
--- brlcad/trunk/src/other/poly2tri/poly2tri/sweep/sweep_context.h      
2013-03-04 17:06:14 UTC (rev 54527)
+++ brlcad/trunk/src/other/poly2tri/poly2tri/sweep/sweep_context.h      
2013-03-04 17:28:50 UTC (rev 54528)
@@ -33,6 +33,7 @@
 #define SWEEP_CONTEXT_H
 
 #include <list>
+#include <set>
 #include <vector>
 #include <cstddef>
 
@@ -88,6 +89,7 @@
 void AddHole(std::vector<Point*> &polyline);
 
 void AddPoint(Point* point);
+Point* AddPointCheckForDuplicates(Point* point);
 
 AdvancingFront* front();
 
@@ -128,6 +130,11 @@
   }
 };
 
+struct lessthanpoint{
+public:
+    bool operator() (const Point* a, const Point* b) const;
+};
+
 Basin basin;
 EdgeEvent edge_event;
 
@@ -138,6 +145,7 @@
 std::vector<Triangle*> triangles_;
 std::list<Triangle*> map_;
 std::vector<Point*> points_;
+std::set<Point*,lessthanpoint> points_set_;
 
 // Advancing front
 AdvancingFront* front_;

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_feb
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to