home *** CD-ROM | disk | FTP | other *** search
/ Dream 52 / Amiga_Dream_52.iso / Linux / Divers / freedraft.tar.gz / freedraft.tar / FREEdraft-050298 / GEOMLIB2D / segment.cpp < prev    next >
C/C++ Source or Header  |  1998-04-25  |  2KB  |  71 lines

  1. // segment.cpp
  2.  
  3. // Copyright (C) 1997  Cliff Johnson                                       //
  4. //                                                                         //
  5. // This program is free software; you can redistribute it and/or           //
  6. // modify it under the terms of the GNU  General Public                    //
  7. // License as published by the Free Software Foundation; either            //
  8. // version 2 of the License, or (at your option) any later version.        //
  9. //                                                                         //
  10. // This software is distributed in the hope that it will be useful,        //
  11. // but WITHOUT ANY WARRANTY; without even the implied warranty of          //
  12. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU       //
  13. // General Public License for more details.                                //
  14. //                                                                         //
  15. // You should have received a copy of the GNU General Public License       //
  16. // along with this software (see COPYING.LIB); if not, write to the        //
  17. // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. //
  18.  
  19. #include "segment.h"
  20. #include "geom_enum.h"
  21. #include "line.h"
  22. #include "geomexception.h"
  23.  
  24. Segment::Segment():Geom(SEGMENT)
  25. {
  26.     origin = Point();
  27.     endpoint = Point(1,0);
  28. }
  29.  
  30. Segment::Segment(const Point& o, const Point& e)throw(GeomException)
  31.     :Geom(SEGMENT),origin(o),endpoint(e)
  32. {
  33.     double d = o.Distance(e);
  34.     if(d < Point::NullDist) throw GeomException("Segment::Segment(o,e) : Points are equal");
  35.     if(d > Point::MaxSize) throw GeomException("Segment::Segment(o,e) : Segment too long - exceeds Point::MaxDist");
  36. }
  37.  
  38. Point Segment::U(double u) const
  39. {
  40.     return origin + u * ( endpoint - origin ); 
  41. }
  42.  
  43. ostream& operator<<(ostream& os, const Segment& l)
  44. {
  45.     os << "Segment: O = " << l.origin << "  E =  " << l.endpoint ;
  46.     return os;
  47. }
  48.  
  49. Line Segment::Support() const
  50. {
  51.     return Line(origin,endpoint-origin);
  52. }
  53.  
  54. Point Segment::Project(const Point& p) const
  55. {
  56.     Line l = Support();
  57.     return l.Project(p);
  58. }
  59.  
  60. double Segment::Distance(const Point& p) const
  61. {
  62.     Line l = Support();
  63.     Point px = l.Project(p);
  64.     return p.Distance(px);
  65. }
  66.  
  67. double Segment::Length() const
  68. {
  69.     return origin.Distance(endpoint);
  70. }
  71.