mirror of
				https://github.com/jhasse/poly2tri.git
				synced 2025-11-04 14:09:33 +01:00 
			
		
		
		
	add holes to API
This commit is contained in:
		@@ -32,14 +32,15 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
namespace p2t {
 | 
					namespace p2t {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CDT::CDT(Point** polyline, const int& point_count)
 | 
					CDT::CDT(std::vector<Point*> polyline)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  sweep_context_ = new SweepContext(polyline, point_count);
 | 
					  sweep_context_ = new SweepContext(polyline);
 | 
				
			||||||
  sweep_ = new Sweep;
 | 
					  sweep_ = new Sweep;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void CDT::AddHole(const Point poly_line[], const int point_count)
 | 
					void CDT::AddHole(std::vector<Point*> polyline)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					  sweep_context_->AddHole(polyline);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void CDT::Triangulate()
 | 
					void CDT::Triangulate()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -39,9 +39,9 @@ class CDT
 | 
				
			|||||||
public:
 | 
					public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Constructor
 | 
					/// Constructor
 | 
				
			||||||
CDT(Point** poly_line, const int& point_count);
 | 
					CDT(std::vector<Point*> polyline);
 | 
				
			||||||
/// Add a hole
 | 
					/// Add a hole
 | 
				
			||||||
void AddHole(const Point poly_line[], const int point_count);
 | 
					void AddHole(std::vector<Point*> polyline);
 | 
				
			||||||
/// Triangulate points
 | 
					/// Triangulate points
 | 
				
			||||||
void Triangulate();
 | 
					void Triangulate();
 | 
				
