cEqDirecteDistorsion:: cEqDirecteDistorsion ( cParamIntrinsequeFormel & aPIF, eTypeEqDisDirecre Usage, bool Code2Gen ) : mUsage (Usage), mSet (*aPIF.Set()), mPIF (aPIF), mP1 ("PIm1"), mP2 ("PIm2"), mResidu (P1_EDD(mPIF,mP1.PtF(),Usage) - mP2.PtF()), mNameType ( "cEqDirectDist" + mPIF.NameType() + (Usage2Str(Usage)) +"_CodGen" ) { mPIF.IncInterv().SetName("Calib"); mLInterv.AddInterv(mPIF.IncInterv()); mFoncEqResidu = cElCompiledFonc::AllocFromName(mNameType); if (Code2Gen) { GenCode(); return; } if (mFoncEqResidu==0) { std::cout << "Name = " << mNameType << "\n"; ELISE_ASSERT(false,"Can Get Code Comp for cEqCalibCroisee"); mFoncEqResidu = cElCompiledFonc::DynamicAlloc(mLInterv,Fonc_Num(0)); } mFoncEqResidu->SetMappingCur(mLInterv,&mSet); mP1.InitAdr(*mFoncEqResidu); mP2.InitAdr(*mFoncEqResidu); aPIF.InitStateOfFoncteur(mFoncEqResidu,0); mSet.AddFonct(mFoncEqResidu); }
cEqCalibCroisee::cEqCalibCroisee ( bool SensC2M, cParamIntrinsequeFormel & aPIF, cRotationFormelle * aRot, bool Code2Gen ) : mSet (*aPIF.Set()), mPIF (aPIF), mRotCalc ( aRot ? aRot : mSet.NewRotation(eRotCOptFige,ElRotation3D(Pt3dr(0,0,0),0,0,0)) ), mRot2Destr (aRot ? 0 : mRotCalc), mP1 ("PIm1"), mN2 ("DirEsp2"), mResidu ( SensC2M ? ( PointNorm1(mPIF.Cam2DirRayMonde(mP1.PtF(),0)) - mRotCalc->VectM2C(mN2.PtF()) ) : AdZ0(mP1.PtF() -mPIF.DirRayMonde2Cam(mRotCalc->VectM2C(mN2.PtF()),0)) ), mNameType ("cEqCalibCroisee_" + mPIF.NameType() +"_CodGen" + std::string(SensC2M ? "C2M" : "M2C")) { // Test de coherence, si rotation vient de l'exterieur ELISE_ASSERT ( (&mSet==mRotCalc->Set()), "Set incoherence in cEqObsRotVect::cEqObsRotVect" ); // En mode utilisation, assurele lien les numeros d'inconnu de mRotCalc et // la numerotation interne; en mode generation de code cree l'intervale de ref mRotCalc->IncInterv().SetName("Orient"); mPIF.IncInterv().SetName("Calib"); mLInterv.AddInterv(mRotCalc->IncInterv()); mLInterv.AddInterv(mPIF.IncInterv()); // Cette etape va creer un objet de type "cEqCalibCroisee_Calib_CodeGen", // tant que le code n'a pas ete genere et linke, il n'y a aucune // raison pour que cet objet puisse etre cree, la valeur 0 sera alors // retournee mFoncEqResidu = cElCompiledFonc::AllocFromName(mNameType); if (Code2Gen) { GenCode(); // En phase de generation il n'y a pas grand chose de plus a faire return; } // En theorie le mecanisme permet de fonctionner meme sans generation // de code par un mode degrade "interprete" ou toute les evaluation sont // faite directement a partir des Fonc_Num ; cette fonctionnalite n'est // pas vraiment maintenue (par exemple elle ne gere par les contraintes // multiple); on conserve l'architecture de code "au cas ou "mais // on en interdit l'usage if (mFoncEqResidu==0) { std::cout << "Name = " << mNameType << "\n"; ELISE_ASSERT(false,"Can Get Code Comp for cEqCalibCroisee"); mFoncEqResidu = cElCompiledFonc::DynamicAlloc(mLInterv,Fonc_Num(0)); } // Cree dans l'objet la lut vers les numero d'inconnues mFoncEqResidu->SetMappingCur(mLInterv,&mSet); // Le code genere fait reference au valeur de P1 et P2; // pour pouvoir repidement faire l'initialisation on memorise // leur adresse (on envoie un nom, on recupere une adresse) // ceci est encapsule dans cP3d_Etat_PhgrF qui gere les variables // d'etat triple correspondant des points 3D mP1.InitAdr(*mFoncEqResidu); mN2.InitAdr(*mFoncEqResidu); aPIF.InitStateOfFoncteur(mFoncEqResidu,0); // Il est necessaire que mSet connaisse l'ensemble de ses "foncteur" // pour : // 1- assurer la mise a jour des inconnues dans le cas d'un processus iteratif // 2- assurer la destruction mSet.AddFonct(mFoncEqResidu); }