Differences From Artifact [0f1f35288c2dfafe]:
- File        
lib/geo/line_circle.cpp
- 2012-05-20 14:16:51 - part of checkin [2034908d41] on branch trunk - 543 (user: kinaba) [annotate]
 
To Artifact [f037935b3feedc1e]:
- File        
lib/geo/circle.cpp
- 2013-06-30 08:35:05 - part of checkin [07ad2e1283] on branch trunk - Geocon library update. (user: kinaba) [annotate]
 
    1  typedef long double LD;                                                          |     1  // Verified: partly by geocon2013 D(1).
    2  typedef complex<LD> CMP;                                                         <
    3                                                                                         2  
                                                                                        >     3  // Crosspoing of a line (not lineseg!) and a circle).
    4  bool line_circle(CMP la, CMP lb, CMP c, LD r, CMP* p1, CMP* p2)                  |     4  bool line_circle(CMP la, CMP lb, CMP c, double r, CMP* p1, CMP* p2)
    5  {                                                                                      5  {
    6          CMP v = (lb-la) / abs(lb-la);                                                  6          CMP v = (lb-la) / abs(lb-la);
    7          CMP o = (c-la) / v;                                                            7          CMP o = (c-la) / v;
    8          if( abs(o.imag()) > r )                                                        8          if( abs(o.imag()) > r )
    9                  return false;                                                          9                  return false;
   10          LD dx = sqrt(r*r - o.imag()*o.imag());                                   |    10          double dx = sqrt(r*r - o.imag()*o.imag());
   11          *p1 = la + (o.real()-dx)*v;                                                   11          *p1 = la + (o.real()-dx)*v;
   12          *p2 = la + (o.real()+dx)*v;                                                   12          *p2 = la + (o.real()+dx)*v;
   13          return true;                                                                  13          return true;
   14  }                                                                                     14  }
                                                                                        >    15  
                                                                                        >    16  // Whether or not |p| is in the circle (c, r).
                                                                                        >    17  bool pt_in_circle(CMP p, CMP c, double r)
                                                                                        >    18  {
                                                                                        >    19          return norm(p-c) <= r*r;
                                                                                        >    20  }
                                                                                        >    21  
                                                                                        >    22  // Assuming |o| is outside (C,r), compute the two tangent points.
                                                                                        >    23  void sessen(CMP o, CMP c, double r, CMP* p1, CMP* p2)
                                                                                        >    24  {
                                                                                        >    25          double len = sqrt(norm(c-o) - r*r);
                                                                                        >    26          double theta = asin(r/abs(c-o));
                                                                                        >    27  
                                                                                        >    28          if(p1) *p1 = o+(c-o)*polar(len/abs(c-o), theta);
                                                                                        >    29          if(p2) *p2 = o+(c-o)*polar(len/abs(c-o), -theta);
                                                                                        >    30  }
                                                                                        >    31  
                                                                                        >    32  // For two points |p| and |q| on (c,r), compute their distance along the circle.
                                                                                        >    33  double d_on_c(CMP c, double r, CMP p, CMP q)
                                                                                        >    34  {
                                                                                        >    35          return abs(arg((p-c) / (q-c))) * r;
                                                                                        >    36  }