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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  line.h
  6. +
  7. +  Copyright (c) 1995  by  Max-Planck-Institut fuer Informatik
  8. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  9. +  All rights reserved.
  10. *******************************************************************************/
  11. #ifndef LEDA_LINE_H
  12. #define LEDA_LINE_H
  13. #include <LEDA/point.h>
  14. #include <LEDA/segment.h>
  15. //------------------------------------------------------------------------------
  16. // straight lines
  17. //------------------------------------------------------------------------------
  18. class line_rep : public handle_rep {
  19. friend class line;
  20.   segment  seg; 
  21. public:
  22.    
  23.   line_rep() {}
  24.   line_rep(const segment& s)  { seg = s; }
  25.  ~line_rep() {}
  26. friend inline int cmp_slopes(const line&, const line&);
  27. friend inline int orientation(const line&, const point&);
  28. };
  29.    
  30. /*{Manpage {line} {} {Straight Lines}}*/
  31. class line   : public handle_base 
  32. {
  33. /*{Mdefinition
  34. An instance $l$ of the data type $line$ is a directed straight line
  35. in the two-dimensional plane. The angle between a right oriented horizontal
  36. line and $l$ is called the direction of $l$.}*/
  37. line_rep* ptr() const { return (line_rep*)PTR; }
  38. public:
  39. /*{Mcreation l }*/
  40.  line(const point& p, const point& q);
  41. /*{Mcreate 
  42. introduces a variable var of type name. var is initialized to the line
  43. passing through points $p$ and $q$ directed form $p$ to $q$.}*/
  44.  line(const segment& s);
  45. /*{Mcreate 
  46. introduces a variable var of type name. var is initialized to the line
  47. supporting segment $s$.}*/
  48.  line(const point& p, const vector& v);
  49. /*{Mcreate 
  50. introduces a variable var of type name. var is initialized to the line
  51. of all poinnts $p + lambda v$. precond $v.dim() = 2$ and $v.length() > 0$. }*/
  52.  line(const point& p, double a);
  53. /*{Mcreate 
  54. introduces a variable var of type name. var is initialized to the line
  55. passing through point $p$ with direction $a$.}*/
  56.  line();
  57. /*{Mcreate 
  58. introduces a variable var of type name. var is initialized to the line
  59. passing through the origin with direction 0.}*/
  60.  line(const line& l) : handle_base(l) {};
  61.  line& operator=(const line& l) { handle_base::operator=(l); return *this; }
  62. ~line() {}
  63. /*{Moperations 2 4.5 }*/
  64. double direction() const { return angle(); }
  65. /*{Mop     returns the direction of var.}*/
  66. double angle(const line& g) const { return ptr()->seg.angle(g.ptr()->seg); }
  67. /*{Mop     returns the angle between var and $g$, i.e., 
  68.     $g$.direction() $-$ var.direction().}*/
  69. double angle() const     { return ptr()->seg.angle();     }
  70. /*{Mop     returns var.direction().}*/
  71. bool vertical() const    { return ptr()->seg.vertical();  }
  72. /*{Mop     returns true iff var is vertical.}*/
  73. bool horizontal() const  { return ptr()->seg.horizontal();}
  74. /*{Mop     returns true iff var is horizontal.}*/
  75. double distance() const  { return ptr()->seg.distance();  }
  76. double distance(point p) const { return ptr()->seg.distance(p); }
  77. double slope() const     { return ptr()->seg.slope();     }
  78. /*{Mop     returns the slope of var.\
  79.     precond  var  is not vertical.}*/
  80. segment seg()  const     { return ptr()->seg; }
  81. double y_proj(double x) const  { return ptr()->seg.y_proj(x); };
  82. /*{Mop     returns $p$.ycoord(), where $p in l$ with $p$.xcoord() 
  83.     = $x$.\ precond var is not vertical.}*/
  84. double x_proj(double y) const  { return ptr()->seg.x_proj(y); };
  85. /*{Mop     returns $p$.xcoord(), where $p in l$ with $p$.ycoord() 
  86.     = $y$.\ precond var is not horizontal.}*/
  87. double y_abs() const { return ptr()->seg.y_proj(0); }
  88. /*{Mop     returns the y-abscissa of var (var.y_proj(0)).\
  89.     precond  var  is not vertical.}*/
  90. bool intersection(const line& g, point& inter) const;
  91. /*{Mopl    if $l$ and $g$ are not collinear and intersect the 
  92.             intersection point is assigned to $inter$ and true is 
  93.             returned, otherwise false is returned.}*/
  94. bool intersection(const segment& s, point& inter) const;
  95. /*{Mopl    if $l$ and $s$ are not collinear and intersect the 
  96.     intersection point is assigned to $inter$ and true is 
  97.     returned, otherwise false is returned.}*/
  98. line translate(double a, double d) const 
  99. { return ptr()->seg.translate(a,d); }
  100. /*{Mopl     returns the line created by a translation of
  101.     var in direction $a$ by distance $d$.}*/
  102. line translate(const vector& v)  const 
  103. { return ptr()->seg.translate(v); }
  104. /*{Mop     returns $l+v$, i.e., the line created by 
  105.             translating $l$ by vector $v$.\
  106.     precond $v$.dim() = 2.}*/ 
  107. line rotate(const point& q, double a) const
  108. { return ptr()->seg.rotate(q,a); }
  109. /*{Mopl     returns the line created by a rotation of $l$
  110.     about point $q$ by angle $a$.}*/
  111. line rotate(double a) const  
  112. { return rotate(point(0,0),a);}
  113. /*{Mop     returns $l$.rotate($point(0,0), a$). }*/
  114. segment perpendicular(const point& p) const;
  115. /*{Mop     returns the normal of $p$ with respect to var.}*/
  116. bool contains(const point&) const;
  117. bool contains(const segment&) const;
  118. line operator+(const vector& v) const { return translate(v); }
  119. bool operator==(const line& g) const { return contains(g.ptr()->seg); }
  120. /*{Mbinop      Test for equality.}*/
  121. bool operator!=(const line& g) const { return !contains(g.ptr()->seg); }
  122. /*{Mbinop      Test for inequality.}*/
  123. friend int orientation(const line& l, const point& p);
  124. /*{Mfunc      computes orientation($a$, $b$, $p$), where $a not= b$
  125. and $a$ and $b$ appear in this order on line $l$. }*/
  126. friend int cmp_slopes(const line& l1, const line& l2);
  127. /*{Mfunc      returns compare(slope($l_1$), slope($l_2$)).}*/
  128. friend ostream& operator<<(ostream& out, const line& l);
  129. friend istream& operator>>(istream& in, line& l);  
  130. };
  131. inline  int orientation(const line& l, const point& p)
  132. { return orientation(l.ptr()->seg,p); }
  133. inline  int cmp_slopes(const line& l1, const line& l2)
  134. { return cmp_slopes(l1.ptr()->seg,l2.ptr()->seg); }
  135. inline bool parallel(const line& l1, const line& l2)
  136. { return cmp_slopes(l1,l2) == 0; }
  137. inline void Print(const line& l, ostream& out) { out << l; } 
  138. inline void Read(line& l, istream& in)         { in >> l; }
  139. extern line p_bisector(const point& p, const point& q);
  140. #endif