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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  _line.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/line.h>
  12. #include <math.h>
  13. //------------------------------------------------------------------------------
  14. // lines 
  15. //------------------------------------------------------------------------------
  16. line::line()
  17. { PTR = new line_rep; }
  18. line::line(const segment& s) 
  19. { PTR = new line_rep(s); }
  20. line::line(const point& x, const point& y)    
  21. { PTR = new line_rep(segment(x,y)); }
  22. line::line(const point& p, const vector& v) 
  23. { PTR = new line_rep(segment(p,v)); }
  24. line::line(const point& p, double alpha) 
  25. { PTR = new line_rep(segment(p,alpha,1)); }
  26.   
  27. bool line::contains(const point& p) const
  28. { return orientation(ptr()->seg,p) == 0; }
  29. bool line::contains(const segment& s) const
  30. { return contains(s.start()) && contains(s.end()); }
  31. ostream& operator<<(ostream& out, const line& l) 
  32. { return out << l.seg(); }
  33. istream& operator>>(istream& in, line& l)  
  34. { segment s; 
  35.   in >> s; 
  36.   l = line(s); 
  37.   return in; 
  38.  }
  39. bool line::intersection(const line& s, point& inter) const
  40. { return ptr()->seg.intersection_of_lines(s.ptr()->seg,inter) ; }
  41. bool line::intersection(const segment& s, point& inter) const
  42.   double orient1 = orientation(ptr()->seg,s.start());
  43.   double orient2 = orientation(ptr()->seg,s.end());
  44.   if ( orient1*orient2 <= 0) 
  45.      { ptr()->seg.intersection_of_lines(s,inter);
  46.        return true;
  47.       }
  48.   else
  49.      return false;
  50. }
  51. segment line::perpendicular(const point& q) const
  52. { segment s0 = ptr()->seg;
  53.   segment s1 = s0.rotate90();
  54.   point r;
  55.   s0.intersection_of_lines(s1,r);
  56.   return segment(q,r);
  57.  }
  58. line p_bisector(const point& p, const point& q)
  59. { double dx = q.xcoord() - p.xcoord();
  60.   double dy = q.ycoord() - p.ycoord();
  61.   double x1 = (p.xcoord() + q.xcoord())/2;
  62.   double y1 = (p.ycoord() + q.ycoord())/2;
  63.   return line(point(x1,y1),point(x1+dy,y1-dx));
  64. }