home *** CD-ROM | disk | FTP | other *** search
- /*******************************************************************************
- +
- + LEDA 2.1.1 11-15-1991
- +
- +
- + plane.h
- +
- +
- + Copyright (c) 1991 by Max-Planck-Institut fuer Informatik
- + Im Stadtwald, 6600 Saarbruecken, FRG
- + All rights reserved.
- +
- *******************************************************************************/
-
-
-
-
- #ifndef PLANEH
- #define PLANEH
-
- #include <LEDA/list.h>
- #include <LEDA/vector.h>
-
- class point;
- class segment;
-
- //------------------------------------------------------------------------------
- // points
- //------------------------------------------------------------------------------
-
- class point_rep {
-
- friend class point;
- friend class segment_rep;
- friend class segment;
- friend class line_rep;
- friend class line;
- friend class circle_rep;
- friend class circle;
-
- public:
-
- double x;
- double y;
- int count;
-
-
- point_rep();
- point_rep(double a, double b);
-
-
- OPERATOR_NEW(5)
- OPERATOR_DEL(5)
-
- };
-
- //------------------------------------------------------------------------------
-
- class point {
-
- friend class segment_rep;
- friend class segment;
- friend class line_rep;
- friend class line;
- friend class circle_rep;
- friend class circle;
-
- point_rep* ptr;
-
- public:
-
- point();
- point(double, double);
- point(vector);
- point(point&);
- point(ent);
- point(int);
- void clear();
-
- ~point() { clear(); }
-
- operator vector() { return vector(ptr->x,ptr->y); }
-
- double xcoord() const { return ptr->x; }
- double ycoord() const { return ptr->y; }
-
- double distance(point);
- double distance();
-
- point translate(double,double);
- point translate(const vector&);
-
- point rotate(point,double);
- point rotate(double);
-
- point& operator=(const point& p);
-
- point operator+(vector& v) { return translate(v); }
-
- int operator==(const point&);
-
- int operator!=(const point& p) { return !operator==(p);}
-
- friend ostream& operator<<(ostream& out, const point& p) ;
- friend istream& operator>>(istream& in, point& p) ;
-
- friend void Print(point& p, ostream& out = cout) { out << p; }
- friend void Read(point& p, istream& in = cin) { in >> p; }
-
- friend void Clear(point& p) { p.clear(); }
- friend ent Init(point& p) { p.ptr->count++; return ent(p.ptr); }
- friend ent Copy(const point& p) { p.ptr->count++; return ent(p.ptr); }
-
- friend ent Ent(const point& p) { return p.ptr; }
-
- friend int compare(point&, point&);
-
- };
-
- declare(list,point)
-
-
- //------------------------------------------------------------------------------
- // POINT(cmp): points with user defined linear order cmp
- //------------------------------------------------------------------------------
-
- #define POINT(cmp) name2(point_,cmp)
-
- #define POINTdeclare(cmp)\
- struct POINT(cmp) : public point \
- { POINT(cmp)(ent p) : point(p) {}\
- POINT(cmp)(int p) : point(p) {}\
- POINT(cmp)(point p ) : point(p) {}\
- POINT(cmp)(POINT(cmp)& p) : point(p) {}\
- POINT(cmp)() {}\
- ~ POINT(cmp)() {}\
- };\
- \
- int compare(POINT(cmp)& x, POINT(cmp)& y) { return cmp(x,y); }
-
-
- //------------------------------------------------------------------------------
- // segments
- //------------------------------------------------------------------------------
-
- class segment_rep {
-
- friend class segment;
- friend class line_rep;
- friend class line;
- friend class circle_rep;
- friend class circle;
-
- public:
-
- point start;
- point end;
-
- int count;
-
- segment_rep(point p, point q);
- segment_rep();
-
-
-
- OPERATOR_NEW(3)
- OPERATOR_DEL(3)
-
- };
-
- //------------------------------------------------------------------------------
-
- class segment {
-
- friend class line_rep;
- friend class line;
- friend class circle_rep;
- friend class circle;
-
- segment_rep* ptr;
-
- public:
-
- segment();
- segment(point x, point y);
- segment(double x1, double y1, double x2, double y2) ;
- segment(point p, double length, double alpha);
- segment(segment&);
- segment(ent);
- segment(int);
- void clear();
-
- ~segment() { clear(); }
-
-
- operator vector() { return vector(xcoord2()-xcoord1(), ycoord2()-ycoord1()); }
-
- bool intersection(segment s, point& inter);
-
- point start() const { return ptr->start; }
- point end() const { return ptr->end; }
-
- double xcoord1() { return ptr->start.ptr->x; }
- double xcoord2() { return ptr->end.ptr->x; }
- double ycoord1() { return ptr->start.ptr->y; }
- double ycoord2() { return ptr->end.ptr->y; }
-
- segment translate(double,double);
- segment translate(const vector&);
-
- double angle(segment);
- double angle();
- double direction() { return angle();}
- double distance(segment);
- double distance(point);
- double distance();
- double slope();
- double y_abs();
- double length();
-
- segment rotate(double);
- segment rotate(point,double);
-
- bool vertical();
- bool horizontal();
-
- bool right() { return ptr->start.ptr->x < ptr->end.ptr->x; }
- bool left() { return ptr->start.ptr->x > ptr->end.ptr->x; }
- bool up() { return ptr->start.ptr->y < ptr->end.ptr->y; }
- bool down() { return ptr->start.ptr->y > ptr->end.ptr->y; }
-
- segment& operator=(const segment& s);
-
- segment operator+(const vector& v) { return translate(v); }
-
- int operator==(const segment& s)
- { return (ptr->start == s.ptr->start && ptr->end == s.ptr->end); }
-
- int operator!=(const segment& s) { return !operator==(s);}
-
- friend ostream& operator<<(ostream& out, const segment& s);
- friend istream& operator>>(istream& in, segment& s);
-
- friend void Print(segment& s, ostream& out = cout) { out << s << "<" << s.ptr->count << ">"; }
- friend void Read(segment& s, istream& in = cin) { in >> s; }
-
- friend void Clear(segment& s) { s.clear(); }
- friend ent Init(segment& s) { s.ptr->count++; return ent(s.ptr); }
- friend ent Copy(const segment& s) { s.ptr->count++; return ent(s.ptr); }
-
- friend ent Ent(const segment& p) { return p.ptr; }
-
- };
-
- declare(list,segment)
-
-
- //------------------------------------------------------------------------------
- // SEGMENT(cmp): segments with user defined linear order cmp
- //------------------------------------------------------------------------------
-
- #define SEGMENT(cmp) name2(segment_,cmp)
-
- #define SEGMENTdeclare(cmp)\
- struct SEGMENT(cmp) : public point \
- { SEGMENT(cmp)(ent p) : segment(p) {}\
- SEGMENT(cmp)(int p) : segment(p) {}\
- SEGMENT(cmp)(segment p ) : segment(p) {}\
- SEGMENT(cmp)(SEGMENT(cmp)& p) : segment(p) {}\
- SEGMENT(cmp)() {}\
- ~ SEGMENT(cmp)() {}\
- };\
- \
- int compare(SEGMENT(cmp)& x, SEGMENT(cmp)& y) { return cmp(x,y); }
-
-
- //------------------------------------------------------------------------------
- // straight lines
- //------------------------------------------------------------------------------
-
-
- struct line_rep
- {
- segment seg;
- int count;
-
- line_rep(segment s);
- line_rep();
-
-
- OPERATOR_NEW(2)
- OPERATOR_DEL(2)
-
- };
-
-
- //------------------------------------------------------------------------------
-
- class line {
-
- line_rep* ptr;
-
- public:
-
- line();
- line(line&);
- line(segment);
- line(ent);
- line(int);
- line(point, point);
- line(point, double);
- void clear();
-
- ~line() { clear(); }
-
-
-
- bool intersection(line l, point& inter);
- bool intersection(segment s, point& inter);
-
- bool vertical() { return ptr->seg.vertical(); }
- bool horizontal() { return ptr->seg.horizontal();}
-
- double distance() { return ptr->seg.distance(); }
- double distance(point p) { return ptr->seg.distance(p); }
- double angle(line l) { return ptr->seg.angle(l.ptr->seg); }
- double angle() { return ptr->seg.angle(); }
- double direction() { return angle();}
- double slope() { return ptr->seg.slope(); }
- double y_abs() { return ptr->seg.y_abs(); }
-
- segment perpendicular(point q);
-
- line translate(double alpha, double d) { return ptr->seg.translate(alpha,d); }
- line translate(const vector& v) { return ptr->seg.translate(v); }
-
- line rotate(point o, double alpha){ return ptr->seg.rotate(o,alpha); }
- line rotate(double alpha) { return rotate(point(0,0),alpha);}
-
- double y_proj(double);
- double x_proj(double);
-
- bool contains(point);
- bool contains(segment);
-
- line& operator=(const line& l);
-
- line operator+(const vector& v) { return translate(v); }
-
- int operator==(const line& l) { return contains(l.ptr->seg); }
- int operator!=(const line& l) { return !contains(l.ptr->seg); };
-
- friend ostream& operator<<(ostream& out, const line& l);
- friend istream& operator>>(istream& in, line& l);
-
- friend void Clear(line& l) { l.clear(); }
- friend ent Init(line& l) { l.ptr->count++; return ent(l.ptr); }
-
- friend void Print(line& l, ostream& out = cout) { out << l; }
- friend void Read(line& l, istream& in = cin) { in >> l; }
-
- friend ent Copy(const line& l) { l.ptr->count++; return ent(l.ptr); }
-
- friend ent Ent(const line& p) { return p.ptr; }
-
- };
-
- declare(list,line)
-
-
- //------------------------------------------------------------------------------
- // LINE(cmp): lines with user defined linear order cmp
- //------------------------------------------------------------------------------
-
- #define LINE(cmp) name2(line_,cmp)
-
- #define LINEdeclare(cmp)\
- struct LINE(cmp) : public line \
- { LINE(cmp)(ent p) : line(p) {}\
- LINE(cmp)(int p) : line(p) {}\
- LINE(cmp)(line p ) : line(p) {}\
- LINE(cmp)(LINE(cmp)& p) : line(p) {}\
- LINE(cmp)() {}\
- ~ LINE(cmp)() {}\
- };\
- \
- int compare(LINE(cmp)& x, LINE(cmp)& y) { return cmp(x,y); }
-
-
- //------------------------------------------------------------------------------
- // circles
- //------------------------------------------------------------------------------
-
- struct circle_rep
- {
- double radius; // exchanging radius and center yields a compiler error
- point center;
- int count;
-
- circle_rep(point p, double r);
- circle_rep();
-
-
- OPERATOR_NEW(4)
- OPERATOR_DEL(4)
-
- };
-
- //------------------------------------------------------------------------------
-
- class circle {
-
- circle_rep* ptr;
-
- public:
-
- circle();
- circle(circle& l);
- circle(point c, double r);
- circle(double x, double y, double r);
- circle(ent);
- circle(int);
- void clear();
-
- ~circle() { clear(); }
-
-
- circle& operator=(const circle& C) { ptr = C.ptr; ptr->count++; return *this; }
-
- circle operator+(const vector& v) { return translate(v); }
-
-
- int operator==(const circle&) ;
-
- int operator!=(const circle& c) { return !operator==(c); };
-
- point center() const { return ptr->center; }
- double radius() const { return ptr->radius; }
-
-
- double distance(point);
- double distance(line);
- double distance(circle);
- bool inside(point);
- segment left_tangent(point);
- segment right_tangent(point);
-
- bool outside(point p) { return !inside(p); };
-
- circle translate(double,double) ;
- circle translate(const vector&) ;
-
- circle rotate(point, double);
- circle rotate(double);
-
-
- list(point) intersection(circle);
- list(point) intersection(line);
- list(point) intersection(segment);
-
- friend ostream& operator<<(ostream& out, const circle& c);
- friend istream& operator>>(istream& in, circle& c);
-
- friend void Clear(circle& c) { c.clear(); }
- friend ent Init(circle& c) { c.ptr->count++; return ent(c.ptr); }
-
- friend void Print(circle& c, ostream& out = cout) { out << c; }
- friend void Read(circle& c, istream& in = cin) { in >> c; }
-
- friend ent Copy(const circle& c) { c.ptr->count++; return ent(c.ptr); }
-
- friend ent Ent(const circle& p) { return p.ptr; }
-
- };
-
- declare(list,circle)
-
-
- //------------------------------------------------------------------------------
- // CIRCLE(cmp): circles with user defined linear order cmp
- //------------------------------------------------------------------------------
-
- #define CIRCLE(cmp) name2(circle_,cmp)
-
- #define CIRCLEdeclare(cmp)\
- struct CIRCLE(cmp) : public circle \
- { CIRCLE(cmp)(ent p) : circle(p) {}\
- CIRCLE(cmp)(int p) : circle(p) {}\
- CIRCLE(cmp)(circle p ) : circle(p) {}\
- CIRCLE(cmp)(CIRCLE(cmp)& p) : circle(p) {}\
- CIRCLE(cmp)() {}\
- ~ CIRCLE(cmp)() {}\
- };\
- \
- int compare(CIRCLE(cmp)& x, CIRCLE(cmp)& y) { return cmp(x,y); }
-
-
- //------------------------------------------------------------------------------
- // polygons
- //------------------------------------------------------------------------------
-
- struct polygon_rep
- {
- list(segment) seg_list;
- int count;
-
- polygon_rep(list(segment) L);
- polygon_rep();
-
-
- OPERATOR_NEW(6)
- OPERATOR_DEL(6)
-
- };
-
-
- //------------------------------------------------------------------------------
-
- class list(polygon);
-
- class polygon {
-
-
- polygon_rep* ptr;
-
- bool check();
-
- public:
-
- polygon();
- polygon(list(point)&, bool=true);
- polygon(polygon& P);
- polygon(ent);
- polygon(int);
- void clear();
-
- ~polygon() { clear(); }
-
-
- list(point) vertices() const;
- list(segment) segments() const { return ptr->seg_list; }
-
- bool inside (point p);
- bool outside (point p);
-
- list(point) intersection(segment s);
- list(point) intersection(line l);
- list(polygon) intersection(polygon P);
-
- polygon translate(double, double);
- polygon translate(const vector&);
-
- polygon rotate(point, double);
- polygon rotate(double);
-
- int size() { return ptr->seg_list.size(); }
- bool empty() { return ptr->seg_list.empty(); }
-
- polygon& operator=(const polygon& P) { ptr = P.ptr; ptr->count++; return *this; }
-
- polygon operator+(const vector& v) { return translate(v); }
-
- friend ostream& operator<<(ostream& out, const polygon& p);
- friend istream& operator>>(istream& in, polygon& p);
-
- friend void Print(polygon& P, ostream& out = cout){ out << P; }
- friend void Read(polygon& P, istream& in = cin) { in >> P; }
-
- friend void Clear(polygon& P){ P.clear(); }
- friend ent Init(polygon& P) { P.ptr->count++; return ent(P.ptr); }
- friend ent Copy(const polygon& P) { P.ptr->count++; return ent(P.ptr); }
-
- friend ent Ent(const polygon& p) { return p.ptr; }
-
- };
-
- declare(list,polygon)
-
-
- //------------------------------------------------------------------------------
- // POLYGON(cmp): polygons with user defined linear order cmp
- //------------------------------------------------------------------------------
-
- #define POLYGON(cmp) name2(polygon_,cmp)
-
- #define POLYGONdeclare(cmp)\
- struct POLYGON(cmp) : public polygon \
- { POLYGON(cmp)(ent p) : polygon(p) {}\
- POLYGON(cmp)(int p) : polygon(p) {}\
- POLYGON(cmp)(polygon p ) : polygon(p) {}\
- POLYGON(cmp)(POLYGON(cmp)& p) : polygon(p) {}\
- POLYGON(cmp)() {}\
- ~ POLYGON(cmp)() {}\
- };\
- \
- int compare(POLYGON(cmp)& x, POLYGON(cmp)& y) { return cmp(x,y); }
-
-
- //------------------------------------------------------------------------------
- // some usefull functions
- //------------------------------------------------------------------------------
-
- extern bool right_turn(point,point,point);
- extern bool left_turn(point,point,point);
- extern line p_bisector(point p, point q);
-
-
- /* #include <LEDA/plane_alg.h> */
-
-
- #endif
-