void EL_API_MAKE_VECTO::action // => Br_Vect_Action ( const ElFifo<Pt2di> & pts, const ElFifo<INT> * args, INT ) { const ElFifo<INT> & dist = args[0]; approx_poly(_approx,pts,_arg_app); for (INT kAp=1 ; kAp< _approx.nb() ; kAp++) { INT k1 = _approx[kAp-1]; INT k2 = _approx[kAp]; _pts_interm.clear(); _d_interm.clear(); for (INT k=k1 ; k<= k2 ; k++) { _pts_interm.push_back(Pt2d2complex(pts[k]+_dec)); _d_interm.push_back(dist[k]); } _call_back.ElVectoAction ( Pt2d2complex(pts[k1]+_dec), Pt2d2complex(pts[k2]+_dec), _pts_interm, _d_interm ); } }
void approx_poly ( ElFifo<INT> & res, const ElFifo<Pt2di> & fpi, ArgAPP arg ) { ElFifo<Pt2dr> fpr(fpi.size(),fpi.circ());; for (INT aK=0 ; aK<INT(fpi.size()) ; aK++) fpr.push_back(Pt2dr(fpi[aK])); approx_poly(res,fpr,arg); }
void bench_approx_poly ( INT nb, MODE_LPTS_BENCH_APP mode, bool circ ) { ElList<Pt2di> lsom; switch(mode) { case LPTS_L1 : lsom = lpts_square_L1(nb); break; case LPTS_Linf : lsom = lpts_square_Linf(nb); break; case LPTS_zigag : lsom = lpts_zigzag(nb); break; }; lsom = lsom.reverse(); INT nb_som_init = lsom.card(); ElFifo<Pt2di> fif_pts(10,circ); Liste_Pts_INT2 lpt(2); ELISE_COPY(line(lsom,circ),1,lpt); INT nb_pts_init = lpt.card(); INT offset = circ ? (INT)(NRrandom3() * nb_pts_init) : 0; Im2D_INT2 il = lpt.image(); INT nb_pts = il.tx(); INT2 * x = il.data()[0]; INT2 * y = il.data()[1]; for (int k =0; k<nb_pts ; k++) fif_pts.pushlast(Pt2di(x[(k+offset)%nb_pts],y[(k+offset)%nb_pts])); // Aprox tres grossiere , jump de 2, step infini => 2 extre ElFifo<int> res(10); ArgAPP arg(1e20,2,ArgAPP::D2_droite,ArgAPP::Extre,false,1000); approx_poly(res,fif_pts,arg); if (! circ ) { BENCH_ASSERT ( (res.nb() == 2) && (res[0] == 0) && (res[1] == (nb_pts_init-1)) ); // Aprox tres grossiere , jump de racine nb pts, step 2, => 2 extre INT rac = round_up(sqrt(double(nb_pts_init))); arg = ArgAPP(1e20,rac,ArgAPP::D2_droite,ArgAPP::Extre,false,2); approx_poly(res,fif_pts,arg); BENCH_ASSERT ( (res.nb() == 2) && (res[0] == 0) && (res[1] == (nb_pts_init-1)) ); // Aprox tres fine , jump de jmp diviseur de nb_pts_init-&, step 1, // resul "0 nb_som_init 2*nb_som_init .... " if ((nb_pts_init-1)%(nb_som_init-1) == 0) { INT jmp = nb_som_init-1; arg = ArgAPP(1e20,jmp,ArgAPP::D2_droite,ArgAPP::Extre,false,1); approx_poly(res,fif_pts,arg); BENCH_ASSERT ( res.nb() == (nb_pts_init-1)/jmp + 1 ); for (INT k = 0 ; k<res.nb() ; k++) BENCH_ASSERT ( res[k] == jmp * k ); } } // Approx tres fine, avec jump >= au seuil et step asse grand; // on droit retomber sur les extres for (INT jmp = nb; jmp < 3*nb; jmp += (1+nb/3)) { arg = ArgAPP(1e-2,jmp,ArgAPP::D2_droite,ArgAPP::Extre,false,1); approx_poly(res,fif_pts,arg); if (! circ) { BENCH_ASSERT(res.nb() == nb_som_init); for (INT k = 0 ; k<res.nb() ; k++) BENCH_ASSERT(res[k] == nb * k); } else { BENCH_ASSERT( (res[0] +offset) % nb == 0); BENCH_ASSERT(res.nb() == nb_som_init +1); INT r0 = res[0]; for (INT k = 0 ; k<res.nb() ; k++) BENCH_ASSERT(res[k] == nb * k +r0); } } }