Revision: 54153
http://brlcad.svn.sourceforge.net/brlcad/?rev=54153&view=rev
Author: starseeker
Date: 2013-01-11 03:27:23 +0000 (Fri, 11 Jan 2013)
Log Message:
-----------
Rework trimming loop assembly to make sure loops are closed - somewhat better
results, but that clearly wasn't the only issue.
Modified Paths:
--------------
brlcad/trunk/src/librt/test_botpatches.cpp
Modified: brlcad/trunk/src/librt/test_botpatches.cpp
===================================================================
--- brlcad/trunk/src/librt/test_botpatches.cpp 2013-01-10 04:26:39 UTC (rev
54152)
+++ brlcad/trunk/src/librt/test_botpatches.cpp 2013-01-11 03:27:23 UTC (rev
54153)
@@ -1091,6 +1091,9 @@
void build_loop(size_t patch_id, size_t loop_index, ON_BrepLoop::TYPE
loop_type, std::map<size_t, std::vector<size_t> > *loops, struct Manifold_Info
*info) {
ON_BrepFace& face = info->brep->m_F[(int)patch_id];
+ const ON_Surface *surface = face.SurfaceOf();
+ ON_Interval xdom = surface->Domain(0);
+ ON_Interval ydom = surface->Domain(1);
// Start with outer loop
ON_BrepLoop& loop = info->brep->NewLoop(loop_type, face);
// build surface tree
@@ -1124,49 +1127,71 @@
ON_2dPointArray curve_pnts_2d;
const ON_Curve* edge_curve = edge.EdgeCurveOf();
ON_Interval dom = edge_curve->Domain();
- // XXX todo: dynamically sample the curve - must use consistent method
for all sampling, else
- // surface may not contain points sought by curve
+
ON_3dPoint pt_3d = edge_curve->PointAt(dom.ParameterAt(0));
ON_2dPoint pt_2d;
+ ON_2dPoint loop_anchor;
ON_2dPoint pt_2d_prev;
- if(get_closest_point(pt_2d, &face, pt_3d, st)) {
- curve_pnts_2d.Append(pt_2d);
- pt_2d_prev = *curve_pnts_2d.Last();
- pullback_successes++;
+ int prev_trim_rev = 0;
+ int istart = 1;
+
+ if(loop_it == loop_edges->begin()) {
+ prev_trim_rev = trim_rev;
+ int found_first_pt = 0;
+ while(!found_first_pt && istart < 50) {
+ pt_3d =
edge_curve->PointAt(dom.ParameterAt((double)(istart-1)/(double)50));
+ if(get_closest_point(pt_2d, &face, pt_3d, st)) {
+ if (xdom.Includes(pt_2d.x) && ydom.Includes(pt_2d.y)) {
+ curve_pnts_2d.Append(pt_2d);
+ loop_anchor = pt_2d;
+ found_first_pt = 1;
+ }
+ } else {
+ pullback_failures++;
+ }
+ }
} else {
- pt_2d_prev = ON_2dPoint(INT_MAX, INT_MAX);
- pullback_failures++;
+ curve_pnts_2d.Append(pt_2d_prev);
}
- for (int i = 1; i < 50; i++) {
- pt_3d =
edge_curve->PointAt(dom.ParameterAt((double)(i)/(double)50));
- if(get_closest_point(pt_2d, &face, pt_3d, st) && pt_2d !=
pt_2d_prev) {
- curve_pnts_2d.Append(pt_2d);
- pt_2d_prev = *curve_pnts_2d.Last();
- pullback_successes++;
- } else {
- if(pt_2d != pt_2d_prev)
- pullback_failures++;
+ // XXX todo: dynamically sample the curve - must use consistent method
for all sampling, else
+ // surface may not contain points sought by curve
+ if(!trim_rev) {
+ for (int i = istart; i < 50; i++) {
+ pt_3d =
edge_curve->PointAt(dom.ParameterAt((double)(i)/(double)50));
+ if(get_closest_point(pt_2d, &face, pt_3d, st) && pt_2d !=
pt_2d_prev) {
+ if (xdom.Includes(pt_2d.x) && ydom.Includes(pt_2d.y)) {
+ curve_pnts_2d.Append(pt_2d);
+ pt_2d_prev = pt_2d;
+ }
+ } else {
+ pullback_failures++;
+ }
}
- }
- pt_3d = edge_curve->PointAt(dom.ParameterAt(1.0));
- if(get_closest_point(pt_2d, &face, pt_3d, st) && pt_2d != pt_2d_prev) {
- curve_pnts_2d.Append(pt_2d);
- pullback_successes++;
} else {
- if(pt_2d != pt_2d_prev)
- pullback_failures++;
+ for (int i = 50; i > istart; i--) {
+ pt_3d =
edge_curve->PointAt(dom.ParameterAt((double)(i)/(double)50));
+ if(get_closest_point(pt_2d, &face, pt_3d, st) && pt_2d !=
pt_2d_prev) {
+ if (xdom.Includes(pt_2d.x) && ydom.Includes(pt_2d.y)) {
+ curve_pnts_2d.Append(pt_2d);
+ pt_2d_prev = pt_2d;
+ }
+ } else {
+ pullback_failures++;
+ }
+ }
}
- if(pullback_failures)
- std::cout << "Pullback to face " << patch_id << ": Successes: " <<
pullback_successes << ", Failures: " << pullback_failures << "\n";
- if (pullback_successes >= 2) {
- if(trim_rev) curve_pnts_2d.Reverse();
- ON_Curve *trim_curve = interpolateCurve(curve_pnts_2d);
- int c2i = info->brep->AddTrimCurve(trim_curve);
- ON_BrepTrim& trim = info->brep->NewTrim(edge, trim_rev, loop, c2i);
- trim.m_type = ON_BrepTrim::mated;
- trim.m_tolerance[0] = 1e-3;
- trim.m_tolerance[1] = 1e-3;
+ // For final curve, doesn't matter what last pullback is - we MUST
force the loop to close.
+ if(loop_it+1 == loop_edges->end()) {
+ curve_pnts_2d.Append(loop_anchor);
}
+ if(pullback_failures) std::cout << "Warning: face " << patch_id << "
has " << pullback_failures << " pullback failures\n";
+ //if(trim_rev) {curve_pnts_2d.Reverse();}
+ ON_Curve *trim_curve = interpolateCurve(curve_pnts_2d);
+ int c2i = info->brep->AddTrimCurve(trim_curve);
+ ON_BrepTrim& trim = info->brep->NewTrim(edge, trim_rev, loop, c2i);
+ trim.m_type = ON_BrepTrim::mated;
+ trim.m_tolerance[0] = 1e-3;
+ trim.m_tolerance[1] = 1e-3;
}
if (info->brep->LoopDirection(loop) != 1 && loop_type ==
ON_BrepLoop::outer) {
info->brep->FlipLoop(loop);
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
Master HTML5, CSS3, ASP.NET, MVC, AJAX, Knockout.js, Web API and
much more. Get web development skills now with LearnDevNow -
350+ hours of step-by-step video tutorials by Microsoft MVPs and experts.
SALE $99.99 this month only -- learn more at:
http://p.sf.net/sfu/learnmore_122812
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits