/** * Example of a test. To be completed. * */ bool testTrueLocalEstimator(const std::string &filename) { trace.info() << "Reading GridCurve " << endl; ifstream instream; // input stream instream.open (filename.c_str(), ifstream::in); typedef KhalimskySpaceND<2> Kspace; //space GridCurve<Kspace> c; c.initFromVectorStream(instream); //building grid curve typedef GridCurve<Kspace >::PointsRange Range;//range Range r = c.getPointsRange();//building range typedef Ball2D<Z2i::Space> Shape; typedef GridCurve<KhalimskySpaceND<2> >::PointsRange Range; typedef Range::ConstIterator ConstIteratorOnPoints; typedef ParametricShapeCurvatureFunctor< Shape > Curvature; typedef ParametricShapeTangentFunctor< Shape > Tangent; typedef ParametricShapeArcLengthFunctor< Shape > Length; Shape ball(Z2i::Point(0,0), 30); TrueLocalEstimatorOnPoints< ConstIteratorOnPoints, Shape, Curvature > curvatureEstimator; TrueLocalEstimatorOnPoints< ConstIteratorOnPoints, Shape, Tangent > tangentEstimator; TrueGlobalEstimatorOnPoints< ConstIteratorOnPoints, Shape, Length > lengthEstimator; curvatureEstimator.init( 1, r.begin(), r.end(), &ball, true); tangentEstimator.init( 1, r.begin(), r.end(), &ball, true); ConstIteratorOnPoints it = r.begin(); // ConstIteratorOnPoints it2 = r.begin()+15; ConstIteratorOnPoints it2 = it; for ( int compteur = 0; compteur < 15; ++compteur ) ++it2; lengthEstimator.init( 1, it, it2, &ball, true); trace.info() << "Current point = "<<*it<<std::endl; trace.info() << "Current point+15 = "<<*it2<<std::endl; trace.info() << "Eval curvature (begin, h=1) = "<< curvatureEstimator.eval(it2)<<std::endl; trace.info() << "Eval tangent (begin, h=1) = "<< tangentEstimator.eval(it2)<<std::endl; trace.info() << "Eval length ( h=1) = "<< lengthEstimator.eval(it,it2)<<std::endl; return true; }
bool lengthEstimators( const std::string & /*name*/, Shape & aShape, double h ) { // Types typedef typename Space::Point Point; typedef typename Space::Vector Vector; typedef typename Space::RealPoint RealPoint; typedef typename Space::Integer Integer; typedef HyperRectDomain<Space> Domain; typedef KhalimskySpaceND<Space::dimension,Integer> KSpace; typedef typename KSpace::SCell SCell; typedef typename GridCurve<KSpace>::PointsRange PointsRange; typedef typename GridCurve<KSpace>::ArrowsRange ArrowsRange; // Digitizer GaussDigitizer<Space,Shape> dig; dig.attach( aShape ); // attaches the shape. Vector vlow(-1,-1); Vector vup(1,1); dig.init( aShape.getLowerBound()+vlow, aShape.getUpperBound()+vup, h ); Domain domain = dig.getDomain(); // Create cellular space KSpace K; bool ok = K.init( dig.getLowerBound(), dig.getUpperBound(), true ); if ( ! ok ) { std::cerr << "[lengthEstimators]" << " error in creating KSpace." << std::endl; return false; } try { // Extracts shape boundary SurfelAdjacency<KSpace::dimension> SAdj( true ); SCell bel = Surfaces<KSpace>::findABel( K, dig, 10000 ); // Getting the consecutive surfels of the 2D boundary std::vector<Point> points; Surfaces<KSpace>::track2DBoundaryPoints( points, K, SAdj, dig, bel ); // Create GridCurve GridCurve<KSpace> gridcurve; gridcurve.initFromVector( points ); // Ranges ArrowsRange ra = gridcurve.getArrowsRange(); PointsRange rp = gridcurve.getPointsRange(); // Estimations typedef typename PointsRange::ConstIterator ConstIteratorOnPoints; typedef ParametricShapeArcLengthFunctor< Shape > Length; TrueGlobalEstimatorOnPoints< ConstIteratorOnPoints, Shape, Length > trueLengthEstimator; trueLengthEstimator.init( h, rp.begin(), rp.end(), &aShape, gridcurve.isClosed()); L1LengthEstimator< typename ArrowsRange::ConstCirculator > l1length; DSSLengthEstimator< typename PointsRange::ConstCirculator > DSSlength; MLPLengthEstimator< typename PointsRange::ConstIterator > MLPlength; FPLengthEstimator< typename PointsRange::ConstIterator > FPlength; BLUELocalLengthEstimator< typename ArrowsRange::ConstIterator > BLUElength; RosenProffittLocalLengthEstimator< typename ArrowsRange::ConstIterator > RosenProffittlength; // Output double trueValue = trueLengthEstimator.eval(); double l1, blue, rosen,dss,mlp,fp; double Tl1, Tblue, Trosen,Tdss,Tmlp,Tfp; Clock c; //Length evaluation & timing c.startClock(); l1length.init(h, ra.c(), ra.c()); l1 = l1length.eval(); Tl1 = c.stopClock(); c.startClock(); BLUElength.init(h, ra.begin(), ra.end(), gridcurve.isClosed()); blue = BLUElength.eval(); Tblue = c.stopClock(); c.startClock(); RosenProffittlength.init(h, ra.begin(), ra.end(), gridcurve.isClosed()); rosen = RosenProffittlength.eval(); Trosen = c.stopClock(); c.startClock(); DSSlength.init(h, rp.c(), rp.c()); dss = DSSlength.eval(); Tdss = c.stopClock(); c.startClock(); MLPlength.init(h, rp.begin(), rp.end(), gridcurve.isClosed()); mlp = MLPlength.eval(); Tmlp = c.stopClock(); c.startClock(); FPlength.init(h, rp.begin(), rp.end(), gridcurve.isClosed()); fp = FPlength.eval(); Tfp = c.stopClock(); std::cout << std::setprecision( 15 ) << h << " " << rp.size() << " " << trueValue << " " << l1 << " " << blue << " " << rosen << " " << dss << " " << mlp << " " << fp << " " << Tl1 << " " << Tblue << " " << Trosen << " " << Tdss << " " << Tmlp << " " << Tfp << std::endl; return true; } catch ( InputException e ) { std::cerr << "[lengthEstimators]" << " error in finding a bel." << std::endl; return false; } }