示例#1
0
template <class T> INT get_best_intexe(const ElFifo<T> & fp,bool EnvConv)
{
   if (! fp.circ())
      return 0;

   if (fp.nb() < 4)
      return 0;


   INT delta = EnvConv ? 1 : std::min(5,(fp.nb()-2)/2);
   REAL min_cos = 10.0;
   INT best_index = 0;

   std::vector<INT> aVOk;
   std::vector<INT> aVPrec;
   std::vector<INT> aVSucc;

   for(INT aK=0 ; aK<INT(fp.size()) ; aK++)
   {
       aVOk.push_back(EnvConv ? 0 : 1);
       aVPrec.push_back(aK-delta);
       aVSucc.push_back(aK+delta);
   }
   if (EnvConv)
   {
      ElFilo<Pt2dr> aFLP;
      for(INT aK=0 ; aK<INT(fp.size()) ; aK++)
         aFLP.pushlast(fp[aK]);
      ElFifo<INT> Ind;
      env_conv(Ind,aFLP,true);
      for (INT aK=0 ; aK<Ind.nb() ; aK++)
      {
          aVOk[Ind[aK]] = 1;
          aVPrec[Ind[aK]] = Ind[(aK-1+Ind.nb())%Ind.nb()];
          aVSucc[Ind[aK]] = Ind[(aK+1)%Ind.nb()];
      }
   }

   for (INT k =0 ; k<fp.nb() ; k++)
   {
       if (aVOk[k])
       {
            T u1 = fp[k]-fp[aVPrec[k]];
            T u2 = fp[aVSucc[k]]-fp[k];
            double d1 = euclid(u1);
            double d2 = euclid(u2);
            if (d1 && d2)
            {
               double cosin = scal(u1,u2) / (d1*d2);
               if (cosin < min_cos)
               {
                  min_cos = cosin; 
                  best_index = k;
               }
            }
       }
   }
   return best_index ;
}
示例#2
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;
}
示例#3
0
文件: b_0_48.cpp 项目: jakexie/micmac
void Optim_L1FormLin::SubsetOfFlags(ElFilo<INT> & Subset,INT flag)
{
     Subset.clear();
     for (INT k=0; k<_NbForm ; k++)
         if (flag & (1 << k))
            Subset.pushlast(1);
         else
            Subset.pushlast(0);
     
}
示例#4
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;
}
示例#5
0
文件: b_0_48.cpp 项目: jakexie/micmac
void Optim_L1FormLin::CombinConjMinLoc
     (
        ElFilo<REAL>&  dic,
        ElFilo<INT> &  Subset,
        ElFilo<INT> &  FlagPos,
        INT            FlagSubset,
        INT            NbVarPos,
        INT            CurVarPos
     )
{
/*
     show_flag(FlagSubset);
     cout << " " << NbVarPos << " " << CurVarPos 
          << " [N= " << _NbVar << " M = " << _NbForm << "]"
          << "\n";
*/
     

     if (NbVarPos == _NbVar)
     {
        FlagPos.pushlast(FlagSubset);
        SubsetOfFlags(Subset,FlagSubset);
        dic[FlagSubset] = score(Subset);

        return;
     }
     if (CurVarPos == _NbForm)
        return;

     CombinConjMinLoc(dic,Subset,FlagPos,FlagSubset | (1<<CurVarPos),NbVarPos+1,CurVarPos+1);
     CombinConjMinLoc(dic,Subset,FlagPos,FlagSubset                 ,NbVarPos  ,CurVarPos+1);
}
示例#6
0
文件: b_0_48.cpp 项目: jakexie/micmac
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;

   }
}