]>
git.saurik.com Git - wxWidgets.git/blob - src/common/geometry.cpp
   1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        common/geometry.cpp 
   3 // Purpose:     Common Geometry Classes 
   4 // Author:      Stefan Csomor 
   8 // Copyright:   (c) 1999 Stefan Csomor 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  13     #pragma implementation "geometry.cpp" 
  16 // For compilers that support precompilation, includes "wx.h". 
  17 #include "wx/wxprec.h" 
  30 #include "wx/geometry.h" 
  31 #include "wx/datstrm.h" 
  43 // for the following calculations always remember 
  44 // that the right and bottom edges are not part of a rect 
  46 bool wxRect2DDouble::Intersects( const wxRect2DDouble 
&rect 
) const 
  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 
); 
  54     if ( left 
< right 
&& top 
< bottom 
) 
  61 void wxRect2DDouble::Intersect( const wxRect2DDouble 
&src1 
, const wxRect2DDouble 
&src2 
, wxRect2DDouble 
*dest 
) 
  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 
); 
  69     if ( left 
< right 
&& top 
< bottom 
) 
  73         dest
->m_width 
= right 
- left
; 
  74         dest
->m_height 
= bottom 
- top
; 
  78         dest
->m_width 
= dest
->m_height 
= 0; 
  82 void wxRect2DDouble::Union( const wxRect2DDouble 
&src1 
, const wxRect2DDouble 
&src2 
, wxRect2DDouble 
*dest 
) 
  84     wxDouble left
,right
,bottom
,top
; 
  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 
); 
  93     dest
->m_width 
= right 
- left
; 
  94     dest
->m_height 
= bottom 
- top
; 
  97 void wxRect2DDouble::Union( const wxPoint2DDouble 
&pt 
) 
 106     else if ( x 
< m_x 
+ m_width 
) 
 119     else if ( y 
< m_y 
+ m_height 
) 
 129 void wxRect2DDouble::ConstrainTo( const wxRect2DDouble 
&rect 
) 
 131     if ( GetLeft() < rect
.GetLeft() ) 
 132         SetLeft( rect
.GetLeft() ); 
 134     if ( GetRight() > rect
.GetRight() ) 
 135         SetRight( rect
.GetRight() ); 
 137     if ( GetBottom() > rect
.GetBottom() ) 
 138         SetBottom( rect
.GetBottom() ); 
 140     if ( GetTop() < rect
.GetTop() ) 
 141         SetTop( rect
.GetTop() ); 
 146 // for the following calculations always remember 
 147 // that the right and bottom edges are not part of a rect 
 151 void wxPoint2DInt::WriteTo( wxDataOutputStream 
&stream 
) const 
 153     stream
.Write32( m_x 
); 
 154     stream
.Write32( m_y 
); 
 157 void wxPoint2DInt::ReadFrom( wxDataInputStream 
&stream 
) 
 159     m_x 
= stream
.Read32(); 
 160     m_y 
= stream
.Read32(); 
 163 wxDouble 
wxPoint2DInt::GetVectorAngle() 
 180     // casts needed MIPSpro compiler under SGI 
 181     wxDouble deg 
= atan2( (double)m_y 
, (double)m_x 
) * 180 / 3.14159265359; 
 192 bool wxRect2DInt::Intersects( const wxRect2DInt 
&rect 
) const 
 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 
); 
 200     if ( left 
< right 
&& top 
< bottom 
) 
 207 void wxRect2DInt::Intersect( const wxRect2DInt 
&src1 
, const wxRect2DInt 
&src2 
, wxRect2DInt 
*dest 
) 
 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 
); 
 215     if ( left 
< right 
&& top 
< bottom 
) 
 219         dest
->m_width 
= right 
- left
; 
 220         dest
->m_height 
= bottom 
- top
; 
 224         dest
->m_width 
= dest
->m_height 
= 0; 
 228 void wxRect2DInt::Union( const wxRect2DInt 
&src1 
, const wxRect2DInt 
&src2 
, wxRect2DInt 
*dest 
) 
 230     wxInt32 left
,right
,bottom
,top
; 
 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 
); 
 239     dest
->m_width 
= right 
- left
; 
 240     dest
->m_height 
= bottom 
- top
; 
 243 void wxRect2DInt::Union( const wxPoint2DInt 
&pt 
) 
 252     else if ( x 
< m_x 
+ m_width 
) 
 265     else if ( y 
< m_y 
+ m_height 
) 
 275 void wxRect2DInt::ConstrainTo( const wxRect2DInt 
&rect 
) 
 277     if ( GetLeft() < rect
.GetLeft() ) 
 278         SetLeft( rect
.GetLeft() ); 
 280     if ( GetRight() > rect
.GetRight() ) 
 281         SetRight( rect
.GetRight() ); 
 283     if ( GetBottom() > rect
.GetBottom() ) 
 284         SetBottom( rect
.GetBottom() ); 
 286     if ( GetTop() < rect
.GetTop() ) 
 287         SetTop( rect
.GetTop() ); 
 290 wxRect2DInt
& wxRect2DInt::operator=( const wxRect2DInt 
&r 
) 
 295     m_height 
= r
.m_height
; 
 299 void wxRect2DInt::WriteTo( wxDataOutputStream 
&stream 
) const 
 301     stream
.Write32( m_x 
); 
 302     stream
.Write32( m_y 
); 
 303     stream
.Write32( m_width 
); 
 304     stream
.Write32( m_height 
); 
 307 void wxRect2DInt::ReadFrom( wxDataInputStream 
&stream 
) 
 309     m_x 
= stream
.Read32(); 
 310     m_y 
= stream
.Read32(); 
 311     m_width 
= stream
.Read32(); 
 312     m_height 
= stream
.Read32(); 
 315 #endif // wxUSE_GEOMETRY