45 template <
typename TIterator,
typename TInteger>
55 template <
typename TIterator,
typename TInteger>
61 template <
typename TIterator,
typename TInteger>
69 template <
typename TIterator,
typename TInteger>
75 myForbiddenIntervals.clear();
80 template <
typename TIterator,
typename TInteger>
85 template <
typename TIterator,
typename TInteger>
114 template <
typename TIterator,
typename TInteger>
133 double angle_max=M_PI_4;
139 if(myOcculters.size()==0)
147 typename occulter_list::iterator iter;
149 for(iter = myOcculters.begin();ok && iter!=myOcculters.end() ;++iter)
151 pi =
Point(*(iter->first));
165 myOcculters.erase(iter);
176 if(alpha >= iter->second.angle_min && alpha <=
177 iter->second.angle_max)
184 iter->second.angle_min = alpha;
187 if(alpha > iter->second.angle_max)
190 myOcculters.erase(iter);
202 alpha =
M_PI - alpha;
204 if(alpha >= iter->second.angle_min && alpha <=
205 iter->second.angle_max)
211 iter->second.angle_max = alpha;
214 if(alpha < iter->second.angle_min)
217 myOcculters.erase(iter);
234 myOcculters.insert(myOcculters.end(),pair<const ConstIterator,occulter_attributes>(myIt-1,new_occ));
244 template <
typename TIterator,
typename TInteger>
255 for(
typename occulter_list::iterator iter =
256 myOcculters.begin(); iter!=myOcculters.end() ;++iter)
258 pi =
Point(*(iter->first));
267 if(v.norm()>=myS->myError/sqrt(2.0F))
276 double tmp = acos((
double) myS->myError/(sqrt(2.0F)*v.norm()));
277 double angle1 = -tmp+angle_v;
278 double angle2 = tmp+angle_v;
285 boost::icl::interval<double>::type s = boost::icl::interval<double>::closed(angle1,angle2);
286 myForbiddenIntervals.insert(s);
296 template <
typename TIterator,
typename TInteger>
313 template <
typename TIterator,
typename TInteger>
349 template <
typename TIterator,
typename TInteger>
360 template <
typename TIterator,
typename TInteger>
369 if(fabs(fabs(angle0-angle1)-
M_PI) < 0.00001)
376 if(fabs(angle0-angle1)<
M_PI)
406 template <
typename TIterator,
typename TInteger>
413 assert(angle0 != -1 && angle1 != -1);
415 *
this =
Cone(angle0,angle1);
419 template <
typename TIterator,
typename TInteger>
432 template <
typename TIterator,
typename TInteger>
443 template <
typename TIterator,
typename TInteger>
452 template <
typename TIterator,
typename TInteger>
459 res = intersectConesSimple(c);
465 res = intersectConesSimple(sym);
473 template <
typename TIterator,
typename TInteger>
512 template <
typename TIterator,
typename TInteger>
516 out <<
"[Cone]" << endl;
518 out <<
"Infinite" << endl;
520 out <<
"[Cone min = " << myMin <<
" max = " << myMax <<
"]" << endl;
521 out <<
"[End Cone]" << endl;
532 template <
typename TIterator,
typename TInteger>
549 template <
typename TIterator,
typename TInteger>
567 template <
typename TIterator,
typename TInteger>
578 template <
typename TIterator,
typename TInteger>
587 template <
typename TIterator,
typename TInteger>
595 template <
typename TIterator,
typename TInteger>
611 template <
typename TIterator,
typename TInteger>
620 template <
typename TIterator,
typename TInteger>
625 return ((myBegin == other.
myBegin) && (myEnd == other.
myEnd) && (myError == other.
myError));
630 template <
typename TIterator,
typename TInteger>
635 return (!(*
this == other));
639 template <
typename TIterator,
typename TInteger>
644 bool flag = (updateWidth() && updateBackpath());
653 template <
typename TIterator,
typename TInteger>
659 return (testUpdateWidth() && testUpdateBackpath());
663 template <
typename TIterator,
typename TInteger>
677 bool intersect = Tools::circleTangentPoints(firstP[0],firstP[1], newP[0], newP[1], myError/(sqrt(2.0F)), &x0, &y0,
685 if(fabs(x0-x1) < 0.00001 && fabs(y0-y1) < 0.00001)
687 double angle = Tools::computeAngle(firstP[0],firstP[1],newP[0],newP[1]);
689 double angle0 = angle -
M_PI_2;
691 angle0 = angle0+2*
M_PI;
692 double angle1 = angle + M_PI_2;
694 angle1 = angle1-2*M_PI;
695 c =
Cone(angle0,angle1);
698 c =
Cone(firstP[0],firstP[1],x0,y0,x1,y1);
709 template <
typename TIterator,
typename TInteger>
713 Cone c = computeNewCone();
723 double angle = Tools::computeAngle(firstP[0], firstP[1], newP[0], newP[1]);
733 template <
typename TIterator,
typename TInteger>
738 vector <typename FrechetShortcut<TIterator,TInteger>::Backpath> BackpathSave;
740 for(
unsigned int i=0;i<8;i++)
743 BackpathSave.push_back(b);
747 bool flag = updateBackpath();
750 for(
unsigned int i=0;i<8;i++)
751 myBackpath[i] =
Backpath(BackpathSave[i]);
759 template <
typename TIterator,
typename TInteger>
763 Cone c = computeNewCone();
777 double angle = Tools::computeAngle
778 (firstP[0], firstP[1], newP[0],
789 template <
typename TIterator,
typename TInteger>
796 int d = Tools::computeChainCode(prevP,P);
798 for(
unsigned int j=0;j<8;j++)
799 myBackpath[j].updateBackPathFirstQuad(Tools::rot(d,j),myEnd+1);
802 return isBackpathOk();
806 template <
typename TIterator,
typename TInteger>
815 int q = Tools::computeQuadrant(firstP,P);
824 v[0] = P[0]-firstP[0];
825 v[1] = P[1]-firstP[1];
829 Point dir_elem = Tools::chainCode2Vect(q);
831 double angle = Tools::angleVectVect(v,dir_elem);
833 boost::icl::interval_set<double> intervals = myBackpath[q].myForbiddenIntervals;
835 if(contains(intervals,angle))
843 template <
typename TIterator,
typename TInteger>
847 for(
unsigned int i=0;i<8;i++)
849 myBackpath[i].reset();
853 template <
typename TIterator,
typename TInteger>
863 template <
typename TIterator,
typename TInteger>
870 template <
typename TIterator,
typename TInteger>
880 template <
typename TIterator,
typename TInteger>
885 return "FrechetShortcut";
895 template <
typename TIterator,
typename TInteger>
901 out <<
"[FrechetShortcut]" << endl;
902 out <<
"(Begin, End)=";
903 out <<
"("<<
Point(*myBegin) <<
", " <<
Point(*myEnd) <<
")\n";
904 out <<
"[End FrechetShortcut]" << endl;
910 template <
typename TIterator,
typename TInteger>
916 object.selfDisplay( out );