Пример #1
0
bool cElHJaPlan3D::MakeFacettes(cElHJaArrangt & anArgt)
{

   static cFullSubGrWithP   aSGrFul;
   ElPartition<tArcGrPl *>  aVFac;
   bool Ok = all_face_trigo(*mGr,aSGrFul,aVFac);


   for (INT aK=0 ; aK<aVFac.nb() ; aK++)
   {
       cElHJaFacette * aF = new cElHJaFacette(aVFac[aK].ToVect(),this);
       if (aF->IsExterne())
          delete aF;
       else
       {
          anArgt.AddFacette(aF);
	  mFacettes.push_back(aF);
       }
   }

   if (mHasSegOblig)
   {
       REAL aD;
       tSomGrPl * aS1 = SomNearest(mSegOblig.p0(),aD);
       tSomGrPl * aS2 = SomNearest(mSegOblig.p1(),aD);

       ElPcc<cElHJaAttrSomPlani,cElHJaAttrArcPlani> aPcc;
       cFullSubGrWithP  aSubSeg(mSegOblig);

       aPcc.pcc(*aS1,*aS2,aSubSeg,eModePCC_Somme);
       ElFilo<tSomGrPl *> aChem;
       aPcc.chemin(aChem,*aS2);

       INT aFlag = mGr->alloc_flag_arc();
       for (INT aK=0 ; aK<aChem.nb()-1 ; aK++)
           mGr->arc_s1s2(*aChem[aK],*aChem[aK+1])->sym_flag_set_kth_true(aFlag);

       for (INT aK=0 ; aK<INT(mFacettes.size()) ; aK++)
       {
            cElHJaFacette * aF = mFacettes[aK];
	    bool Got = false;
	    const  std::vector<tArcGrPl *>  & aVArcs = aF->Arcs();
            for (INT aK=0 ; aK<INT(aVArcs.size()) ; aK++)
                if (aVArcs[aK]->flag_kth(aFlag))
                    Got = true;
	    if (Got)
               mFacOblig.push_back(aF);
       }

       for (INT aK=0 ; aK<aChem.nb()-1 ; aK++)
           mGr->arc_s1s2(*aChem[aK],*aChem[aK+1])->sym_flag_set_kth_false(aFlag);
       mGr->free_flag_arc(aFlag);
   }

   return Ok;
}
Пример #2
0
/*
      Renvoie le point le plus a droite des points le plus en bas
*/
template <class TPt> TPt pts_down_right(const ElFilo<TPt> & pts)
{
     ELISE_ASSERT(pts.nb(),"Cmp_Vect_Then_Norm::down_right");
     TPt res = pts[0];
     for (INT k=1; k<pts.nb() ; k++)
     {
         TPt p = pts[k];
         if (     (p.y<res.y)
              ||  ((p.y==res.y) && (p.x>res.x))
            )
            res = p;
     }
     return res;
}
Пример #3
0
void Optim_L1FormLin::CombinConjMinLoc
     (
        ElFilo<REAL>&  dic,
        ElFilo<INT> &  Subset,
        ElFilo<INT> &  FlagPos
     )
{
    CPT ++;
    INT NbF = (1<<_NbForm);
    for (INT k=dic.nb() ;k<NbF ; k++)
        dic.pushlast(1e20);

    FlagPos.clear();

    CombinConjMinLoc(dic,Subset,FlagPos,0,0,0);

    INT NbMin0 =0;
    INT NbMin1 =0;

    REAL M0 = 1e80,M1 = -1e80;

	{
    for (INT k=0 ; k< FlagPos.nb(); k++)
    {


        REAL VN = TestNeighConjMinLoc(FlagPos[k],dic);
        REAL V0 = dic[FlagPos[k]];

        if (V0 < VN)
           NbMin0 ++;
        if (V0 <=  VN)
        {
           NbMin1 ++;
           ElSetMin(M0,V0);
           ElSetMax(M1,V0);
        }

/*
        {
          show_flag(FlagPos[k]);
          cout << " : " << dic[FlagPos[k]];
          if (V0 <= VN) 
             cout << " ** ";
          cout << "\n";
        }
*/
    }
	}

/*
    if ((NbMin0!=1) || (NbMin1!=1))
        cout << NbMin0 << " " << NbMin1 << "\n";
*/

    BENCH_ASSERT(NbMin0 <= 1);
    BENCH_ASSERT(NbMin1 >= 1);

   cout << "MINS = " << M0 << " " << M1 << "\n";
   BENCH_ASSERT(std::abs(M0-M1)<epsilon);


   {
    for (INT k=0 ; k< FlagPos.nb(); k++)
        dic[FlagPos[k]] = 1e20;

   }
}