Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/gui/src/lib/math/rect2D.cc @ 7914

Last change on this file since 7914 was 7914, checked in by bensch, 18 years ago

orxonox/gui: simple almost finished implementation of a Rectangle Class, that should greatly improve work-flow in the GUI (most widgets are Rectangled :)

File size: 5.4 KB
Line 
1/*
2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 orx
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
11   ### File Specific:
12   main-programmer: Benjamin Grauer
13   co-programmer: Patrick Boenzli : Vector2D::scale()
14                                    Vector2D::abs()
15
16   Benjamin Grauer: port to Vector2D
17*/
18
19#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_MATH
20
21#include "rect2D.h"
22#ifdef DEBUG
23  #include "debug.h"
24#else
25  #include <stdio.h>
26  #define PRINT(x) printf
27#endif
28
29/**
30 * @brief creates a new Rectangle with
31 * @param x the left border
32 * @param y the top border
33 * @param width: the width
34 * @param height the height
35 */
36Rect2D::Rect2D(float x, float y, float width, float height)
37{
38  this->setLeft(x), this->setTop(y);
39  this->setSize(width, height);
40}
41
42/**
43 * @brief creates a new Rectangle with
44 * @param topLeft the top-left corner
45 * @param bottomRight the lower-right corner
46 */
47Rect2D::Rect2D(const Vector2D& topLeft, const Vector2D& bottomRight )
48{
49  this->setTopLeft(topLeft);
50  this->setBottomRight(bottomRight);
51}
52
53/**
54 * @brief creates a new Rectangle with
55 * @param rect the rectangle to copy.
56 */
57Rect2D::Rect2D(const Rect2D& rect)
58{
59  *this = rect;
60}
61
62/**
63 * @brief copies the Values of rect to this rect
64 * @param rect copy the values from.
65 * @returns this reference.
66 */
67Rect2D& Rect2D::operator=(const Rect2D& rect)
68{
69  this->_topLeft = rect._topLeft;
70  this->_bottomRight = rect._bottomRight;
71  return *this;
72}
73
74bool Rect2D::operator==(const Rect2D& rect) const
75{
76  return (this->_topLeft == rect._topLeft &&
77      this->_bottomRight == rect._bottomRight);
78}
79
80bool Rect2D::operator!=(const Rect2D& rect) const
81{
82  return (this->_topLeft != rect._topLeft ||
83      this->_bottomRight != rect._bottomRight);
84}
85
86
87Rect2D Rect2D::operator+(const Rect2D& rect) const
88  {
89    return Rect2D(this->_topLeft + rect._topLeft,
90                  this->_bottomRight + rect._bottomRight);
91  }
92
93
94Rect2D& Rect2D::operator+=(const Rect2D& rect)
95{
96  this->_topLeft += rect._topLeft;
97  this->_bottomRight += rect._bottomRight;
98  return *this;
99}
100
101
102Rect2D Rect2D::operator-(const Rect2D& rect) const
103{
104  return Rect2D(this->_topLeft - rect._topLeft,
105                this->_bottomRight - rect._bottomRight);
106}
107
108Rect2D& Rect2D::operator-=(const Rect2D& rect)
109{
110  this->_topLeft -= rect._topLeft;
111  this->_bottomRight -= rect._bottomRight;
112  return *this;
113}
114
115Rect2D Rect2D::operator&(const Rect2D& rect) const
116  {
117    return this->intersection(rect);
118  }
119
120Rect2D& Rect2D::operator&=(const Rect2D& rect)
121{
122  *this = this->intersection(rect);
123}
124
125Rect2D Rect2D::operator*(const Vector2D& scaling) const
126{
127#warning implements this...
128  //this->scale(scaling);
129}
130
131
132void Rect2D::setWidth(float width)
133{
134  this->_bottomRight.x = this->_topLeft.x + width;
135}
136
137
138void Rect2D::setHeight(float height)
139{
140  this->_bottomRight.y = this->_topLeft.y + height;
141}
142
143void Rect2D::setSize(float width, float height)
144{
145  this->_bottomRight = this->_topLeft + Vector2D(width, height);
146}
147
148void Rect2D::setSize(const Vector2D& size)
149{
150  this->_bottomRight = this->_topLeft + size;
151}
152
153void Rect2D::setCenter(const Vector2D& center)
154{
155  this->move(center - this->center());
156}
157
158void Rect2D::scaleX(float x)
159{
160  this->_bottomRight.x = this->_topLeft.x + this->width() * x;
161}
162
163void Rect2D::scaleY(float y)
164{
165  this->_bottomRight.y = this->_topLeft.y + this->height() * y;
166}
167
168void Rect2D::scale(float x, float y)
169{
170  this->scale(Vector2D(x,y));
171}
172
173void Rect2D::scale(const Vector2D& v)
174{
175  this->_bottomRight = this->_topLeft + this->size().internalMultipy(v);
176
177}
178
179void Rect2D::scaleCentered(float x, float y)
180{
181  this->scaleCentered(Vector2D(x, y));
182}
183
184void Rect2D::scaleCentered(const Vector2D& v)
185{
186#warning implement this
187}
188
189void Rect2D::moveX(float x)
190{
191  this->_topLeft.x += x;
192  this->_bottomRight.x += x;
193}
194
195void Rect2D::moveY(float y)
196{
197  this->_topLeft.y += y;
198  this->_bottomRight.y += y;
199}
200void Rect2D::move(const Vector2D& v)
201{
202  this->_topLeft += v;
203  this->_bottomRight += v;
204}
205
206void Rect2D::swapTopBottom()
207{
208  float tmp = this->top();
209  this->setTop(this->bottom());
210  this->setBottom(tmp);
211}
212
213void Rect2D::swapLeftRight()
214{
215  float tmp = this->left();
216  this->setLeft(this->right());
217  this->setRight(tmp);
218}
219
220
221void Rect2D::normalize()
222{
223  if (this->top() > this->bottom())
224    this->swapTopBottom();
225  if (this->left() > this->right())
226    this->swapLeftRight();
227}
228
229Rect2D Rect2D::normalized() const
230{
231  Rect2D norm(*this);
232  norm.normalize();
233  return norm;
234}
235
236
237Rect2D Rect2D::intersection(const Rect2D& intersector) const
238{
239#warning implement
240}
241
242bool Rect2D::intersects(const Rect2D& intersector) const
243  {
244#warning implement
245
246  }
247Rect2D Rect2D::unite(const Rect2D& rect)
248  {
249#warning implement
250  }
251bool Rect2D::contains(const Rect2D& rect) const
252  {
253    return (this->top() <= rect.top() &&
254        this->bottom() >= rect.bottom() &&
255        this->left() <= rect.left() &&
256        this->right() >= rect.right());
257  }
258bool Rect2D::contains(const Vector2D& point) const
259  {
260    return (this->top() <= point.y &&
261        this->bottom() >= point.y &&
262        this->left() <= point.x &&
263        this->right() >= point.x);
264  }
265
266const Rect2D& Rect2D::slerp(const Rect2D& rect, float value)
267{
268  this->_topLeft.slerp(rect._topLeft, value);
269  this->_bottomRight.slerp(rect._bottomRight, value);
270
271  return *this;
272}
273
Note: See TracBrowser for help on using the repository browser.