Revision: 52718
          http://brlcad.svn.sourceforge.net/brlcad/?rev=52718&view=rev
Author:   bob1961
Date:     2012-10-03 14:31:43 +0000 (Wed, 03 Oct 2012)
Log Message:
-----------
More tweaks to ged_polygons_overlap() to handle more cases.

Modified Paths:
--------------
    brlcad/trunk/src/libged/polyclip.cpp

Modified: brlcad/trunk/src/libged/polyclip.cpp
===================================================================
--- brlcad/trunk/src/libged/polyclip.cpp        2012-10-03 14:30:44 UTC (rev 
52717)
+++ brlcad/trunk/src/libged/polyclip.cpp        2012-10-03 14:31:43 UTC (rev 
52718)
@@ -651,6 +651,7 @@
                point_t B, C;
                vect_t BmA, CmA;
                vect_t vcross;
+               int on_contour = 0;
 
                for (beginA = 0; beginA < polyA_2d.p_contour[j].pc_num_points; 
++beginA) {
                    if (beginA == polyA_2d.p_contour[j].pc_num_points-1)
@@ -658,21 +659,23 @@
                    else
                        endA = beginA + 1;
 
-                   if (V2NEAR_EQUAL(polyA_2d.p_contour[j].pc_point[beginA], 
pt_2d, tol_dist_sq) ||
-                       V2NEAR_EQUAL(polyA_2d.p_contour[j].pc_point[endA], 
pt_2d, tol_dist_sq)) {
+                   if (!on_contour &&
+                       (V2NEAR_EQUAL(polyA_2d.p_contour[j].pc_point[beginA], 
pt_2d, tol_dist_sq) ||
+                        V2NEAR_EQUAL(polyA_2d.p_contour[j].pc_point[endA], 
pt_2d, tol_dist_sq))) {
                        /* pt_2d is the same as one of the end points, so count 
it */
                        ++winding;
-                       goto endA;
+                       on_contour = 1;
+                       continue;
                    }
 
                    if ((polyA_2d.p_contour[j].pc_point[beginA][1] <= pt_2d[1] 
&&
-                        polyA_2d.p_contour[j].pc_point[endA][1] >= pt_2d[1])) {
+                        polyA_2d.p_contour[j].pc_point[endA][1] > pt_2d[1])) {
                        V2MOVE(B, polyA_2d.p_contour[j].pc_point[endA]);
                        B[2] = 0.0;
                        V2MOVE(C, polyA_2d.p_contour[j].pc_point[beginA]);
                        C[2] = 0.0;
                    } else if ((polyA_2d.p_contour[j].pc_point[endA][1] <= 
pt_2d[1] &&
-                               polyA_2d.p_contour[j].pc_point[beginA][1] >= 
pt_2d[1])) {
+                               polyA_2d.p_contour[j].pc_point[beginA][1] > 
pt_2d[1])) {
                        V2MOVE(B, polyA_2d.p_contour[j].pc_point[beginA]);
                        B[2] = 0.0;
                        V2MOVE(C, polyA_2d.p_contour[j].pc_point[endA]);
@@ -689,8 +692,7 @@
                }
            }
 
-       endA:
-           if (!winding%2)
+           if (!(winding%2))
                break;
        }
     }
@@ -716,6 +718,7 @@
                point_t B, C;
                vect_t BmA, CmA;
                vect_t vcross;
+               int on_contour = 0;
 
                for (beginB = 0; beginB < polyB_2d.p_contour[j].pc_num_points; 
++beginB) {
                    if (beginB == polyB_2d.p_contour[j].pc_num_points-1)
@@ -723,21 +726,23 @@
                    else
                        endB = beginB + 1;
 
-                   if (V2NEAR_EQUAL(polyB_2d.p_contour[j].pc_point[beginB], 
pt_2d, tol_dist_sq) ||
-                       V2NEAR_EQUAL(polyB_2d.p_contour[j].pc_point[endB], 
pt_2d, tol_dist_sq)) {
+                   if (!on_contour &&
+                       (V2NEAR_EQUAL(polyB_2d.p_contour[j].pc_point[beginB], 
pt_2d, tol_dist_sq) ||
+                        V2NEAR_EQUAL(polyB_2d.p_contour[j].pc_point[endB], 
pt_2d, tol_dist_sq))) {
                        /* pt_2d is the same as one of the end points, so count 
it */
                        ++winding;
-                       goto endB;
+                       on_contour = 1;
+                       continue;
                    }
 
                    if ((polyB_2d.p_contour[j].pc_point[beginB][1] <= pt_2d[1] 
&&
-                        polyB_2d.p_contour[j].pc_point[endB][1] >= pt_2d[1])) {
+                        polyB_2d.p_contour[j].pc_point[endB][1] > pt_2d[1])) {
                        V2MOVE(B, polyB_2d.p_contour[j].pc_point[endB]);
                        B[2] = 0.0;
                        V2MOVE(C, polyB_2d.p_contour[j].pc_point[beginB]);
                        C[2] = 0.0;
                    } else if ((polyB_2d.p_contour[j].pc_point[endB][1] <= 
pt_2d[1] &&
-                               polyB_2d.p_contour[j].pc_point[beginB][1] >= 
pt_2d[1])) {
+                               polyB_2d.p_contour[j].pc_point[beginB][1] > 
pt_2d[1])) {
                        V2MOVE(B, polyB_2d.p_contour[j].pc_point[beginB]);
                        B[2] = 0.0;
                        V2MOVE(C, polyB_2d.p_contour[j].pc_point[endB]);
@@ -754,8 +759,7 @@
                }
            }
 
-       endB:
-           if (!winding%2)
+           if (!(winding%2))
                break;
        }
     }

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


------------------------------------------------------------------------------
Don't let slow site performance ruin your business. Deploy New Relic APM
Deploy New Relic app performance management and know exactly
what is happening inside your Ruby, Python, PHP, Java, and .NET app
Try New Relic at no cost today and get our sweet Data Nerd shirt too!
http://p.sf.net/sfu/newrelic-dev2dev
_______________________________________________
BRL-CAD Source Commits mailing list
brlcad-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to