Example #1
0
void BenchcDbleGrid
     (
         Pt2dr aP0In,Pt2dr aP1In,
         REAL               aStepDir,
         ElDistortion22_Gen & aDist
     )
{
     //cDbleGrid aDGr(aP0In,aP1In,aStepDir,aDist);
     Pt2dr stepDir2(aStepDir,aStepDir);                // __NEW
     cDbleGrid aDGr(false,aP0In,aP1In,stepDir2,aDist); // __NEW

     for (REAL aX = aP0In.x ; aX<aP1In.x ; aX += aStepDir)
         for (REAL aY = aP0In.y ; aY<aP1In.y ; aY += aStepDir)
         {
             REAL x = aX + NRrandom3() * aStepDir;
             SetInRange(aP0In.x,x,aP1In.x);
             REAL y = aY + NRrandom3() * aStepDir;
             SetInRange(aP0In.y,y,aP1In.y);

	     Pt2dr aP(x,y);
	     Pt2dr aQ0 = aDist.Direct(aP);
	     Pt2dr aQ1 = aDGr.Direct(aP);
	     Pt2dr aR0 = aDist.Inverse(aQ0);
	     Pt2dr aR1 = aDist.Inverse(aQ1);

	     REAL aDQ = euclid(aQ0,aQ1);
	     REAL aDR = euclid(aR0,aP) +  euclid(aR1,aP);
	     aDQ /= ElSquare(aStepDir);
	     aDR /= ElSquare(aStepDir);
	     BENCH_ASSERT(aDQ<0.1);
	     BENCH_ASSERT(aDR<0.1);
         }
}
cDbleGrid::cDbleGrid
(
    bool  AdaptStep,
    Pt2dr aP0In,Pt2dr aP1In,
    Pt2dr               aStepDir,
    ElDistortion22_Gen & aDist,
    const std::string &  aName,
    bool                 doDir,
    bool                 doInv
)   :
    mName (aName)
{
    pGrDir = new PtImGrid(AdaptStep,aP0In,aP1In,aStepDir,mName+"_Directe");
    Pt2di aSzGr = pGrDir->SzGrid();

    bool First = true;
    Pt2dr aP0Dist(1e9,1e9);
    Pt2dr aP1Dist(-1e9,-1e9);

    for (INT aI=0; aI<aSzGr.x ; aI++)
    {
        for (INT aJ=0; aJ<aSzGr.y ; aJ++)
        {
            Pt2di aPIJ(aI,aJ);
            Pt2dr aPR = pGrDir->ToReal(Pt2dr(aPIJ));
            Pt2dr  aPDR = aDist.Direct(aPR);
            pGrDir->SetValueGrid(aPIJ,aPDR);
            if (First)
            {
                aP0Dist = aPDR;
                aP1Dist = aPDR;
                First = false;
            }
            else
            {
                aP0Dist.SetInf(aPDR);
                aP1Dist.SetSup(aPDR);
            }
        }
    }
    if (!doDir)
    {
        delete pGrDir;
        pGrDir = 0;
    }
    
    if (doInv)
    {

       Pt2dr aStepInv = (aP1Dist-aP0Dist).dcbyc(Pt2dr(aSzGr));
    /*
    REAL aStepInv = sqrt
                    (
                         ((aP1Dist.x-aP0Dist.x)*(aP1Dist.y-aP0Dist.y) )
                       / (aSzGr.x*aSzGr.y)
                    );
    */
       pGrInv = new PtImGrid(AdaptStep,aP0Dist,aP1Dist,aStepInv,aName+"_Inverse");
       aSzGr = pGrInv->SzGrid();

       for (INT aI=0; aI<aSzGr.x ; aI++)
       {
           for (INT aJ=0; aJ<aSzGr.y ; aJ++)
	   {
               Pt2di aPIJ(aI,aJ);
               Pt2dr aPR = pGrInv->ToReal(Pt2dr(aPIJ));
               Pt2dr  aPDR = aDist.Inverse(aPR);
               pGrInv->SetValueGrid(aPIJ,aPDR);
	   }
       }
    }
    else
    {
       pGrInv = 0;
    }
}