			||||||
/// Get Delaunay triangles
 | 
					/// Get Delaunay triangles
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -38,6 +38,7 @@ namespace p2t {
 | 
				
			|||||||
// Triangulate simple polygon with holes
 | 
					// Triangulate simple polygon with holes
 | 
				
			||||||
void Sweep::Triangulate(SweepContext& tcx)
 | 
					void Sweep::Triangulate(SweepContext& tcx)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					  tcx.InitTriangulation();
 | 
				
			||||||
  tcx.CreateAdvancingFront();
 | 
					  tcx.CreateAdvancingFront();
 | 
				
			||||||
  // Sweep points; build mesh
 | 
					  // Sweep points; build mesh
 | 
				
			||||||
  SweepPoints(tcx);
 | 
					  SweepPoints(tcx);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,16 +35,22 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
namespace p2t {
 | 
					namespace p2t {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SweepContext::SweepContext(Point** polyline, const int& point_count)
 | 
					SweepContext::SweepContext(std::vector<Point*> polyline)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  basin = Basin();
 | 
					  basin = Basin();
 | 
				
			||||||
  edge_event = EdgeEvent();
 | 
					  edge_event = EdgeEvent();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  points_ = polyline;
 | 
					  points_ = polyline;
 | 
				
			||||||
  point_count_ = point_count;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  InitEdges(points_, point_count_);
 | 
					  InitEdges(points_);
 | 
				
			||||||
  InitTriangulation();
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void SweepContext::AddHole(std::vector<Point*> polyline)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  InitEdges(polyline);
 | 
				
			||||||
 | 
					  for(int i = 0; i < polyline.size(); i++) {
 | 
				
			||||||
 | 
					    points_.push_back(polyline[i]);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
std::vector<Triangle*> SweepContext::GetTriangles()
 | 
					std::vector<Triangle*> SweepContext::GetTriangles()
 | 
				
			||||||
@@ -63,8 +69,8 @@ void SweepContext::InitTriangulation()
 | 
				
			|||||||
  double ymax(points_[0]->y), ymin(points_[0]->y);
 | 
					  double ymax(points_[0]->y), ymin(points_[0]->y);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Calculate bounds.
 | 
					  // Calculate bounds.
 | 
				
			||||||
  for (int i = 0; i < point_count_; i++) {
 | 
					  for (int i = 0; i < points_.size(); i++) {
 | 
				
			||||||
    Point p = *points_[i];
 | 
					    Point& p = *points_[i];
 | 
				
			||||||
    if (p.x > xmax)
 | 
					    if (p.x > xmax)
 | 
				
			||||||
      xmax = p.x;
 | 
					      xmax = p.x;
 | 
				
			||||||
    if (p.x < xmin)
 | 
					    if (p.x < xmin)
 | 
				
			||||||
@@ -81,14 +87,15 @@ void SweepContext::InitTriangulation()
 | 
				
			|||||||
  tail_ = new Point(xmin - dx, ymin - dy);
 | 
					  tail_ = new Point(xmin - dx, ymin - dy);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Sort points along y-axis
 | 
					  // Sort points along y-axis
 | 
				
			||||||
  std::sort(points_, points_ + point_count_, cmp);
 | 
					  std::sort(points_.begin(), points_.end(), cmp);
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void SweepContext::InitEdges(Point** polyline, const int& point_count)
 | 
					void SweepContext::InitEdges(std::vector<Point*> polyline)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  for (int i = 0; i < point_count; i++) {
 | 
					  int num_points = polyline.size();
 | 
				
			||||||
    int j = i < point_count - 1 ? i + 1 : 0;
 | 
					  for (int i = 0; i < num_points; i++) {
 | 
				
			||||||
 | 
					    int j = i < num_points - 1 ? i + 1 : 0;
 | 
				
			||||||
    edge_list.push_back(new Edge(*polyline[i], *polyline[j]));
 | 
					    edge_list.push_back(new Edge(*polyline[i], *polyline[j]));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -47,7 +47,7 @@ class SweepContext {
 | 
				
			|||||||
public:
 | 
					public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Constructor
 | 
					// Constructor
 | 
				
			||||||
SweepContext(Point** polyline, const int& point_count);
 | 
					SweepContext(std::vector<Point*> polyline);
 | 
				
			||||||
// Destructor
 | 
					// Destructor
 | 
				
			||||||
~SweepContext();
 | 
					~SweepContext();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -74,6 +74,8 @@ Point* GetPoints();
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void RemoveFromMap(Triangle* triangle);
 | 
					void RemoveFromMap(Triangle* triangle);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void AddHole(std::vector<Point*> polyline);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
AdvancingFront* front();
 | 
					AdvancingFront* front();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void MeshClean(Triangle& triangle);
 | 
					void MeshClean(Triangle& triangle);
 | 
				
			||||||
@@ -118,11 +120,12 @@ EdgeEvent edge_event;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					friend class Sweep;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
std::vector<Triangle*> triangles_;
 | 
					std::vector<Triangle*> triangles_;
 | 
				
			||||||
std::list<Triangle*> map_;
 | 
					std::list<Triangle*> map_;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Point** points_;
 | 
					std::vector<Point*> points_;
 | 
				
			||||||
int point_count_;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Advancing front
 | 
					// Advancing front
 | 
				
			||||||
AdvancingFront* front_;
 | 
					AdvancingFront* front_;
 | 
				
			||||||
@@ -134,7 +137,7 @@ Point* tail_;
 | 
				
			|||||||
//EdgeEvent edgeEvent = new EdgeEvent();
 | 
					//EdgeEvent edgeEvent = new EdgeEvent();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void InitTriangulation();
 | 
					void InitTriangulation();
 | 
				
			||||||
void InitEdges(Point** polyline, const int& point_count);
 | 
					void InitEdges(std::vector<Point*> polyline);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -145,7 +148,7 @@ inline AdvancingFront* SweepContext::front()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
inline int SweepContext::point_count()
 | 
					inline int SweepContext::point_count()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return point_count_;
 | 
					  return points_.size();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
inline void SweepContext::set_head(Point* p1)
 | 
					inline void SweepContext::set_head(Point* p1)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -122,19 +122,13 @@ int main(int argc, char* argv[])
 | 
				
			|||||||
    cout << "File not opened" << endl;
 | 
					    cout << "File not opened" << endl;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  int num_points = points.size();
 | 
					  cout << "Number of points = " << points.size() << endl;
 | 
				
			||||||
  cout << "Number of points = " << num_points << endl;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Point** polyline = new Point *[num_points];
 | 
					 | 
				
			||||||
  for (int i = 0; i < num_points; i++) {
 | 
					 | 
				
			||||||
    polyline[i] = points[i];
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Init();
 | 
					  Init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Perform triangulation
 | 
					  // Perform triangulation
 | 
				
			||||||
  double init_time = glfwGetTime();
 | 
					  double init_time = glfwGetTime();
 | 
				
			||||||
  CDT * cdt = new CDT(polyline, num_points);
 | 
					  CDT * cdt = new CDT(points);
 | 
				
			||||||
  cdt->Triangulate();
 | 
					  cdt->Triangulate();
 | 
				
			||||||
  double dt = glfwGetTime() - init_time;
 | 
					  double dt = glfwGetTime() - init_time;
 | 
				
			||||||
  cout << "Elapsed time (secs) = " << dt << endl;
 | 
					  cout << "Elapsed time (secs) = " << dt << endl;
 | 
				
			||||||
@@ -144,7 +138,6 @@ int main(int argc, char* argv[])
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  MainLoop(atof(argv[4]));
 | 
					  MainLoop(atof(argv[4]));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  delete [] polyline;
 | 
					 | 
				
			||||||
  ShutDown(0);
 | 
					  ShutDown(0);
 | 
				
			||||||
  return 0;
 | 
					  return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user