X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/07cdd027648238ac3ec1e1ad62d960698f07ed56..1c5d27e2ab8373d0fb2142ed96aed76f8b5773bc:/src/common/geometry.cpp diff --git a/src/common/geometry.cpp b/src/common/geometry.cpp index 985fbb36b1..51fe2842ee 100644 --- a/src/common/geometry.cpp +++ b/src/common/geometry.cpp @@ -1,19 +1,18 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: geometry.h +// Name: common/geometry.cpp // Purpose: Common Geometry Classes // Author: Stefan Csomor // Modified by: // Created: 08/05/99 -// RCS-ID: -// Copyright: (c) -// Licence: wxWindows licence +// RCS-ID: +// Copyright: (c) 1999 Stefan Csomor +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma interface "geometry.h" +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) + #pragma implementation "geometry.cpp" #endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -22,13 +21,19 @@ #pragma hdrstop #endif +#if wxUSE_GEOMETRY + #include "wx/log.h" #include - #include "wx/geometry.h" #include "wx/datstrm.h" +// normally this is defined in +#ifndef M_PI + #define M_PI 3.14159265358979323846 +#endif + // // wxPoint2D // @@ -41,271 +46,325 @@ // for the following calculations always remember // that the right and bottom edges are not part of a rect - + bool wxRect2DDouble::Intersects( const wxRect2DDouble &rect ) const { - wxDouble left,right,bottom,top ; - left = wxMax ( m_x , rect.m_x ) ; - right = wxMin ( m_x+m_width, rect.m_x + rect.m_width ) ; - top = wxMax ( m_y , rect.m_y ) ; - bottom = wxMin ( m_y+m_height, rect.m_y + rect.m_height ) ; - - if ( left < right && top < bottom ) - { - return TRUE ; - } - return FALSE ; + wxDouble left,right,bottom,top; + left = wxMax ( m_x , rect.m_x ); + right = wxMin ( m_x+m_width, rect.m_x + rect.m_width ); + top = wxMax ( m_y , rect.m_y ); + bottom = wxMin ( m_y+m_height, rect.m_y + rect.m_height ); + + if ( left < right && top < bottom ) + { + return TRUE; + } + return FALSE; } -void wxRect2DDouble::Intersect( const wxRect2DDouble &src1 , const wxRect2DDouble &src2 , wxRect2DDouble *dest ) +void wxRect2DDouble::Intersect( const wxRect2DDouble &src1 , const wxRect2DDouble &src2 , wxRect2DDouble *dest ) { - wxDouble left,right,bottom,top ; - left = wxMax ( src1.m_x , src2.m_x ) ; - right = wxMin ( src1.m_x+src1.m_width, src2.m_x + src2.m_width ) ; - top = wxMax ( src1.m_y , src2.m_y ) ; - bottom = wxMin ( src1.m_y+src1.m_height, src2.m_y + src2.m_height ) ; - - if ( left < right && top < bottom ) - { - dest->m_x = left ; - dest->m_y = top ; - dest->m_width = right - left ; - dest->m_height = bottom - top ; - } - else - { - dest->m_width = dest->m_height = 0 ; - } + wxDouble left,right,bottom,top; + left = wxMax ( src1.m_x , src2.m_x ); + right = wxMin ( src1.m_x+src1.m_width, src2.m_x + src2.m_width ); + top = wxMax ( src1.m_y , src2.m_y ); + bottom = wxMin ( src1.m_y+src1.m_height, src2.m_y + src2.m_height ); + + if ( left < right && top < bottom ) + { + dest->m_x = left; + dest->m_y = top; + dest->m_width = right - left; + dest->m_height = bottom - top; + } + else + { + dest->m_width = dest->m_height = 0; + } } -void wxRect2DDouble::Union( const wxRect2DDouble &src1 , const wxRect2DDouble &src2 , wxRect2DDouble *dest ) +void wxRect2DDouble::Union( const wxRect2DDouble &src1 , const wxRect2DDouble &src2 , wxRect2DDouble *dest ) { - wxDouble left,right,bottom,top ; - - left = wxMin ( src1.m_x , src2.m_x ) ; - right = wxMax ( src1.m_x+src1.m_width, src2.m_x + src2.m_width ) ; - top = wxMin ( src1.m_y , src2.m_y ) ; - bottom = wxMax ( src1.m_y+src1.m_height, src2.m_y + src2.m_height ) ; - - dest->m_x = left ; - dest->m_y = top ; - dest->m_width = right - left ; - dest->m_height = bottom - top ; + wxDouble left,right,bottom,top; + + left = wxMin ( src1.m_x , src2.m_x ); + right = wxMax ( src1.m_x+src1.m_width, src2.m_x + src2.m_width ); + top = wxMin ( src1.m_y , src2.m_y ); + bottom = wxMax ( src1.m_y+src1.m_height, src2.m_y + src2.m_height ); + + dest->m_x = left; + dest->m_y = top; + dest->m_width = right - left; + dest->m_height = bottom - top; } -void wxRect2DDouble::Union( const wxPoint2DDouble &pt ) +void wxRect2DDouble::Union( const wxPoint2DDouble &pt ) { - wxDouble x = pt.m_x ; - wxDouble y = pt.m_y ; - - if ( x < m_x ) - { - SetLeft( x ) ; - } - else if ( x < m_x + m_width ) - { - // contained - } - else - { - SetRight( x ) ; - } - - if ( y < m_y ) - { - SetTop( y ) ; - } - else if ( y < m_y + m_height ) - { - // contained - } - else - { - SetBottom( y ) ; - } + wxDouble x = pt.m_x; + wxDouble y = pt.m_y; + + if ( x < m_x ) + { + SetLeft( x ); + } + else if ( x < m_x + m_width ) + { + // contained + } + else + { + SetRight( x ); + } + + if ( y < m_y ) + { + SetTop( y ); + } + else if ( y < m_y + m_height ) + { + // contained + } + else + { + SetBottom( y ); + } } void wxRect2DDouble::ConstrainTo( const wxRect2DDouble &rect ) { - if ( GetLeft() < rect.GetLeft() ) - SetLeft( rect.GetLeft() ) ; - - if ( GetRight() > rect.GetRight() ) - SetRight( rect.GetRight() ) ; + if ( GetLeft() < rect.GetLeft() ) + SetLeft( rect.GetLeft() ); - if ( GetBottom() > rect.GetBottom() ) - SetBottom( rect.GetBottom() ) ; + if ( GetRight() > rect.GetRight() ) + SetRight( rect.GetRight() ); - if ( GetTop() < rect.GetTop() ) - SetTop( rect.GetTop() ) ; + if ( GetBottom() > rect.GetBottom() ) + SetBottom( rect.GetBottom() ); + + if ( GetTop() < rect.GetTop() ) + SetTop( rect.GetTop() ); +} + +wxRect2DDouble& wxRect2DDouble::operator=( const wxRect2DDouble &r ) +{ + m_x = r.m_x; + m_y = r.m_y; + m_width = r.m_width; + m_height = r.m_height; + return *this; } // integer version // for the following calculations always remember // that the right and bottom edges are not part of a rect - + // wxPoint2D +#if wxUSE_STREAMS void wxPoint2DInt::WriteTo( wxDataOutputStream &stream ) const -{ - stream.Write32( m_x ) ; - stream.Write32( m_y ) ; +{ + stream.Write32( m_x ); + stream.Write32( m_y ); +} + +void wxPoint2DInt::ReadFrom( wxDataInputStream &stream ) +{ + m_x = stream.Read32(); + m_y = stream.Read32(); +} +#endif // wxUSE_STREAMS + +wxDouble wxPoint2DInt::GetVectorAngle() const +{ + if ( m_x == 0 ) + { + if ( m_y >= 0 ) + return 90; + else + return 270; + } + if ( m_y == 0 ) + { + if ( m_x >= 0 ) + return 0; + else + return 180; + } + + // casts needed for MIPSpro compiler under SGI + wxDouble deg = atan2( (double)m_y , (double)m_x ) * 180 / M_PI; + if ( deg < 0 ) + { + deg += 360; + } + return deg; +} + + +void wxPoint2DInt::SetVectorAngle( wxDouble degrees ) +{ + wxDouble length = GetVectorLength(); + m_x = (int)(length * cos( degrees / 180 * M_PI )); + m_y = (int)(length * sin( degrees / 180 * M_PI )); } -void wxPoint2DInt::ReadFrom( wxDataInputStream &stream ) -{ - m_x = stream.Read32() ; - m_y = stream.Read32() ; +wxDouble wxPoint2DDouble::GetVectorAngle() const +{ + if ( m_x == 0 ) + { + if ( m_y >= 0 ) + return 90; + else + return 270; + } + if ( m_y == 0 ) + { + if ( m_x >= 0 ) + return 0; + else + return 180; + } + wxDouble deg = atan2( m_y , m_x ) * 180 / M_PI; + if ( deg < 0 ) + { + deg += 360; + } + return deg; } -wxDouble wxPoint2DInt::GetVectorAngle() +void wxPoint2DDouble::SetVectorAngle( wxDouble degrees ) { - if ( m_x == 0 ) - { - if ( m_y >= 0 ) - return 90 ; - else - return 270 ; - } - if ( m_y == 0 ) - { - if ( m_x >= 0 ) - return 0 ; - else - return 180 ; - } - wxDouble deg = atan2( m_y , m_x ) * 180 / 3.14159265359 ; - if ( deg < 0 ) - { - deg += 360 ; - } - return deg ; + wxDouble length = GetVectorLength(); + m_x = length * cos( degrees / 180 * M_PI ); + m_y = length * sin( degrees / 180 * M_PI ); } - // wxRect2D - + bool wxRect2DInt::Intersects( const wxRect2DInt &rect ) const { - wxInt32 left,right,bottom,top ; - left = wxMax ( m_x , rect.m_x ) ; - right = wxMin ( m_x+m_width, rect.m_x + rect.m_width ) ; - top = wxMax ( m_y , rect.m_y ) ; - bottom = wxMin ( m_y+m_height, rect.m_y + rect.m_height ) ; - - if ( left < right && top < bottom ) - { - return TRUE ; - } - return FALSE ; + wxInt32 left,right,bottom,top; + left = wxMax ( m_x , rect.m_x ); + right = wxMin ( m_x+m_width, rect.m_x + rect.m_width ); + top = wxMax ( m_y , rect.m_y ); + bottom = wxMin ( m_y+m_height, rect.m_y + rect.m_height ); + + if ( left < right && top < bottom ) + { + return TRUE; + } + return FALSE; } -void wxRect2DInt::Intersect( const wxRect2DInt &src1 , const wxRect2DInt &src2 , wxRect2DInt *dest ) +void wxRect2DInt::Intersect( const wxRect2DInt &src1 , const wxRect2DInt &src2 , wxRect2DInt *dest ) { - wxInt32 left,right,bottom,top ; - left = wxMax ( src1.m_x , src2.m_x ) ; - right = wxMin ( src1.m_x+src1.m_width, src2.m_x + src2.m_width ) ; - top = wxMax ( src1.m_y , src2.m_y ) ; - bottom = wxMin ( src1.m_y+src1.m_height, src2.m_y + src2.m_height ) ; - - if ( left < right && top < bottom ) - { - dest->m_x = left ; - dest->m_y = top ; - dest->m_width = right - left ; - dest->m_height = bottom - top ; - } - else - { - dest->m_width = dest->m_height = 0 ; - } + wxInt32 left,right,bottom,top; + left = wxMax ( src1.m_x , src2.m_x ); + right = wxMin ( src1.m_x+src1.m_width, src2.m_x + src2.m_width ); + top = wxMax ( src1.m_y , src2.m_y ); + bottom = wxMin ( src1.m_y+src1.m_height, src2.m_y + src2.m_height ); + + if ( left < right && top < bottom ) + { + dest->m_x = left; + dest->m_y = top; + dest->m_width = right - left; + dest->m_height = bottom - top; + } + else + { + dest->m_width = dest->m_height = 0; + } } -void wxRect2DInt::Union( const wxRect2DInt &src1 , const wxRect2DInt &src2 , wxRect2DInt *dest ) +void wxRect2DInt::Union( const wxRect2DInt &src1 , const wxRect2DInt &src2 , wxRect2DInt *dest ) { - wxInt32 left,right,bottom,top ; - - left = wxMin ( src1.m_x , src2.m_x ) ; - right = wxMax ( src1.m_x+src1.m_width, src2.m_x + src2.m_width ) ; - top = wxMin ( src1.m_y , src2.m_y ) ; - bottom = wxMax ( src1.m_y+src1.m_height, src2.m_y + src2.m_height ) ; - - dest->m_x = left ; - dest->m_y = top ; - dest->m_width = right - left ; - dest->m_height = bottom - top ; + wxInt32 left,right,bottom,top; + + left = wxMin ( src1.m_x , src2.m_x ); + right = wxMax ( src1.m_x+src1.m_width, src2.m_x + src2.m_width ); + top = wxMin ( src1.m_y , src2.m_y ); + bottom = wxMax ( src1.m_y+src1.m_height, src2.m_y + src2.m_height ); + + dest->m_x = left; + dest->m_y = top; + dest->m_width = right - left; + dest->m_height = bottom - top; } -void wxRect2DInt::Union( const wxPoint2DInt &pt ) +void wxRect2DInt::Union( const wxPoint2DInt &pt ) { - wxInt32 x = pt.m_x ; - wxInt32 y = pt.m_y ; - - if ( x < m_x ) - { - SetLeft( x ) ; - } - else if ( x < m_x + m_width ) - { - // contained - } - else - { - SetRight( x ) ; - } - - if ( y < m_y ) - { - SetTop( y ) ; - } - else if ( y < m_y + m_height ) - { - // contained - } - else - { - SetBottom( y ) ; - } + wxInt32 x = pt.m_x; + wxInt32 y = pt.m_y; + + if ( x < m_x ) + { + SetLeft( x ); + } + else if ( x < m_x + m_width ) + { + // contained + } + else + { + SetRight( x ); + } + + if ( y < m_y ) + { + SetTop( y ); + } + else if ( y < m_y + m_height ) + { + // contained + } + else + { + SetBottom( y ); + } } void wxRect2DInt::ConstrainTo( const wxRect2DInt &rect ) { - if ( GetLeft() < rect.GetLeft() ) - SetLeft( rect.GetLeft() ) ; - - if ( GetRight() > rect.GetRight() ) - SetRight( rect.GetRight() ) ; + if ( GetLeft() < rect.GetLeft() ) + SetLeft( rect.GetLeft() ); - if ( GetBottom() > rect.GetBottom() ) - SetBottom( rect.GetBottom() ) ; + if ( GetRight() > rect.GetRight() ) + SetRight( rect.GetRight() ); - if ( GetTop() < rect.GetTop() ) - SetTop( rect.GetTop() ) ; + if ( GetBottom() > rect.GetBottom() ) + SetBottom( rect.GetBottom() ); + + if ( GetTop() < rect.GetTop() ) + SetTop( rect.GetTop() ); } wxRect2DInt& wxRect2DInt::operator=( const wxRect2DInt &r ) -{ - m_x = r.m_x ; - m_y = r.m_y ; - m_width = r.m_width ; - m_height = r.m_height ; - return *this ; +{ + m_x = r.m_x; + m_y = r.m_y; + m_width = r.m_width; + m_height = r.m_height; + return *this; } +#if wxUSE_STREAMS void wxRect2DInt::WriteTo( wxDataOutputStream &stream ) const -{ - stream.Write32( m_x ) ; - stream.Write32( m_y ) ; - stream.Write32( m_width ) ; - stream.Write32( m_height ) ; +{ + stream.Write32( m_x ); + stream.Write32( m_y ); + stream.Write32( m_width ); + stream.Write32( m_height ); } -void wxRect2DInt::ReadFrom( wxDataInputStream &stream ) -{ - m_x = stream.Read32() ; - m_y = stream.Read32() ; - m_width = stream.Read32() ; - m_height = stream.Read32() ; +void wxRect2DInt::ReadFrom( wxDataInputStream &stream ) +{ + m_x = stream.Read32(); + m_y = stream.Read32(); + m_width = stream.Read32(); + m_height = stream.Read32(); } +#endif // wxUSE_STREAMS +#endif // wxUSE_GEOMETRY