00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef __CS_RECT_H__
00022 #define __CS_RECT_H__
00023
00051 class csRect
00052 {
00053 public:
00055 int xmin, ymin, xmax, ymax;
00056
00058 csRect ();
00059
00061 csRect (int ixmin, int iymin, int ixmax, int iymax);
00062
00064 csRect (const csRect ©);
00065
00067 virtual ~csRect ();
00068
00070 void Intersect (int ixmin, int iymin, int ixmax, int iymax);
00071
00073 inline void Intersect (const csRect &other)
00074 { Intersect (other.xmin, other.ymin, other.xmax, other.ymax); }
00075
00077 bool Intersects (const csRect &target) const;
00078
00083 void Union (int ixmin, int iymin, int ixmax, int iymax);
00084
00089 inline void Union (const csRect &other)
00090 { Union (other.xmin, other.ymin, other.xmax, other.ymax); }
00091
00097 void Exclude (int ixmin, int iymin, int ixmax, int iymax);
00098
00100 inline void Exclude (const csRect &other)
00101 { Exclude (other.xmin, other.ymin, other.xmax, other.ymax); }
00102
00107 void Subtract (const csRect &rect);
00108
00110 inline bool IsEmpty () const
00111 { return (xmin >= xmax) || (ymin >= ymax); }
00112
00114 inline void MakeEmpty ()
00115 { xmin = xmax = 0; }
00116
00118 inline void Set (int ixmin, int iymin, int ixmax, int iymax)
00119 {
00120 xmin = ixmin; xmax = ixmax;
00121 ymin = iymin; ymax = iymax;
00122 }
00123
00125 inline void Set (const csRect &target)
00126 {
00127 xmin = target.xmin; xmax = target.xmax;
00128 ymin = target.ymin; ymax = target.ymax;
00129 }
00130
00132 inline void SetPos (int x, int y)
00133 { xmin = x; ymin = y; }
00134
00136 inline void SetSize (int w, int h)
00137 { xmax = xmin + w; ymax = ymin + h; }
00138
00140 inline void Move (int dX, int dY)
00141 { xmin += dX; xmax += dX; ymin += dY; ymax += dY; }
00142
00144 inline int Width () const { return xmax - xmin; }
00145
00147 inline int Height () const { return ymax - ymin; }
00148
00150 inline bool Contains (int x, int y) const
00151 { return (x >= xmin) && (x < xmax) && (y >= ymin) && (y < ymax); }
00152
00154 inline bool ContainsRel (int x, int y) const
00155 { return (x >= 0) && (x < Width ()) && (y >= 0) && (y < Height ()); }
00156
00158 inline bool Equal (int ixmin, int iymin, int ixmax, int iymax) const
00159 { return (xmin == ixmin) && (ymin == iymin) &&
00160 (xmax == ixmax) && (ymax == iymax); }
00162 inline bool Equal (const csRect &other) const
00163 { return Equal (other.xmin, other.ymin, other.xmax, other.ymax); }
00164
00166 inline void Normalize ()
00167 {
00168 if (xmin > xmax) { int tmp = xmin; xmin = xmax; xmax = tmp; }
00169 if (ymin > ymax) { int tmp = ymin; ymin = ymax; ymax = tmp; }
00170 }
00171
00173 inline int Area () const
00174 {
00175 if (IsEmpty ())
00176 return 0;
00177 else
00178 return Width () * Height ();
00179 }
00180
00182 void AddAdjanced (const csRect &rect);
00183
00185 inline bool operator == (const csRect& rect) const
00186 {
00187 return Equal (rect);
00188 }
00189
00191 inline bool operator != (const csRect &rect) const
00192 {
00193 return !Equal (rect);
00194 }
00195
00197 inline void Extend (int x, int y)
00198 {
00199 if (xmin > x) xmin = x; if (xmax < x) xmax = x;
00200 if (ymin > y) ymin = y; if (ymax < y) ymax = y;
00201 }
00202
00204 void Join (const csRect &rect);
00205
00207 void Outset(int n);
00208
00210 void Inset(int n);
00211
00219 bool ClipLineGeneral (int& x1, int& y1, int& x2, int& y2);
00220
00228 bool ClipLine (int& x1, int& y1, int& x2, int& y2);
00229
00237 bool ClipLineSafe (int& x1, int& y1, int& x2, int& y2);
00238 };
00239
00242 #endif // __CS_RECT_H__
00243