示例#1
0
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
         );
    }

}
示例#2
0
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);
}
示例#3
0
文件: b_0_36.cpp 项目: jakexie/micmac
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);
         }
     }
}