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; }
/* 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; }
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; } }