home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / dos / diverses / leda / src / plane / _line.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-11-15  |  2.8 KB  |  122 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  2.1.1                                                 11-15-1991
  4. +
  5. +
  6. +  _line.c
  7. +
  8. +
  9. +  Copyright (c) 1991  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15. #include <LEDA/plane.h>
  16. #include <math.h>
  17.  
  18. static const double eps = 1e-10;
  19.  
  20. //------------------------------------------------------------------------------
  21. // lines 
  22. //------------------------------------------------------------------------------
  23.  
  24.  
  25. line_rep::line_rep(segment s)  
  26. { seg = s; 
  27.   count = 1; 
  28.  }
  29.  
  30. line_rep::line_rep() { count = 1; }
  31.  
  32. line::line()                    { ptr = new line_rep; }
  33. line::line(int)                 { ptr = new line_rep; }
  34. line::line(ent x)               { ptr= (line_rep*)x; ptr->count++; }
  35. line::line(line& l)             { ptr = l.ptr; ptr->count++; }
  36. line::line(segment s)           { ptr = new line_rep(s); }
  37. line::line(point x, point y)    { ptr = new line_rep(segment(x,y)); }
  38. line::line(point p, double alpha) { ptr = new line_rep(segment(p,alpha,1)); }
  39.   
  40. void line::clear()              { if (--(ptr->count)==0) delete ptr; }
  41.  
  42. double line::y_proj(double x)         
  43. { return slope() * x + y_abs(); }
  44.  
  45. double line::x_proj(double y)         
  46. { return (vertical()) ? ptr->seg.xcoord1() : (y-y_abs())/slope(); }
  47.  
  48. bool line::contains(point p)   
  49. { if (vertical())
  50.       return p.xcoord() == ptr->seg.xcoord1(); 
  51.   else
  52.       return p.ycoord() == y_proj(p.xcoord());
  53.  }
  54.  
  55. bool line::contains(segment s) 
  56. { point p = s.start(); 
  57.   point q = s.end();
  58.   if (contains(p))
  59.     if (contains(q)) return true; 
  60.   return false;
  61.  }
  62.  
  63.  
  64. ostream& operator<<(ostream& out, const line& l) 
  65. { return out << l.ptr->seg; }
  66.  
  67. istream& operator>>(istream& in, line& l)  
  68. { segment s; 
  69.   in >> s; 
  70.   l = line(s); 
  71.   return in; 
  72.  }
  73.  
  74. line& line::operator=(const line& l)
  75. { l.ptr->count++;
  76.   if (--ptr->count == 0)  delete ptr;
  77.   ptr = l.ptr;
  78.   return *this;
  79. }
  80.  
  81. bool line::intersection(line L, point& inter)
  82. {
  83.   point p = L.ptr->seg.ptr->start;
  84.   segment s = perpendicular(p);
  85.  
  86.   double l = s.length();
  87.  
  88.   if (l==0)
  89.   { inter = p;
  90.     return true;
  91.    }
  92.  
  93.   double fi = L.angle(s);
  94.   double cosfi = cos(fi);
  95.  
  96.   if (cosfi==0) return false;
  97.  
  98.   inter = p.translate(L.angle(),l/cosfi);
  99.   return true;
  100.  
  101.  }
  102.  
  103. bool line::intersection(segment s, point& inter)
  104. { if (intersection(line(s),inter))
  105.   { double d1  = inter.distance(s.ptr->start);
  106.     double d2  = inter.distance(s.ptr->end);
  107.     double l   = s.length();
  108.     if ( d1<=l && d2 <=l) return true;
  109.    }
  110.    return false;
  111. }
  112.  
  113.  
  114. segment line::perpendicular(point q)
  115. { segment s = ptr->seg;
  116.   point r = q.translate(s.angle()+M_PI_2,-distance(q));
  117.   return segment(q,r);
  118.  }
  119.  
  120.  
  121.