]> git.saurik.com Git - wxWidgets.git/blame - src/common/geometry.cpp
applied patch 475879 (Can't use subclassed GridCellEditor)
[wxWidgets.git] / src / common / geometry.cpp
CommitLineData
07cdd027 1/////////////////////////////////////////////////////////////////////////////
11e82c1b 2// Name: common/geometry.cpp
07cdd027
SC
3// Purpose: Common Geometry Classes
4// Author: Stefan Csomor
5// Modified by:
6// Created: 08/05/99
11e82c1b
VZ
7// RCS-ID:
8// Copyright: (c) 1999 Stefan Csomor
9// Licence: wxWindows licence
07cdd027
SC
10/////////////////////////////////////////////////////////////////////////////
11
12#ifdef __GNUG__
cd79f7b0 13 #pragma implementation "geometry.cpp"
07cdd027
SC
14#endif
15
07cdd027
SC
16// For compilers that support precompilation, includes "wx.h".
17#include "wx/wxprec.h"
18
19
20#ifdef __BORLANDC__
21#pragma hdrstop
22#endif
23
c3a4297c
VZ
24#if wxUSE_GEOMETRY
25
07cdd027
SC
26#include "wx/log.h"
27#include <string.h>
28
29
30#include "wx/geometry.h"
31#include "wx/datstrm.h"
32
33//
34// wxPoint2D
35//
36
37//
38// wxRect2D
39//
40
41// wxDouble version
42
43// for the following calculations always remember
44// that the right and bottom edges are not part of a rect
11e82c1b 45
07cdd027
SC
46bool wxRect2DDouble::Intersects( const wxRect2DDouble &rect ) const
47{
11e82c1b
VZ
48 wxDouble left,right,bottom,top;
49 left = wxMax ( m_x , rect.m_x );
50 right = wxMin ( m_x+m_width, rect.m_x + rect.m_width );
51 top = wxMax ( m_y , rect.m_y );
52 bottom = wxMin ( m_y+m_height, rect.m_y + rect.m_height );
53
54 if ( left < right && top < bottom )
55 {
56 return TRUE;
57 }
58 return FALSE;
07cdd027
SC
59}
60
11e82c1b 61void wxRect2DDouble::Intersect( const wxRect2DDouble &src1 , const wxRect2DDouble &src2 , wxRect2DDouble *dest )
07cdd027 62{
11e82c1b
VZ
63 wxDouble left,right,bottom,top;
64 left = wxMax ( src1.m_x , src2.m_x );
65 right = wxMin ( src1.m_x+src1.m_width, src2.m_x + src2.m_width );
66 top = wxMax ( src1.m_y , src2.m_y );
67 bottom = wxMin ( src1.m_y+src1.m_height, src2.m_y + src2.m_height );
68
69 if ( left < right && top < bottom )
70 {
71 dest->m_x = left;
72 dest->m_y = top;
73 dest->m_width = right - left;
74 dest->m_height = bottom - top;
75 }
76 else
77 {
78 dest->m_width = dest->m_height = 0;
79 }
07cdd027
SC
80}
81
11e82c1b 82void wxRect2DDouble::Union( const wxRect2DDouble &src1 , const wxRect2DDouble &src2 , wxRect2DDouble *dest )
07cdd027 83{
11e82c1b
VZ
84 wxDouble left,right,bottom,top;
85
86 left = wxMin ( src1.m_x , src2.m_x );
87 right = wxMax ( src1.m_x+src1.m_width, src2.m_x + src2.m_width );
88 top = wxMin ( src1.m_y , src2.m_y );
89 bottom = wxMax ( src1.m_y+src1.m_height, src2.m_y + src2.m_height );
90
91 dest->m_x = left;
92 dest->m_y = top;
93 dest->m_width = right - left;
94 dest->m_height = bottom - top;
07cdd027
SC
95}
96
11e82c1b 97void wxRect2DDouble::Union( const wxPoint2DDouble &pt )
07cdd027 98{
11e82c1b
VZ
99 wxDouble x = pt.m_x;
100 wxDouble y = pt.m_y;
101
102 if ( x < m_x )
103 {
104 SetLeft( x );
105 }
106 else if ( x < m_x + m_width )
107 {
108 // contained
109 }
110 else
111 {
112 SetRight( x );
113 }
114
115 if ( y < m_y )
116 {
117 SetTop( y );
118 }
119 else if ( y < m_y + m_height )
120 {
121 // contained
122 }
123 else
124 {
125 SetBottom( y );
126 }
07cdd027
SC
127}
128
129void wxRect2DDouble::ConstrainTo( const wxRect2DDouble &rect )
130{
11e82c1b
VZ
131 if ( GetLeft() < rect.GetLeft() )
132 SetLeft( rect.GetLeft() );
133
134 if ( GetRight() > rect.GetRight() )
135 SetRight( rect.GetRight() );
07cdd027 136
11e82c1b
VZ
137 if ( GetBottom() > rect.GetBottom() )
138 SetBottom( rect.GetBottom() );
07cdd027 139
11e82c1b
VZ
140 if ( GetTop() < rect.GetTop() )
141 SetTop( rect.GetTop() );
07cdd027
SC
142}
143
144// integer version
145
146// for the following calculations always remember
147// that the right and bottom edges are not part of a rect
11e82c1b 148
07cdd027
SC
149// wxPoint2D
150
151void wxPoint2DInt::WriteTo( wxDataOutputStream &stream ) const
11e82c1b
VZ
152{
153 stream.Write32( m_x );
154 stream.Write32( m_y );
07cdd027
SC
155}
156
11e82c1b
VZ
157void wxPoint2DInt::ReadFrom( wxDataInputStream &stream )
158{
159 m_x = stream.Read32();
160 m_y = stream.Read32();
07cdd027
SC
161}
162
163wxDouble wxPoint2DInt::GetVectorAngle()
164{
11e82c1b
VZ
165 if ( m_x == 0 )
166 {
167 if ( m_y >= 0 )
168 return 90;
169 else
170 return 270;
171 }
172 if ( m_y == 0 )
173 {
174 if ( m_x >= 0 )
175 return 0;
176 else
177 return 180;
178 }
179
180 // casts needed MIPSpro compiler under SGI
181 wxDouble deg = atan2( (double)m_y , (double)m_x ) * 180 / 3.14159265359;
182 if ( deg < 0 )
183 {
184 deg += 360;
185 }
186 return deg;
07cdd027
SC
187}
188
11e82c1b 189
07cdd027 190// wxRect2D
11e82c1b 191
07cdd027
SC
192bool wxRect2DInt::Intersects( const wxRect2DInt &rect ) const
193{
11e82c1b
VZ
194 wxInt32 left,right,bottom,top;
195 left = wxMax ( m_x , rect.m_x );
196 right = wxMin ( m_x+m_width, rect.m_x + rect.m_width );
197 top = wxMax ( m_y , rect.m_y );
198 bottom = wxMin ( m_y+m_height, rect.m_y + rect.m_height );
199
200 if ( left < right && top < bottom )
201 {
202 return TRUE;
203 }
204 return FALSE;
07cdd027
SC
205}
206
11e82c1b 207void wxRect2DInt::Intersect( const wxRect2DInt &src1 , const wxRect2DInt &src2 , wxRect2DInt *dest )
07cdd027 208{
11e82c1b
VZ
209 wxInt32 left,right,bottom,top;
210 left = wxMax ( src1.m_x , src2.m_x );
211 right = wxMin ( src1.m_x+src1.m_width, src2.m_x + src2.m_width );
212 top = wxMax ( src1.m_y , src2.m_y );
213 bottom = wxMin ( src1.m_y+src1.m_height, src2.m_y + src2.m_height );
214
215 if ( left < right && top < bottom )
216 {
217 dest->m_x = left;
218 dest->m_y = top;
219 dest->m_width = right - left;
220 dest->m_height = bottom - top;
221 }
222 else
223 {
224 dest->m_width = dest->m_height = 0;
225 }
07cdd027
SC
226}
227
11e82c1b 228void wxRect2DInt::Union( const wxRect2DInt &src1 , const wxRect2DInt &src2 , wxRect2DInt *dest )
07cdd027 229{
11e82c1b
VZ
230 wxInt32 left,right,bottom,top;
231
232 left = wxMin ( src1.m_x , src2.m_x );
233 right = wxMax ( src1.m_x+src1.m_width, src2.m_x + src2.m_width );
234 top = wxMin ( src1.m_y , src2.m_y );
235 bottom = wxMax ( src1.m_y+src1.m_height, src2.m_y + src2.m_height );
236
237 dest->m_x = left;
238 dest->m_y = top;
239 dest->m_width = right - left;
240 dest->m_height = bottom - top;
07cdd027
SC
241}
242
11e82c1b 243void wxRect2DInt::Union( const wxPoint2DInt &pt )
07cdd027 244{
11e82c1b
VZ
245 wxInt32 x = pt.m_x;
246 wxInt32 y = pt.m_y;
247
248 if ( x < m_x )
249 {
250 SetLeft( x );
251 }
252 else if ( x < m_x + m_width )
253 {
254 // contained
255 }
256 else
257 {
258 SetRight( x );
259 }
260
261 if ( y < m_y )
262 {
263 SetTop( y );
264 }
265 else if ( y < m_y + m_height )
266 {
267 // contained
268 }
269 else
270 {
271 SetBottom( y );
272 }
07cdd027
SC
273}
274
275void wxRect2DInt::ConstrainTo( const wxRect2DInt &rect )
276{
11e82c1b
VZ
277 if ( GetLeft() < rect.GetLeft() )
278 SetLeft( rect.GetLeft() );
279
280 if ( GetRight() > rect.GetRight() )
281 SetRight( rect.GetRight() );
07cdd027 282
11e82c1b
VZ
283 if ( GetBottom() > rect.GetBottom() )
284 SetBottom( rect.GetBottom() );
07cdd027 285
11e82c1b
VZ
286 if ( GetTop() < rect.GetTop() )
287 SetTop( rect.GetTop() );
07cdd027
SC
288}
289
290wxRect2DInt& wxRect2DInt::operator=( const wxRect2DInt &r )
11e82c1b
VZ
291{
292 m_x = r.m_x;
293 m_y = r.m_y;
294 m_width = r.m_width;
295 m_height = r.m_height;
296 return *this;
07cdd027
SC
297}
298
299void wxRect2DInt::WriteTo( wxDataOutputStream &stream ) const
11e82c1b
VZ
300{
301 stream.Write32( m_x );
302 stream.Write32( m_y );
303 stream.Write32( m_width );
304 stream.Write32( m_height );
07cdd027
SC
305}
306
11e82c1b
VZ
307void wxRect2DInt::ReadFrom( wxDataInputStream &stream )
308{
309 m_x = stream.Read32();
310 m_y = stream.Read32();
311 m_width = stream.Read32();
312 m_height = stream.Read32();
07cdd027
SC
313}
314
c3a4297c 315#endif // wxUSE_GEOMETRY