From 9202d205df76630e1aa99d28677dcfc4b8d061cd Mon Sep 17 00:00:00 2001 From: zzzzrrr Date: Wed, 20 Jan 2010 15:36:05 -0500 Subject: [PATCH] bug hunting --- poly2tri/common/shapes.h | 10 ++- poly2tri/sweep/advancing_front.cc | 9 +- poly2tri/sweep/advancing_front.h | 1 + poly2tri/sweep/sweep.cc | 133 +++++++++--------------------- poly2tri/sweep/sweep.h | 24 +++--- poly2tri/sweep/sweep_context.cc | 8 +- testbed/main.cc | 54 ++++++------ 7 files changed, 95 insertions(+), 144 deletions(-) diff --git a/poly2tri/common/shapes.h b/poly2tri/common/shapes.h index fb666e2..5ba58a3 100644 --- a/poly2tri/common/shapes.h +++ b/poly2tri/common/shapes.h @@ -50,7 +50,7 @@ struct Point { Point() { x = 0.0; y = 0.0; } /// The edges this point constitutes an upper ending point - std::vector edge_list; + std::vector edge_list; /// Construct using coordinates. Point(double x, double y) : x(x), y(y) {} @@ -91,6 +91,10 @@ struct Point { y /= len; return len; } + + void DebugPrint() { + printf("%f,%f ", x, y); + } }; @@ -115,8 +119,8 @@ struct Edge { } } - q->edge_list.push_back(*this); - //printf("%i\n", q->edge_list.size()); + q->edge_list.push_back(this); + } }; diff --git a/poly2tri/sweep/advancing_front.cc b/poly2tri/sweep/advancing_front.cc index 27a5ba3..c0accd8 100644 --- a/poly2tri/sweep/advancing_front.cc +++ b/poly2tri/sweep/advancing_front.cc @@ -30,11 +30,16 @@ */ #include "advancing_front.h" -Node* AdvancingFront::Locate(const double& x) { +AdvancingFront::AdvancingFront() { + head_ = tail_ = search_node_ = NULL; +} +Node* AdvancingFront::Locate(const double& x) { + Node* node = search_node_; if(x < node->value) { + //printf("<: - %f,%f - %p\n", x, node->value, node->next); while((node = node->prev) != NULL) { if(x >= node->value) { search_node_ = node; @@ -42,6 +47,8 @@ Node* AdvancingFront::Locate(const double& x) { } } } else { + //printf("%p - %p\n", node, node->next); + //printf(">: %f - %f\n", x, node->value); while((node = node->next) != NULL) { if(x < node->value) { search_node_ = node->prev; diff --git a/poly2tri/sweep/advancing_front.h b/poly2tri/sweep/advancing_front.h index 871c549..3468618 100644 --- a/poly2tri/sweep/advancing_front.h +++ b/poly2tri/sweep/advancing_front.h @@ -63,6 +63,7 @@ class AdvancingFront { public: + AdvancingFront(); // Destructor ~AdvancingFront(); diff --git a/poly2tri/sweep/sweep.cc b/poly2tri/sweep/sweep.cc index b117e04..dd7b751 100644 --- a/poly2tri/sweep/sweep.cc +++ b/poly2tri/sweep/sweep.cc @@ -40,7 +40,7 @@ void Sweep::Triangulate(SweepContext& tcx) { // Sweep points; build mesh SweepPoints(tcx); // Clean up - FinalizationPolygon(tcx); + //FinalizationPolygon(tcx); } @@ -48,13 +48,15 @@ void Sweep::SweepPoints(SweepContext& tcx) { for(int i = 1; i < tcx.point_count(); i++ ) { + //printf("%i = ",i); Point& point = *tcx.GetPoint(i); - Node& node = PointEvent(tcx, point); + //printf("size = %i\n", point.edge_list.size()); + Node& node = PointEvent(tcx, point); for(int i = 0; i < point.edge_list.size(); i++) { EdgeEvent(tcx, point.edge_list[i], node); } - + } } @@ -85,7 +87,7 @@ Node& Sweep::PointEvent(SweepContext& tcx, Point& point) { Node& node = tcx.LocateNode(point); Node& new_node = NewFrontTriangle(tcx, point, node); - + // Only need to check +epsilon since point never have smaller // x value than node due to how we fetch nodes from the front if(point.x <= node.point->x + EPSILON) { @@ -93,17 +95,17 @@ Node& Sweep::PointEvent(SweepContext& tcx, Point& point) { } //tcx.AddNode(new_node); - + FillAdvancingFront(tcx, new_node); return new_node; } -void Sweep::EdgeEvent(SweepContext& tcx, Edge& edge, Node& node) { +void Sweep::EdgeEvent(SweepContext& tcx, Edge* edge, Node& node) { - tcx.edge_event.constrained_edge = &edge; - tcx.edge_event.right = edge.p->x > edge.q->x; + tcx.edge_event.constrained_edge = edge; + tcx.edge_event.right = edge->p->x > edge->q->x; - if(IsEdgeSideOfTriangle(*node.triangle, *edge.p, *edge.q)){ + if(IsEdgeSideOfTriangle(*node.triangle, *edge->p, *edge->q)){ return; } @@ -111,12 +113,12 @@ void Sweep::EdgeEvent(SweepContext& tcx, Edge& edge, Node& node) { // TODO: integrate with flip process might give some better performance // but for now this avoid the issue with cases that needs both flips and fills FillEdgeEvent(tcx, edge, node); - EdgeEvent(tcx, *edge.p, *edge.q , node.triangle, *edge.q); - + EdgeEvent(tcx, *edge->p, *edge->q , node.triangle, *edge->q); + } void Sweep::EdgeEvent(SweepContext& tcx, Point& ep, Point& eq, Triangle* triangle, Point& point) { - + if(IsEdgeSideOfTriangle(*triangle, ep, eq)) { return; } @@ -154,6 +156,7 @@ void Sweep::EdgeEvent(SweepContext& tcx, Point& ep, Point& eq, Triangle* triangl bool Sweep::IsEdgeSideOfTriangle(Triangle& triangle, Point& ep, Point& eq) { int index = triangle.EdgeIndex(&ep, &eq); + if(index != -1) { triangle.MarkConstrainedEdge(index); Triangle* t = triangle.GetNeighbor(index); @@ -179,7 +182,7 @@ Node& Sweep::NewFrontTriangle(SweepContext& tcx, Point& point, Node& node ) { node.next = new_node; if(!Legalize(tcx, *triangle)) { - tcx.MapTriangleToNodes(*triangle); + tcx.MapTriangleToNodes(*triangle); } return *new_node; @@ -578,69 +581,7 @@ bool Sweep::IsShallow(SweepContext& tcx, Node& node) { return false; } -void Sweep::FinalizationConvexHull(SweepContext& tcx) { - - Node& n1 = *tcx.front()->head()->next; - Node& n2 = *n1.next; - Node& n3 = *n2.next; - Point& first = *n1.point; - - TurnAdvancingFrontConvex(tcx, n2, n3); - - // TODO: implement ConvexHull for lower right and left boundary - // Lower right boundary - first = *tcx.front()->head()->point; - n2 = *tcx.front()->tail()->prev; - Triangle& t1 = *n2.triangle; - Point& p1 = *n2.point; - - do { - tcx.RemoveFromMap(&t1); - p1 = *t1.PointCCW(p1); - if(p1 == first) break; - t1 = *t1.NeighborCCW(p1); - } while(true); - - // Lower left boundary - first = *tcx.front()->head()->next->point; - p1 = *t1.PointCW(*tcx.front()->head()->point); - t1 = *t1.NeighborCW(*tcx.front()->head()->point); - do { - tcx.RemoveFromMap(&t1); - p1 = *t1.PointCCW(p1); - t1 = *t1.NeighborCCW(p1); - } while(p1 != first); - - //tcx.FinalizeTriangulation(); - -} - -void Sweep::TurnAdvancingFrontConvex(SweepContext& tcx, Node& b, Node& c) { - - Node& first = b; - - while(&c != tcx.front()->tail()) { - - if(Orient2d(*b.point, *c.point, *c.next->point) == CCW) { - // [b,c,d] Concave - fill around c - Fill(tcx, c); - c = *c.next; - } else { - // [b,c,d] Convex - if(&b != &first && Orient2d(*b.prev->point, *b.point, *c.point) == CCW) { - // [a,b,c] Concave - fill around b - Fill(tcx, b); - b = *b.prev; - } else { - // [a,b,c] Convex - nothing to fill - b = c; - c = *c.next; - } - } - } -} - -void Sweep::FillEdgeEvent(SweepContext& tcx, Edge& edge, Node& node) { +void Sweep::FillEdgeEvent(SweepContext& tcx, Edge* edge, Node& node) { if(tcx.edge_event.right) { FillRightAboveEdgeEvent(tcx, edge, node); @@ -650,11 +591,11 @@ void Sweep::FillEdgeEvent(SweepContext& tcx, Edge& edge, Node& node) { } -void Sweep::FillRightAboveEdgeEvent(SweepContext& tcx, Edge& edge, Node& node) { +void Sweep::FillRightAboveEdgeEvent(SweepContext& tcx, Edge* edge, Node& node) { - while(node.next->point->x < edge.p->x) { + while(node.next->point->x < edge->p->x) { // Check if next node is below the edge - if(Orient2d(*edge.q, *node.next->point, *edge.p) == CCW) { + if(Orient2d(*edge->q, *node.next->point, *edge->p) == CCW) { FillRightBelowEdgeEvent(tcx, edge, node); } else { node = *node.next; @@ -663,9 +604,9 @@ void Sweep::FillRightAboveEdgeEvent(SweepContext& tcx, Edge& edge, Node& node) { } -void Sweep::FillRightBelowEdgeEvent(SweepContext& tcx, Edge& edge, Node& node) { +void Sweep::FillRightBelowEdgeEvent(SweepContext& tcx, Edge* edge, Node& node) { - if(node.point->x < edge.p->x) { + if(node.point->x < edge->p->x) { if(Orient2d(*node.point, *node.next->point, *node.next->next->point ) == CCW ) { // Concave FillRightConcaveEdgeEvent(tcx, edge, node ); @@ -679,12 +620,12 @@ void Sweep::FillRightBelowEdgeEvent(SweepContext& tcx, Edge& edge, Node& node) { } -void Sweep::FillRightConcaveEdgeEvent(SweepContext& tcx, Edge& edge, Node& node) { +void Sweep::FillRightConcaveEdgeEvent(SweepContext& tcx, Edge* edge, Node& node) { Fill(tcx, *node.next); - if(node.next->point != edge.p) { + if(node.next->point != edge->p) { // Next above or below edge? - if(Orient2d(*edge.q, *node.next->point, *edge.p) == CCW) { + if(Orient2d(*edge->q, *node.next->point, *edge->p) == CCW) { // Below if(Orient2d(*node.point, *node.next->point, *node.next->next->point) == CCW) { // Next is concave @@ -697,7 +638,7 @@ void Sweep::FillRightConcaveEdgeEvent(SweepContext& tcx, Edge& edge, Node& node) } -void Sweep::FillRightConvexEdgeEvent(SweepContext& tcx, Edge& edge, Node& node) { +void Sweep::FillRightConvexEdgeEvent(SweepContext& tcx, Edge* edge, Node& node) { // Next concave or convex? if(Orient2d(*node.next->point, *node.next->next->point, *node.next->next->next->point ) == CCW) { @@ -706,7 +647,7 @@ void Sweep::FillRightConvexEdgeEvent(SweepContext& tcx, Edge& edge, Node& node) } else{ // Convex // Next above or below edge? - if(Orient2d(*edge.q, *node.next->next->point, *edge.p) == CCW) { + if(Orient2d(*edge->q, *node.next->next->point, *edge->p) == CCW) { // Below FillRightConvexEdgeEvent(tcx, edge, *node.next); } else{ @@ -716,11 +657,11 @@ void Sweep::FillRightConvexEdgeEvent(SweepContext& tcx, Edge& edge, Node& node) } -void Sweep::FillLeftAboveEdgeEvent(SweepContext& tcx, Edge& edge, Node& node) { +void Sweep::FillLeftAboveEdgeEvent(SweepContext& tcx, Edge* edge, Node& node) { - while(node.prev->point->x > edge.p->x) { + while(node.prev->point->x > edge->p->x) { // Check if next node is below the edge - if(Orient2d(*edge.q, *node.prev->point, *edge.p) == CW) { + if(Orient2d(*edge->q, *node.prev->point, *edge->p) == CW) { FillLeftBelowEdgeEvent(tcx, edge, node); } else { node = *node.prev; @@ -729,9 +670,9 @@ void Sweep::FillLeftAboveEdgeEvent(SweepContext& tcx, Edge& edge, Node& node) { } -void Sweep::FillLeftBelowEdgeEvent(SweepContext& tcx, Edge& edge, Node& node) { +void Sweep::FillLeftBelowEdgeEvent(SweepContext& tcx, Edge* edge, Node& node) { - if( node.point->x > edge.p->x) { + if( node.point->x > edge->p->x) { if(Orient2d(*node.point, *node.prev->point, *node.prev->prev->point) == CW ) { // Concave FillLeftConcaveEdgeEvent(tcx, edge, node); @@ -745,7 +686,7 @@ void Sweep::FillLeftBelowEdgeEvent(SweepContext& tcx, Edge& edge, Node& node) { } } -void Sweep::FillLeftConvexEdgeEvent(SweepContext& tcx, Edge& edge, Node& node) { +void Sweep::FillLeftConvexEdgeEvent(SweepContext& tcx, Edge* edge, Node& node) { // Next concave or convex? if(Orient2d(*node.prev->point, *node.prev->prev->point, *node.prev->prev->prev->point) == CW) { @@ -754,7 +695,7 @@ void Sweep::FillLeftConvexEdgeEvent(SweepContext& tcx, Edge& edge, Node& node) { } else { // Convex // Next above or below edge? - if(Orient2d(*edge.q, *node.prev->prev->point, *edge.p) == CW) { + if(Orient2d(*edge->q, *node.prev->prev->point, *edge->p) == CW) { // Below FillLeftConvexEdgeEvent(tcx, edge, *node.prev); } else { @@ -763,12 +704,12 @@ void Sweep::FillLeftConvexEdgeEvent(SweepContext& tcx, Edge& edge, Node& node) { } } -void Sweep::FillLeftConcaveEdgeEvent(SweepContext& tcx, Edge& edge, Node& node) { +void Sweep::FillLeftConcaveEdgeEvent(SweepContext& tcx, Edge* edge, Node& node) { Fill(tcx, *node.prev); - if(node.prev->point != edge.p) { + if(node.prev->point != edge->p) { // Next above or below edge? - if(Orient2d(*edge.q, *node.prev->point, *edge.p) == CW) { + if(Orient2d(*edge->q, *node.prev->point, *edge->p) == CW) { // Below if(Orient2d(*node.point, *node.prev->point, *node.prev->prev->point) == CW) { // Next is concave diff --git a/poly2tri/sweep/sweep.h b/poly2tri/sweep/sweep.h index 53002f7..00d8a69 100644 --- a/poly2tri/sweep/sweep.h +++ b/poly2tri/sweep/sweep.h @@ -55,7 +55,7 @@ private: Node& PointEvent(SweepContext& tcx, Point& point); - void EdgeEvent(SweepContext& tcx, Edge& edge, Node& node); + void EdgeEvent(SweepContext& tcx, Edge* edge, Node& node); void EdgeEvent(SweepContext& tcx, Point& ep, Point& eq, Triangle* triangle, Point& point); @@ -80,30 +80,26 @@ private: void FillBasinReq(SweepContext& tcx, Node& node); bool IsShallow(SweepContext& tcx, Node& node); - - void FinalizationConvexHull(SweepContext& tcx); - - void TurnAdvancingFrontConvex(SweepContext& tcx, Node& b, Node& c); bool IsEdgeSideOfTriangle(Triangle& triangle, Point& ep, Point& eq); - void FillEdgeEvent(SweepContext& tcx, Edge& edge, Node& node); + void FillEdgeEvent(SweepContext& tcx, Edge* edge, Node& node); - void FillRightAboveEdgeEvent(SweepContext& tcx, Edge& edge, Node& node); + void FillRightAboveEdgeEvent(SweepContext& tcx, Edge* edge, Node& node); - void FillRightBelowEdgeEvent(SweepContext& tcx, Edge& edge, Node& node); + void FillRightBelowEdgeEvent(SweepContext& tcx, Edge* edge, Node& node); - void FillRightConcaveEdgeEvent(SweepContext& tcx, Edge& edge, Node& node); + void FillRightConcaveEdgeEvent(SweepContext& tcx, Edge* edge, Node& node); - void FillRightConvexEdgeEvent(SweepContext& tcx, Edge& edge, Node& node); + void FillRightConvexEdgeEvent(SweepContext& tcx, Edge* edge, Node& node); - void FillLeftAboveEdgeEvent(SweepContext& tcx, Edge& edge, Node& node); + void FillLeftAboveEdgeEvent(SweepContext& tcx, Edge* edge, Node& node); - void FillLeftBelowEdgeEvent(SweepContext& tcx, Edge& edge, Node& node); + void FillLeftBelowEdgeEvent(SweepContext& tcx, Edge* edge, Node& node); - void FillLeftConcaveEdgeEvent(SweepContext& tcx, Edge& edge, Node& node); + void FillLeftConcaveEdgeEvent(SweepContext& tcx, Edge* edge, Node& node); - void FillLeftConvexEdgeEvent(SweepContext& tcx, Edge& edge, Node& node); + void FillLeftConvexEdgeEvent(SweepContext& tcx, Edge* edge, Node& node); void FlipEdgeEvent(SweepContext& tcx, Point& ep, Point& eq, Triangle& t, Point& p); diff --git a/poly2tri/sweep/sweep_context.cc b/poly2tri/sweep/sweep_context.cc index 761829c..9283493 100644 --- a/poly2tri/sweep/sweep_context.cc +++ b/poly2tri/sweep/sweep_context.cc @@ -47,7 +47,7 @@ void SweepContext::InitTriangulation() { double dy = kAlpha * ( ymax - ymin ); head_ = new Point(xmax + dx, ymin - dy); tail_ = new Point(xmin - dx, ymin - dy); - + // Sort points along y-axis double init_time = glfwGetTime(); std::sort(points_, points_ + point_count_, cmp); @@ -57,12 +57,13 @@ void SweepContext::InitTriangulation() { /* printf("*************************\n"); for(int i = 0; i < point_count_; i++) { - printf("%p ", points_[i]); - printf("%f,%f\n", points_[i]->x, points_[i]->y); + printf("%f,%f ", points_[i]->x, points_[i]->y); + printf("%p\n", points_[i]); } printf("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); for(int i = 0; i < edge_list.size(); i++) { + edge_list[i]->p->DebugPrint(); edge_list[i]->q->DebugPrint(); printf("%p, %p\n", edge_list[i]->p, edge_list[i]->q); } */ @@ -78,6 +79,7 @@ void SweepContext::InitEdges(Point** polyline, const int& point_count) { /* for(int i = 0; i < edge_list.size(); i++) { + edge_list[i]->p->DebugPrint(); edge_list[i]->q->DebugPrint(); printf("%p, %p\n", edge_list[i]->p, edge_list[i]->q); } */ diff --git a/testbed/main.cc b/testbed/main.cc index 4aa2cdd..6f69447 100644 --- a/testbed/main.cc +++ b/testbed/main.cc @@ -66,7 +66,7 @@ double StringToDouble(const std::string& s) { return x; } -bool draw_map = false; +bool draw_map = true; int main(int argc, char* argv[]) { @@ -150,7 +150,7 @@ void Init() if (glfwOpenWindow(window_width, window_height, 5, 6, 5, 0, 0, 0, GLFW_WINDOW) != GL_TRUE) ShutDown(1); - glfwSetWindowTitle("The GLFW Window"); + glfwSetWindowTitle("Poly2Tri - C++"); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); @@ -240,23 +240,14 @@ void Draw(const double zoom) { Point& b = *t.GetPoint(1); Point& c = *t.GetPoint(2); - ConstrainedColor(t.constrained_edge[2]); - glBegin(GL_LINES); - glVertex2f(a.x, a.y); - glVertex2f(b.x, b.y); - glEnd( ); - - ConstrainedColor(t.constrained_edge[0]); - glBegin(GL_LINES); - glVertex2f(b.x, b.y); - glVertex2f(c.x, c.y); - glEnd( ); - - ConstrainedColor(t.constrained_edge[1]); - glBegin(GL_LINES); - glVertex2f(c.x, c.y); - glVertex2f(a.x, a.y); - glEnd( ); + // Red + glColor3f(1, 0, 0); + + glBegin(GL_LINE_LOOP); + glVertex2f(a.x, a.y); + glVertex2f(b.x, b.y); + glVertex2f(c.x, c.y); + glEnd(); } @@ -277,14 +268,23 @@ void DrawMap(const double zoom) { Point& b = *t.GetPoint(1); Point& c = *t.GetPoint(2); - // Red - glColor3f(1, 0, 0); - - glBegin(GL_LINE_LOOP); - glVertex2f(a.x, a.y); - glVertex2f(b.x, b.y); - glVertex2f(c.x, c.y); - glEnd(); + ConstrainedColor(t.constrained_edge[2]); + glBegin(GL_LINES); + glVertex2f(a.x, a.y); + glVertex2f(b.x, b.y); + glEnd( ); + + ConstrainedColor(t.constrained_edge[0]); + glBegin(GL_LINES); + glVertex2f(b.x, b.y); + glVertex2f(c.x, c.y); + glEnd( ); + + ConstrainedColor(t.constrained_edge[1]); + glBegin(GL_LINES); + glVertex2f(c.x, c.y); + glVertex2f(a.x, a.y); + glEnd( ); }