00001
00011 #ifndef DEFINE_H_YRECT
00012 #define DEFINE_H_YRECT
00013
00014 #include <basic.h>
00015 #include <bstdlib.h>
00016 #include <tcode.h>
00017 #include <errcode.h>
00018 #include <btron/btron.h>
00019 #include <btron/dp.h>
00020 #include "ypoint.h"
00021
00027 class YRect : public RECT::_rect {
00028 public:
00030 YRect() {}
00031
00040 YRect(W x1, W y1, W x2, W y2) {
00041 setRect(x1, y1, x2, y2);
00042 }
00043
00049 YRect(const YRect& src) {
00050 operator=(src);
00051 }
00052
00058 YRect(const RECT& src) {
00059 operator=(src);
00060 }
00061
00068 YRect(const PNT& p1, const PNT& p2) {
00069 setRect(p1, p2);
00070 }
00071
00073 ~YRect() {}
00074
00084 void setRect(W x1, W y1, W x2, W y2) {
00085 left = x1;
00086 top = y1;
00087 right = x2;
00088 bottom = y2;
00089 }
00090
00100 void setRect(const PNT& p1, const PNT& p2) {
00101 setRect(p1.x, p1.y, p2.x, p2.y);
00102 }
00103
00109 const YPoint& topLeft() const {
00110 return *((YPoint*)&((RECT*)this)->p.lefttop);
00111 }
00112
00118 const YPoint& bottomRight() const {
00119 return *((YPoint*)&((RECT*)this)->p.rightbot);
00120 }
00121
00122
00128 YPoint center() const {
00129 return YPoint((right+left)/2, (top+bottom)/2);
00130 };
00131
00137 W width() const {
00138 return right - left;
00139 }
00140
00149 void shrink(W wx, W wy){
00150 left += wx;
00151 right -= wx;
00152 top += wy;
00153 bottom -= wy;
00154 }
00155
00164 void expand(W wx, W wy){
00165 shrink(-wx, -wy);
00166 }
00167
00173 W height() const {
00174 return bottom - top;
00175 }
00176
00182 const YRect& operator=(const RECT& src) {
00183 setRect(src.c.left, src.c.top, src.c.right, src.c.bottom);
00184 return *this;
00185 }
00186
00192 const YRect& operator=(const YRect& src) {
00193 setRect(src.left, src.top, src.right, src.bottom);
00194 return *this;
00195 }
00196
00198
00199 const YRect& operator+=(const PNT& exp) {
00200 top += exp.y;
00201 left += exp.x;
00202 right += exp.x;
00203 bottom += exp.y;
00204 return *this;
00205 }
00206
00208
00209 const YRect& operator-=(const PNT& exp) {
00210 top -= exp.y;
00211 left -= exp.x;
00212 right -= exp.x;
00213 bottom -= exp.y;
00214 return *this;
00215 }
00216
00222 bool operator==(const YRect& exp) const {
00223 return (top == exp.top && left == exp.left &&
00224 right == exp.right && bottom == exp.bottom);
00225 }
00226
00232 bool operator==(const RECT& exp) const {
00233 return (top == exp.c.top && left == exp.c.left &&
00234 right == exp.c.right && bottom == exp.c.bottom);
00235 }
00236
00242 bool operator!=(const YRect& exp) const {
00243 return !(operator==(exp));
00244 }
00245
00251 bool operator!=(const RECT& exp) const {
00252 return !(operator==(exp));
00253 }
00254
00259 operator const RECT() const {
00260 return *reinterpret_cast<const RECT*>(this);
00261 }
00262
00267 operator RECT() {
00268 return *const_cast<RECT*>(reinterpret_cast<const RECT*>(this));
00269 }
00270
00276 bool isInside(const PNT &pnt) {
00277 return (left <= pnt.x && pnt.x < right && top <= pnt.y
00278 && pnt.y < bottom);
00279 }
00280
00281 protected:
00282
00283 private:
00284
00285 };
00286
00287 #endif // DEFINE_H_YRECT