template <class Type> REAL BoxFreemanCompil<Type>::D2BoxSeg(const Box2d<Type> & b,const SegComp & s) { if (s.p0() == s.p1()) return b.SquareDist(s.p0()); INT c1 = b.freeman_pos (s.p0()); INT c2 = b.freeman_pos (s.p1()); switch ( TAB_CONF_CPLE_FREEM[c1][c2]) { case INTER_TOUJ : return 0.0; case CFF_00 : return ElMin(b.SquareDist(s.p0(),c1),b.SquareDist(s.p1(),c2)); case CFF_11 : { return s.square_dist_seg(PQ1(b,c1,c2)); } case CFF_13 : { return ElMin ( s.square_dist_seg(PQ1(b,c1,c2)), s.square_dist_seg(PQ2(b,c1,c2)) ); } case CFF_01 : { return ElMin3 ( b.SquareDist(s.p0(),c1), b.SquareDist(s.p1(),c2), s.square_dist_seg(PQ1(b,c1,c2)) ); } case CFF_02 : { REAL ord1 = s.ordonnee(PQ1(b,c1,c2)); if (TAB_TRIGO_CF[c1][c2] ) return ( (ord1 > 0) ? ElSquare(ord1) : 0.0); else return ( (ord1 < 0) ? ElSquare(ord1) : 0.0); } case CFF_03 : { REAL ord1 = s.ordonnee(PQ1(b,c1,c2)); return (TAB_TRIGO_CF[c1][c2] == (ord1>0.0)) ? ElSquare(ord1) : 0.0 ; } case CFF_15 : { REAL ord1 = s.ordonnee(PQ1(b,c1,c2)); REAL ord2 = s.ordonnee(PQ2(b,c1,c2)); return ((ord1 < 0) == (ord2 < 0)) ? ElMin(ElSquare(ord1),ElSquare(ord2)) : 0.0 ; } default : ; } cout << "CODE " << c1 << " " << c2 << " " << TAB_CONF_CPLE_FREEM[c1][c2] << endl; ELISE_ASSERT(false,"Dist Box/seg ??? "); return 0; }