Fix #647 Helix mesh defects.

Use the grid spacing algorithm for helical curve PWL creation.
This makes the grid and trim curves have similar spacing.
pull/653/head
phkahler 2020-07-11 19:42:06 -04:00
parent f0623fa5ba
commit c75b2e473e
3 changed files with 24 additions and 10 deletions

View File

@ -817,7 +817,7 @@ void SCurve::RemoveShortSegments(SSurface *srfA, SSurface *srfB) {
continue; continue;
} }
// if the curve is exact and points are >0.1 appart wrt t, point is there // if the curve is exact and points are >0.05 appart wrt t, point is there
// deliberately regardless of chord tolerance (ex: small circles) // deliberately regardless of chord tolerance (ex: small circles)
tprev = t = tnext = 0; tprev = t = tnext = 0;
if (isExact) { if (isExact) {
@ -825,7 +825,7 @@ void SCurve::RemoveShortSegments(SSurface *srfA, SSurface *srfB) {
exact.ClosestPointTo(sct->p, &t, /*mustconverge=*/ true); exact.ClosestPointTo(sct->p, &t, /*mustconverge=*/ true);
exact.ClosestPointTo(scn->p, &tnext, /*mustconverge=*/ true); exact.ClosestPointTo(scn->p, &tnext, /*mustconverge=*/ true);
} }
if ( (t - tprev > 0.1) && (tnext - t > 0.1) ) { if ( (t - tprev > 0.05) && (tnext - t > 0.05) ) {
prev = sct->p; prev = sct->p;
continue; continue;
} }

View File

@ -732,6 +732,15 @@ void SShell::MakeFromHelicalRevolutionOf(SBezierLoopSet *sbls, Vector pt, Vector
sb = &(sbl->l[i]); sb = &(sbl->l[i]);
// we will need the grid t-values for this entire row of surfaces
List<double> t_values;
t_values = {};
if (revs[0].v) {
double ps = 0.0;
t_values.Add(&ps);
(surface.FindById(revs[0]))->MakeTriangulationGridInto(
&t_values, 0.0, 1.0, true, 0);
}
// we generate one more curve than we did surfaces // we generate one more curve than we did surfaces
for(j = 0; j <= sections; j++) { for(j = 0; j <= sections; j++) {
SCurve sc; SCurve sc;
@ -746,11 +755,16 @@ void SShell::MakeFromHelicalRevolutionOf(SBezierLoopSet *sbls, Vector pt, Vector
sc = {}; sc = {};
sc.isExact = true; sc.isExact = true;
sc.exact = sb->TransformedBy(ts, qs, 1.0); sc.exact = sb->TransformedBy(ts, qs, 1.0);
double max_dt = 0.5; // make the PWL for the curve based on t value list
if (sc.exact.deg > 1) max_dt = 0.25; for(int x = 0; x < t_values.n; x++) {
(sc.exact).MakePwlInto(&(sc.pts), 0.0, max_dt); SCurvePt scpt;
scpt.tag = 0;
scpt.p = sc.exact.PointAt(t_values[x]);
scpt.vertex = (x == 0) || (x == (t_values.n - 1));
sc.pts.Add(&scpt);
}
// the surfaces already exist so trim with this curve // the surfaces already exists so trim with this curve
if(j < sections) { if(j < sections) {
sc.surfA = revs[j]; sc.surfA = revs[j];
} else { } else {
@ -762,6 +776,7 @@ void SShell::MakeFromHelicalRevolutionOf(SBezierLoopSet *sbls, Vector pt, Vector
} else { } else {
sc.surfB = hs0; // staring cap sc.surfB = hs0; // staring cap
} }
hSCurve hcb = curve.AddAndAssignId(&sc); hSCurve hcb = curve.AddAndAssignId(&sc);
STrimBy stb; STrimBy stb;
@ -773,9 +788,7 @@ void SShell::MakeFromHelicalRevolutionOf(SBezierLoopSet *sbls, Vector pt, Vector
sc = {}; sc = {};
sc.isExact = true; sc.isExact = true;
sc.exact = sb->TransformedBy(ts, qs, 1.0); sc.exact = sb->TransformedBy(ts, qs, 1.0);
double max_dt = 0.5; (sc.exact).MakePwlInto(&(sc.pts));
if (sc.exact.deg > 1) max_dt = 0.25;
(sc.exact).MakePwlInto(&(sc.pts), 0.0, max_dt);
sc.surfA = hs1; // end cap sc.surfA = hs1; // end cap
sc.surfB = hs0; // staring cap sc.surfB = hs0; // staring cap
hSCurve hcb = curve.AddAndAssignId(&sc); hSCurve hcb = curve.AddAndAssignId(&sc);
@ -812,6 +825,7 @@ void SShell::MakeFromHelicalRevolutionOf(SBezierLoopSet *sbls, Vector pt, Vector
(surface.FindById(sc.surfB))->trim.Add(&stb); (surface.FindById(sc.surfB))->trim.Add(&stb);
} }
} }
t_values.Clear();
} }
hsl.Clear(); hsl.Clear();

View File

@ -429,7 +429,7 @@ void SSurface::MakeTriangulationGridInto(List<double> *l, double vs, double vf,
double step = 1.0/SS.GetMaxSegments(); double step = 1.0/SS.GetMaxSegments();
if( ((vf - vs) < step || worst < SS.ChordTolMm()) if( ((vf - vs) < step || worst < SS.ChordTolMm())
&& ((worst_twist > 0.999) || (depth > 4)) ) { && ((worst_twist > 0.999) || (depth > 3)) ) {
l->Add(&vf); l->Add(&vf);
} else { } else {
MakeTriangulationGridInto(l, vs, (vs+vf)/2, swapped, depth+1); MakeTriangulationGridInto(l, vs, (vs+vf)/2, swapped, depth+1);