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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  rat_segment.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_RAT_SEGMENT_H
  12. #define LEDA_RAT_SEGMENT_H
  13. #include <LEDA/rat_point.h>
  14. //------------------------------------------------------------------------------
  15. // rat_segments
  16. //------------------------------------------------------------------------------
  17. class rat_segment_rep : public handle_rep {
  18. static unsigned long id_counter;
  19. friend class rat_segment;
  20. friend class rat_line;
  21.    
  22.    rat_point start;
  23.    rat_point end;
  24.    integer dx;
  25.    integer dy;
  26.    double dxd;
  27.    double dyd;
  28.    unsigned long id;
  29. public:
  30.    
  31.    rat_segment_rep(const rat_point&, const rat_point&);
  32.    rat_segment_rep();  
  33.   ~rat_segment_rep() {}
  34.    
  35. };
  36. /*{Manpage {rat_segment} {} {Rational Segments} }*/
  37. class rat_segment  : public handle_base {
  38. /*{Mdefinition
  39. An instance $s$ of the data type $rat_segment$ is a directed straight line
  40. segment with rational coordinates in the two-dimensional plane, i.e.,
  41. a line segment $[p,q]$ connecting two rational points $p$ and $q$ (cf. 
  42. ref{Rational Points}). $p$ is called the start point and $q$ is called the 
  43. end point of $s$. The segment $[(0,0),(0,0)]$ is said to be empty. }*/
  44.  
  45.   friend class rat_line;
  46.   rat_segment_rep* ptr() const { return (rat_segment_rep*)PTR; }
  47. public:
  48. static int use_filter;
  49. /*{Mcreation s }*/
  50. rat_segment() { PTR = new rat_segment_rep; }
  51. /*{Mcreate introduces a variable var of type name. var is initialized
  52.             to the empty segment. }*/
  53. rat_segment(const rat_point& p, const rat_point& q) 
  54.   { PTR = new rat_segment_rep(p,q); }
  55. /*{Mcreate introduces a variable var of type name. var is initialized
  56.             to the segment $(p,q)$. }*/
  57. rat_segment(const integer& x1, const integer& y1, const integer& x2, const integer& y2) 
  58. { PTR = new rat_segment_rep(rat_point(x1,y1), rat_point(x2,y2)); }
  59. /*{Mcreate introduces a variable var of type name. var is initialized
  60.             to the segment $[(x1,y1),(x2,y2)]$. }*/
  61.   rat_segment(const rat_segment& s) : handle_base(s) {}     
  62.  ~rat_segment()                {}
  63.   rat_segment& operator=(const rat_segment& s) 
  64.   { handle_base::operator=(s); return *this;}
  65. /*{Moperations 2 3.5 }*/
  66. rat_point start()  const { return ptr()->start; }
  67. rat_point source() const { return ptr()->start; }
  68. /*{Mop       returns the source point of segment var.}*/
  69. rat_point end()    const { return ptr()->end; }
  70. rat_point target() const { return ptr()->end; }
  71. /*{Mop       returns the target point of segment var.}*/
  72. double xcoord1() const { return ptr()->start.xcoord(); }
  73. /*{Mop       returns a double precision approximation of the $x$-coordinate
  74.               of the start point of segment var.}*/
  75. double xcoord2() const { return ptr()->end.xcoord();   }
  76. /*{Mop       returns a double precision approximation of the $x$-coordinate
  77.               of the end point of segment var.}*/
  78. double ycoord1() const { return ptr()->start.ycoord(); }
  79. /*{Mop       returns a double precision approximation of the $y$-coordinate
  80.               of the start point of segment var.}*/
  81. double ycoord2() const { return ptr()->end.ycoord();   }
  82. /*{Mop       returns a double precision approximation of the $y$-coordinate
  83.               of the end point of segment var.}*/
  84. integer X1() const { return ptr()->start.X(); }
  85. /*{Mop       returns the first homogeneous coordinate of the start point 
  86.               of segment var.}*/
  87. integer X2() const { return ptr()->end.X();   }
  88. /*{Mop       returns the first homogeneous coordinate of the end point 
  89.               of segment var.}*/
  90. integer Y1() const { return ptr()->start.Y(); }
  91. /*{Mop       returns the second homogeneous coordinate of the start point 
  92.               of segment var.}*/
  93. integer Y2() const { return ptr()->end.Y();   }
  94. /*{Mop       returns the second homogeneous coordinate of the end point 
  95.               of segment var.}*/
  96. integer W1() const { return ptr()->start.W(); }
  97. /*{Mop       returns the third homogeneous coordinate of the start point 
  98.               of segment var.}*/
  99. integer W2() const { return ptr()->end.W();   }
  100. /*{Mop       returns the third homogeneous coordinate of the end point 
  101.               of segment var.}*/
  102. double XD1() const { return ptr()->start.XD(); }
  103. /*{Mop       returns a floating point approximation of the first homogeneous 
  104.               coordinate of the start point of segment var.}*/
  105. double XD2() const { return ptr()->end.XD();   }
  106. /*{Mop       returns a floating point approximation of the first homogeneous 
  107.               coordinate of the end point of segment var.}*/
  108. double YD1() const { return ptr()->start.YD(); }
  109. /*{Mop       returns a floating point approximation of the second homogeneous 
  110.               coordinate of the start point of segment var.}*/
  111. double YD2() const { return ptr()->end.YD();   }
  112. /*{Mop       returns a floating point approximation of the second homogeneous 
  113.               coordinate of the end point of segment var.}*/
  114. double WD1() const { return ptr()->start.WD(); }
  115. /*{Mop       returns a floating point approximation of the third homogeneous 
  116.               coordinate of the start point of segment var.}*/
  117. double WD2() const { return ptr()->end.WD();   }
  118. /*{Mop       returns a floating point approximation of the third homogeneous 
  119.               coordinate of the end point of segment var.}*/
  120. integer dx() const { return ptr()->dx; }
  121. /*{Mop       returns the normalized $x$-difference $X1cdot W2 - X2cdot W1$
  122.               of the segment. }*/
  123. integer dy() const { return ptr()->dy; }
  124. /*{Mop       returns the normalized $y$-difference $Y1cdot W2 - Y2cdot W1$
  125.               of the segment. }*/
  126. double dxd() const { return ptr()->dxd; }
  127. /*{Mop       returns the optimal floating point approximation of the 
  128.               normalized $x$-difference of the segment. }*/
  129. double dyd() const { return ptr()->dyd; }
  130. /*{Mop       returns the optimal floating point approximation of the 
  131.               normalized $y$-difference of the segment. }*/
  132. bool vertical()   const { return ptr()->dx == 0; }
  133. /*{Mop       returns true if var is vertical and false otherwise. }*/
  134. bool horizontal() const { return ptr()->dy == 0; }
  135. /*{Mop       returns true if var is horizontal and false otherwise. }*/
  136. int cmp_slope(const rat_segment& s1) const 
  137. { return sign(dy()*s1.dx()-s1.dy()*dx()); }
  138. /*{Mopl       compares the slopes of var and $s_1$. }*/
  139. bool intersection(const rat_segment& t, rat_point& p) const;
  140. /*{Mopl    if var and $t$ are not collinear and intersect the
  141.             point of intersection is assigned to $p$ and the result is
  142.             true, otherwise the result is false. }*/
  143. bool intersection_of_lines(const rat_segment& t, rat_point& p) const;
  144. /*{Mopl    if the lines supporting var and $t$ are not parallel
  145.             their point of intersection is assigned to $p$ and the result is
  146.             true, otherwise the result is false. }*/
  147. int operator==(const rat_segment& t) const
  148. { return (ptr()->start == t.ptr()->start && ptr()->end == t.ptr()->end); }
  149. /*{Mbinop       Test for equality.}*/
  150. int operator!=(const rat_segment& t) const { return !operator==(t);}
  151. /*{Mbinop       Test for inequality.}*/
  152. friend bool identical(const rat_segment& s1, const rat_segment& s2)
  153. { return s1.ptr() == s2.ptr(); }
  154. /*{Mbinopfunc  Test for identity ...}*/
  155. friend ostream& operator<<(ostream& O, const rat_segment& s);
  156. /*{Mbinopfunc writes the homogeneous coordinates of $s$ (six $integer$ numbers)
  157.                to output stream $O$.}*/
  158. friend istream& operator>>(istream& I, rat_segment& s);
  159. /*{Mbinopfunc reads the homogeneous coordinates of $s$ (six $integer$ numbers)
  160.                from input stream $I$.}*/
  161. friend int orientation(const rat_segment& s, const rat_point& p);
  162. /*{Mfuncl      computes orientation($a$, $b$, $p$), where $a not= b$
  163. and $a$ and $b$ appear in this order on segment $s$. }*/
  164. friend int cmp_slopes(const rat_segment& s1, const rat_segment& s2);
  165. /*{Mfuncl      returns compare(slope($s_1$), slope($s_2$)).}*/
  166. friend int cmp_segments_at_xcoord(const rat_segment& s1,const rat_segment& s2,
  167.                           const rat_point& r);
  168. friend bool intersection(const rat_segment& s1,const rat_segment& s2);
  169. /*{Mfuncl      decides whether $s1$ and $s2$ intersect. }*/
  170. };
  171. inline void Print(const rat_segment& s, ostream& out) { out << s; } 
  172. inline void Read(rat_segment& s, istream& in) { in >> s; }
  173. inline int parallel(const rat_segment& s1, const rat_segment& s2)
  174. { return cmp_slopes(s1,s2) == 0; }
  175. #endif