21 #ifndef TLP_GEO_CIRCLE_H 
   22 #define TLP_GEO_CIRCLE_H 
   25 #include <tulip/Vector.h> 
   36 template<
typename Obj, 
typename OTYPE>
 
   37 struct Circle : 
public Vector<Obj,2, OTYPE> {
 
   39   Circle(
const Vector<Obj,2, OTYPE> &pos, Obj radius):Vector<Obj,2, OTYPE>(pos),radius(radius) {}
 
   40   Circle(
const Circle &c):Vector<Obj,2, OTYPE>(c),radius(c.radius) {}
 
   41   Circle(Obj x,Obj y,Obj radius):radius(radius) {
 
   48   void translate(
const Vector<Obj,2, OTYPE> &v) {
 
   56   Circle<Obj, OTYPE>& merge(
const Circle<Obj, OTYPE> &c);
 
   64   bool isIncludeIn(
const Circle<Obj, OTYPE> & circle) 
const;
 
   71 template<
typename Obj, 
typename OTYPE>
 
   72 bool intersection(
const tlp::Circle<Obj, OTYPE> &c1, 
const tlp::Circle<Obj, OTYPE> &c2,  tlp::Vector<Obj,2, OTYPE> &sol1,  tlp::Vector<Obj,2, OTYPE> &sol2) {
 
   73   double d =  c1.dist(c2);
 
   74   double r1 = c1.radius;
 
   75   double r2 = c2.radius;
 
   77   if (c1 == c2) 
return false;
 
   79   if (d > (r1 + r2)) 
return false; 
 
   81   if (d < fabs(r1 - r2)) 
return false; 
 
   83   double a = ((r1*r1) - (r2*r2) + (d*d)) / (2.0 * d);
 
   85   Vec2d p2(c1 + c1c2 * a/d);
 
   87   double h = sqrt((r1*r1) - (a*a));
 
   88   double rx = -c1c2[1] * (h/d);
 
   89   double ry =  c1c2[0] * (h/d);
 
  103 template<
typename Obj, 
typename OTYPE>
 
  104 tlp::Circle<Obj, OTYPE> enclosingCircle(
const tlp::Circle<Obj, OTYPE> &,
const tlp::Circle<Obj, OTYPE> &);
 
  109 template<
typename Obj, 
typename OTYPE>
 
  110 tlp::Circle<Obj, OTYPE> enclosingCircle(
const std::vector< tlp::Circle<Obj, OTYPE> > & circles);
 
  116 template<
typename Obj, 
typename OTYPE>
 
  117 tlp::Circle<Obj, OTYPE> lazyEnclosingCircle(
const std::vector< tlp::Circle<Obj, OTYPE> > & circles);
 
  121 template<
typename Obj, 
typename OTYPE>
 
  122 std::ostream& operator<<(std::ostream &os,const tlp::Circle<Obj, OTYPE> &);
 
  125 typedef Circle<double, long double> Circled;
 
  126 typedef Circle<float,  double> Circlef;
 
  127 typedef Circle<int,  double> Circlei;
 
  131 #include "cxx/Circle.cxx"