_point.c
上传用户:gzelex
上传日期:2007-01-07
资源大小:707k
文件大小:4k
开发平台:

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  _point.c
  6. +
  7. +  Copyright (c) 1995  by  Max-Planck-Institut fuer Informatik
  8. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  9. +  All rights reserved.
  10. *******************************************************************************/
  11. #include <LEDA/segment.h>
  12. #include <math.h>
  13. #include <ctype.h>
  14. //------------------------------------------------------------------------------
  15. // points 
  16. //------------------------------------------------------------------------------
  17. point_rep::point_rep()  { count=1; x = y = 0.0; }
  18. point_rep::point_rep(double a, double b) 
  19. { x = a; 
  20.   y = b; 
  21.   count = 1; 
  22. }
  23. point::point()                  { PTR = new point_rep; }
  24. point::point(double x, double y){ PTR = new point_rep(x,y); }
  25. point::point(vector v)          { PTR = new point_rep(v[0], v[1]); }
  26. double point::angle(const point& q, const point& r) const
  27. {
  28.   double cosfi,fi,norm;
  29.   
  30.   double dx  = q.ptr()->x - ptr()->x; 
  31.   double dy  = q.ptr()->y - ptr()->y; 
  32.   double dxs = r.ptr()->x - q.ptr()->x; 
  33.   double dys = r.ptr()->y - q.ptr()->y; 
  34.   
  35.   cosfi=dx*dxs+dy*dys;
  36.   
  37.   norm=(dx*dx+dy*dy)*(dxs*dxs+dys*dys);
  38.   cosfi /= sqrt( norm );
  39.   if (cosfi >=  1.0 ) return 0;
  40.   if (cosfi <= -1.0 ) return LEDA_PI;
  41.   
  42.   fi=acos(cosfi);
  43.   if (dx*dys-dy*dxs>0) return fi;
  44.   return -fi;
  45. }
  46.   
  47. // Rotations 
  48. point point::rotate90(const point& origin) const
  49. { double cx = origin.xcoord();
  50.   double cy = origin.ycoord();
  51.   double dx = xcoord() - cx;
  52.   double dy = ycoord() - cy;
  53.   return point(cx-dy,cy+dx);
  54. }
  55. point point::rotate90() const
  56. { return point(-ycoord(),xcoord()); }
  57. point point::rotate(const point& origin, double fi) const
  58. { double cx = origin.xcoord();
  59.   double cy = origin.ycoord();
  60.   double sinfi = sin(fi);
  61.   double cosfi = cos(fi);
  62.   double dx = xcoord() - cx;
  63.   double dy = ycoord() - cy;
  64.   return point(cx+dx*cosfi-dy*sinfi,cy+dx*sinfi+dy*cosfi);
  65. }
  66. point point::rotate(double fi) const
  67. { double sinfi = sin(fi);
  68.   double cosfi = cos(fi);
  69.   double x = xcoord();
  70.   double y = ycoord();
  71.   return point(x*cosfi-y*sinfi,x*sinfi+y*cosfi);
  72. }
  73. // Translations
  74. /*
  75. point point::translate(double dx, double dy) const
  76. { return point(xcoord()+dx,ycoord()+dy); }
  77. */
  78. point point::translate(double phi, double d) const
  79. { double dx = cos(phi) * d;
  80.   double dy = sin(phi) * d;
  81.   if (fabs(dx) < 1e-12) dx = 0; 
  82.   if (fabs(dy) < 1e-12) dy = 0; 
  83.   return point(xcoord()+dx,ycoord()+dy);
  84.  }
  85. point point::translate(const vector& v) const 
  86. { return point(xcoord()+v[0],ycoord()+v[1]); }
  87. // Distances
  88. double point::distance(const point& p)  const
  89. { double dx = p.ptr()->x - ptr()->x; 
  90.   double dy = p.ptr()->y - ptr()->y;
  91.   return sqrt(dx*dx + dy*dy);
  92.  }
  93. double point::distance() const
  94. { return distance(point(0,0)); }
  95. int point::operator==(const point& p) const 
  96. { return (ptr()->x == p.ptr()->x) && (ptr()->y == p.ptr()->y); }
  97.    
  98. int incircle(const point& a, const point& b, const point& c, const point& d)
  99. {
  100.    double ax = a.xcoord();
  101.    double ay = a.ycoord();
  102.    double bx = b.xcoord() - ax;
  103.    double by = b.ycoord() - ay;
  104.    double bw = bx*bx + by*by;
  105.    double cx = c.xcoord() - ax;
  106.    double cy = c.ycoord() - ay;
  107.    double cw = cx*cx + cy*cy;
  108.    double dx = d.xcoord() - ax;
  109.    double dy = d.ycoord() - ay;
  110.    double dw = dx*dx + dy*dy;
  111.    //return (by*cw-cy*bw) * (bx*dw-dx*bw) > (bx*cw-cx*bw) * (by*dw-dy*bw);
  112.    double D = (by*cx-bx*cy)*dw + (cy*bw-by*cw)*dx  + (bx*cw-cx*bw)*dy;
  113.    if (D != 0) 
  114.       return (D > 0) ? 1 : -1;
  115.    else
  116.       return 0;
  117.  }
  118. double area(const point& a, const point& b, const point& c)
  119. { return ((a.xcoord()-b.xcoord()) * (a.ycoord()-c.ycoord()) -
  120.           (a.ycoord()-b.ycoord()) * (a.xcoord()-c.xcoord()))/2; }
  121. ostream& operator<<(ostream& out, const point& p)
  122. { out << "(" << p.xcoord() << "," << p.ycoord() << ")";
  123.   return out;
  124.  } 
  125. istream& operator>>(istream& in, point& p) 
  126. { // syntax: {(} x {,} y {)}
  127.   double x,y; 
  128.   char c;
  129.   do in.get(c); while (in && isspace(c));
  130.   if (!in) return in;
  131.   if (c != '(') in.putback(c);
  132.   in >> x;
  133.   do in.get(c); while (isspace(c));
  134.   if (c != ',') in.putback(c);
  135.   in >> y; 
  136.   do in.get(c); while (c == ' ');
  137.   if (c != ')') in.putback(c);
  138.   p = point(x,y); 
  139.   return in; 
  140.  }