//=========================================================================== CurveLoop SurfaceOnVolume::outerBoundaryLoop(double degenerate_epsilon) const //=========================================================================== { // NB! Looses back pointer information if (spacesurf_.get()) return spacesurf_->outerBoundaryLoop(degenerate_epsilon); else if (constdir_ > 0) { // Pick constant parameter surface shared_ptr<ParamSurface> csf = shared_ptr<ParamSurface>(volume_->constParamSurface(constval_, constdir_-1)); return csf->outerBoundaryLoop(degenerate_epsilon); } else { // Approximate boundary curves. First fetch loop in parameter domain CurveLoop ploop = psurf_->outerBoundaryLoop(degenerate_epsilon); // Local approximation tolerance double eps = std::max(degenerate_epsilon, 1.0e-4); vector<shared_ptr<ParamCurve> > loop_cvs(ploop.size()); for (int ki=0; ki<ploop.size(); ++ki) { loop_cvs[ki] = VolumeTools::liftVolParamCurve(ploop[ki], volume_, eps); } CurveLoop bd_loop(loop_cvs, degenerate_epsilon); return bd_loop; } }
//=========================================================================== bool LoopUtils::loopIsCCW(const CurveLoop& loop, double int_tol) //=========================================================================== { // We extract the 2D parameter curves. Well, come to think of it, // what really matters is not that the curve is a 2D-spline, but // 2D ... vector< shared_ptr<SplineCurve> > sc; for (int ki = 0; ki < loop.size(); ++ki) { shared_ptr<SplineCurve> pcv; if (loop[ki]->instanceType() == Class_SplineCurve) pcv = dynamic_pointer_cast<SplineCurve, ParamCurve>(loop[ki]); else if (loop[ki]->instanceType() == Class_CurveOnSurface) { shared_ptr<CurveOnSurface> cv_on_sf = dynamic_pointer_cast<CurveOnSurface, ParamCurve>(loop[ki]); if (cv_on_sf->parameterCurve().get() == NULL) THROW("Method requires parameter curve!"); if (cv_on_sf->parameterCurve()->instanceType() == Class_SplineCurve) pcv = dynamic_pointer_cast<SplineCurve, ParamCurve> (cv_on_sf->parameterCurve()); else { pcv = shared_ptr<SplineCurve> (cv_on_sf->parameterCurve()->geometryCurve()); if (pcv.get() == NULL) THROW("Unexpected incident."); } } else THROW("Unexpected incident."); sc.push_back(pcv); } double space_epsilon = loop.getSpaceEpsilon(); return loopIsCCW(sc, space_epsilon, int_tol); }