// ---------------------------------------------------------------------------- // Description : Rectangular geometry. // ---------------------------------------------------------------------------- // (c) Copyright 1997 by iXiONmedia, all rights reserved. // ---------------------------------------------------------------------------- #ifndef IXLIB_GEOMETRY #define IXLIB_GEOMETRY #include #include #include #include // coord_vector -------------------------------------------------------------------- namespace ixion { template class coord_vector { protected: T Data[DIM]; public: coord_vector() { } /* template coord_vector(InputIterator first,InputIterator last) { for (int i=0; i coord_vector(coord_vector const &src) { for (int i=0; i=2) Data[1] = y; if (DIM>=3) Data[2] = z; } T &operator[](int const index) { return Data[index]; } T const &operator[](int const index) const { return Data[index]; } int getDimension() const { return DIM;} template bool operator==(coord_vector const &vec) const { for (int i=0; i bool operator!=(coord_vector const &vec) const { for (int i=0; i coord_vector &operator=(TP data[]) { for (int i=0; i coord_vector &operator=(coord_vector const &vec) { for (int i=0; i coord_vector &operator+=(coord_vector const &vec) { for (int i=0; i coord_vector operator+(coord_vector const &vec) const { coord_vector result; for (int i=0; i coord_vector &operator-=(coord_vector const &vec) { for (int i=0; i coord_vector operator-(coord_vector const &vec) const { coord_vector result; for (int i=0; i T operator*(coord_vector const &vec) const { T result = Data[0] * vec.Data[0]; for (int i=1; i=2) Data[1] = y; if (DIM>=3) Data[2] = z; } void move(T const x,T const y = 0,T const z = 0) { Data[0] += x; if (DIM>=2) Data[1] += y; if (DIM>=3) Data[2] += z; } }; template inline coord_vector operator*(T scalar,coord_vector const &vec) { return vec*scalar; } template inline double getAngle(coord_vector const &vec1,coord_vector const &vec2) { double ip = vec1*vec2/(sqrt(vec1*vec1)*sqrt(vec2*vec2)); return acos(ip); } template inline double getAngle(coord_vector const &vec) { return atan2(double(vec[1]),double(vec[0])); } // rectangle ----------------------------------------------------------------- template struct rectangle { coord_vector A,B; rectangle() { } rectangle(T ax, T ay, T bx, T by) : A(ax,ay),B(bx,by) { } rectangle(coord_vector const &a,coord_vector const &b) : A(a),B(b) { } template rectangle(rectangle const &src) : A(src.A),B(src.B) { } template rectangle &operator=(rectangle const &src) { A = src.A; B = src.B; return *this; } T width() const { return B[0]-A[0]; } T height() const { return B[1]-A[1]; } T area() const { return width()*height(); } bool contains(T x, T y) const { return (A[0] <= x) && (x < B[0]) && (A[1] <= y) && (y < B[1]); } bool contains(coord_vector const &point) const { return (A[0] <= point[0]) && (point[0] < B[0]) && (A[1] <= point[1]) && (point[1] < B[1]); } bool intersects(rectangle const &rect) const { return NUM_OVERLAP(A[0],B[0],rect.A[0],rect.B[0]) && NUM_OVERLAP(A[1],B[1],rect.A[1],rect.B[1]); } bool empty() const { return (B[0] <= A[0]) || (B[1] <= A[1]); } void clear() { B = A; } void set(T ax, T ay, T bx, T by) { A.set(ax,ay); B.set(bx,by); } template void set(coord_vector const &a,coord_vector const &b) { A = a; B = b; } void setSize(T sizex,T sizey) { B = A + coord_vector(sizex,sizey); } template void setSize(coord_vector const &p) { B = A+p; } void resize(T dx,T dy) { B.move(dx,dy); } template void resize(coord_vector const &p) { B += p; } void move(T dx,T dy) { coord_vector p(dx,dy); A += p; B += p; } template void move(coord_vector const &p) { A += p; B += p; } void unite(rectangle const &rect); void intersect(rectangle const &rect); template rectangle &operator+=(coord_vector const &p) { move(p); return *this; } template rectangle operator+(coord_vector const &p) { rectangle copy(*this); copy.move(p); return copy; } template rectangle &operator-=(coord_vector const &p) { move(p*(-1)); return *this; } template rectangle operator-(coord_vector const &p) { rectangle copy(*this); copy.move(p*(-1)); return copy; } /// \deprecated use width() instead. T getSizeX() const { return width(); } /// \deprecated use height() instead. T getSizeY() const { return height(); } /// \deprecated use width() instead. T getWidth() const { return width(); } /// \deprecated use height() instead. T getHeight() const { return height(); } /// \deprecated use area() instead. T getArea() const { return area(); } /// \deprecated use contains() instead. bool doesContain(T x, T y) const { return contains(x,y); } /// \deprecated use contains() instead. bool doesContain(coord_vector const &point) const { return contains(point); } /// \deprecated use intersects() instead. bool doesIntersect(rectangle const &rect) const { return intersects(rect); } /// \deprecated use empty() instead. bool isEmpty() const { return empty(); } }; // region -------------------------------------------------------------------- template class region { protected: std::vector< rectangle > Rects; public: typedef typename std::vector< rectangle >::iterator iterator; typedef typename std::vector< rectangle >::const_iterator const_iterator; TSize size() const { return Rects.size(); } iterator begin() { return Rects.begin(); } const_iterator begin() const { return Rects.begin(); } iterator end() { return Rects.end(); } const_iterator end() const { return Rects.end(); } void add(rectangle const &rect); void intersect(rectangle const &rect); void subtract(rectangle const &rect); void operator+=(rectangle const &rect) { add(rect); } void operator*=(rectangle const &rect) { intersect(rect); } void operator-=(rectangle const &rect) { subtract(rect); } bool contains(T x, T y) const { return contains(coord_vector(x,y)); } bool contains(coord_vector const &point) const; bool intersects(rectangle const &rect) const; bool empty() const { return Rects.empty(); } void clear() { Rects.clear(); } /// \deprecated use contains() instead. bool doesContain(T x, T y) const { return contains(coord_vector(x,y)); } /// \deprecated use contains() instead. bool doesContain(coord_vector const &point) const { return contains(point); } /// \deprecated use intersects() instead. bool doesIntersect(rectangle const &rect) const { return intersects(rect); } /// \deprecated use empty() instead. bool isEmpty() const { return empty(); } protected: void deleteEmptyRectangles(); }; } #endif