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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  point.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_POINT_H
  12. #define LEDA_POINT_H
  13. #include <LEDA/list.h>
  14. #include <LEDA/vector.h>
  15. class point;
  16. class segment;
  17. //------------------------------------------------------------------------------
  18. // points
  19. //------------------------------------------------------------------------------
  20. class point_rep  : public handle_rep {
  21. friend class point;
  22. friend class segment;
  23. friend class line;
  24. friend class circle;
  25.    
  26.    double x;
  27.    double y;
  28. public:
  29.     
  30.    point_rep();     
  31.    point_rep(double a, double b);
  32.   ~point_rep() {}
  33.    
  34. };
  35. /*{Manpage {point} {} {Points}}*/
  36. class point  : public handle_base 
  37. {
  38. /*{Mdefinition
  39. An instance of the data type $point$ is a point in the two-dimensional
  40. plane $real^2$. We use $(a,b)$ to denote a point with first (or x-)
  41. coordinate $a$ and second (or y-) coordinate $b$.}*/
  42. friend class segment;
  43. friend class line;
  44. friend class circle;
  45. point_rep* ptr() const { return (point_rep*)PTR; }
  46. public:
  47. /*{Mcreation p }*/
  48.  point();
  49. /*{Mcreate introduces a variable var of type name initialized 
  50.             to the point $(0,0)$.}*/
  51.  point(double x, double y);
  52. /*{Mcreate introduces a variable var of type name initialized to the point
  53.     $(x,y)$.}*/
  54.  point(vector v);
  55. /*{Mcreate introduces a variable var of type name initialized to the point
  56.     defined by vector $v$.}*/
  57.  point(const point& p) : handle_base(p) {}
  58. ~point() {}
  59. point& operator=(const point& p) { handle_base::operator=(p); return *this; }
  60. /*{Moperations 2 4}*/
  61. operator vector()         { return vector(ptr()->x,ptr()->y); }
  62. double  xcoord()  const   { return ptr()->x; }
  63. /*{Mop     returns the first coordinate of var.}*/
  64. double  ycoord()  const   { return ptr()->y; }
  65. /*{Mop     returns the second coordinate of var.}*/
  66. double  angle(const point&, const point&) const;
  67. double  distance(const point& q) const;
  68. /*{Mop     returns the Euclidean distance between var and $q$.}*/
  69. double  distance() const;
  70. /*{Mop     returns the Euclidean distance between var and $(0,0)$.}*/
  71. point   translate(double a, double d) const;
  72. /*{Mopl    returns the point created by translating 
  73.     var in direction $a$ by distance $d$. The  
  74.     direction is given by its angle with a 
  75.     right oriented horizontal ray.}*/
  76. point   translate(const vector& v) const;
  77. /*{Mop     returns var$+v$, i.e., var translated by vector 
  78.     $v$.\
  79.     precond $v$.dim() = 2.}*/
  80. point   rotate(const point& q,double a) const;
  81. /*{Mopl    returns the point created by a rotation of var 
  82.     about point $q$ by angle $a$.}*/
  83. point   rotate90(const point& q) const;
  84. /*{Mopl    returns the point created by a rotation of var 
  85.     about point $q$ by an angle of 90 degree.}*/
  86. point   rotate(double a) const;
  87. /*{Mop     returns var.rotate($point(0,0), a$). }*/
  88. point   rotate90() const;
  89. /*{Mop     returns var.rotate90($point(0,0)$). }*/
  90. int operator==(const point& q) const;
  91. /*{Mbinop  Test for equality.}*/
  92. bool operator&=(const point& q) const { return ptr() == q.ptr(); }
  93. int operator!=(const point& q)  const { return !operator==(q);}
  94. /*{Mbinop  Test for inequality.}*/
  95. point operator+(const vector& v) const { return translate(v); }
  96. /*{Mbinop  Translation by vector $v$.}*/
  97. friend ostream& operator<<(ostream& O, const point& p) ;
  98. /*{Mbinopfunc  writes var to output stream $O$.}*/
  99. friend istream& operator>>(istream& I, point& p) ;
  100. /*{Mbinopfunc  reads the coordinates of var (two $double$ numbers)
  101.         from input stream $I$.}*/
  102. friend inline bool identical(const point& p, const point& q);
  103. static int cmp(const point& a, const point& b)
  104. { int r = compare(a.xcoord(),b.xcoord());
  105.   return (r!=0) ? r : compare(a.ycoord(),b.ycoord());
  106.  }
  107. };
  108. inline void Print(const point& p, ostream& out) { out << p; } 
  109. inline void Read(point& p,  istream& in)        { in >> p; }
  110. inline int compare(const point& a, const point& b)
  111. { int r = compare(a.xcoord(),b.xcoord());
  112.   return (r!=0) ? r : compare(a.ycoord(),b.ycoord());
  113.  }
  114. // geometric primitives
  115. /*{Mtext
  116. {bf Non-Member Functions}
  117. smallskip
  118. }*/
  119. inline bool identical(const point& p, const point& q)
  120. { return p.ptr() == q.ptr(); }
  121. /*{Mfuncl  Test for identity.}*/
  122. extern double area(const point& a, const point& b, const point& c);
  123. /*{Mfuncl computes the signed area of the triangle determined by $a$,$b$,$c$,
  124.            positive if $orientation(a,b,c) > 0$ and negative otherwise. } */
  125. inline int orientation(const point& a, const point& b, const point& c)
  126. { return compare((a.xcoord()-b.xcoord()) * (a.ycoord()-c.ycoord()),
  127.                  (a.ycoord()-b.ycoord()) * (a.xcoord()-c.xcoord())); }
  128. /*{Mfuncl computes the orientation of points $a$, $b$, $c$, i.e., 
  129.            the sign of the determinant\
  130.            [ leftLvert begin{array}{ccc} a_x & a_y & 1\
  131.                                         b_x & b_y & 1\
  132.                                         c_x & c_y & 1
  133.                        end{array} rightLvert ] 
  134.             }*/
  135. inline bool collinear(const point& a, const point& b, const point& c)
  136. { return (a.ycoord()-b.ycoord()) * (a.xcoord()-c.xcoord()) ==
  137.          (a.xcoord()-b.xcoord()) * (a.ycoord()-c.ycoord()); }
  138. /*{Mfuncl returns true if points $a$, $b$, $c$ are collinear, i.e.,
  139.            $orientation(a,b,c) = 0$, and false otherwise. }*/
  140. inline bool right_turn(const point& a, const point& b, const point& c)
  141. { return (a.xcoord()-b.xcoord()) * (a.ycoord()-c.ycoord()) <
  142.          (a.ycoord()-b.ycoord()) * (a.xcoord()-c.xcoord()); }
  143. /*{Mfuncl returns true if points $a$, $b$, $c$ form a righ turn, i.e.,
  144.            $orientation(a,b,c) > 0$, and false otherwise. }*/
  145. inline bool left_turn(const point& a, const point& b, const point& c)
  146. { return (a.xcoord()-b.xcoord()) * (a.ycoord()-c.ycoord()) >
  147.          (a.ycoord()-b.ycoord()) * (a.xcoord()-c.xcoord()); }
  148. /*{Mfuncl returns true if points $a$, $b$, $c$ form a left turn, i.e.,
  149.            $orientation(a,b,c) < 0$, and false otherwise. }*/
  150. extern 
  151. int incircle(const point& a, const point& b, const point& c, const point& d);
  152. /*{Mfuncl returns $+1$ if point $d$ lies in the interior of the circle
  153.            through points $a$, $b$, and $c$, $0$ if $a$,$b$,$c$,and $d$ are
  154.            cocircular, and $-1$ otherwise. }*/
  155. #endif