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