Exemple #1
0
//===========================================================================
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;
    }
}
Exemple #2
0
//===========================================================================
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);
}