Allow EDA_RECT to properly be uninitialized
The base initialization of EDA_RECT sets a 0/0/0/0 rectangle that
prevents merging properly with valid EDA_RECT. This sets the default to
be uninitialized until the internal data are set.
(cherry picked from commit 46feb76aba
)
This commit is contained in:
parent
5064df4ba2
commit
dc0aed5b16
|
@ -405,6 +405,9 @@ bool EDA_RECT::Intersects( const wxPoint& aPoint1, const wxPoint& aPoint2 ) cons
|
||||||
|
|
||||||
bool EDA_RECT::Intersects( const EDA_RECT& aRect ) const
|
bool EDA_RECT::Intersects( const EDA_RECT& aRect ) const
|
||||||
{
|
{
|
||||||
|
if( !m_init )
|
||||||
|
return false;
|
||||||
|
|
||||||
// this logic taken from wxWidgets' geometry.cpp file:
|
// this logic taken from wxWidgets' geometry.cpp file:
|
||||||
bool rc;
|
bool rc;
|
||||||
EDA_RECT me(*this);
|
EDA_RECT me(*this);
|
||||||
|
@ -433,6 +436,9 @@ bool EDA_RECT::Intersects( const EDA_RECT& aRect ) const
|
||||||
|
|
||||||
bool EDA_RECT::Intersects( const EDA_RECT& aRect, double aRot ) const
|
bool EDA_RECT::Intersects( const EDA_RECT& aRect, double aRot ) const
|
||||||
{
|
{
|
||||||
|
if( !m_init )
|
||||||
|
return false;
|
||||||
|
|
||||||
/* Most rectangles will be axis aligned.
|
/* Most rectangles will be axis aligned.
|
||||||
* It is quicker to check for this case and pass the rect
|
* It is quicker to check for this case and pass the rect
|
||||||
* to the simpler intersection test
|
* to the simpler intersection test
|
||||||
|
@ -565,6 +571,9 @@ const wxPoint EDA_RECT::FarthestPointTo( const wxPoint& aPoint ) const
|
||||||
|
|
||||||
bool EDA_RECT::IntersectsCircle( const wxPoint& aCenter, const int aRadius ) const
|
bool EDA_RECT::IntersectsCircle( const wxPoint& aCenter, const int aRadius ) const
|
||||||
{
|
{
|
||||||
|
if( !m_init )
|
||||||
|
return false;
|
||||||
|
|
||||||
wxPoint closest = ClosestPointTo( aCenter );
|
wxPoint closest = ClosestPointTo( aCenter );
|
||||||
|
|
||||||
double dx = aCenter.x - closest.x;
|
double dx = aCenter.x - closest.x;
|
||||||
|
@ -578,6 +587,9 @@ bool EDA_RECT::IntersectsCircle( const wxPoint& aCenter, const int aRadius ) con
|
||||||
|
|
||||||
bool EDA_RECT::IntersectsCircleEdge( const wxPoint& aCenter, const int aRadius, const int aWidth ) const
|
bool EDA_RECT::IntersectsCircleEdge( const wxPoint& aCenter, const int aRadius, const int aWidth ) const
|
||||||
{
|
{
|
||||||
|
if( !m_init )
|
||||||
|
return false;
|
||||||
|
|
||||||
EDA_RECT me( *this );
|
EDA_RECT me( *this );
|
||||||
me.Normalize(); // ensure size is >= 0
|
me.Normalize(); // ensure size is >= 0
|
||||||
|
|
||||||
|
@ -675,6 +687,17 @@ EDA_RECT& EDA_RECT::Inflate( wxCoord dx, wxCoord dy )
|
||||||
|
|
||||||
void EDA_RECT::Merge( const EDA_RECT& aRect )
|
void EDA_RECT::Merge( const EDA_RECT& aRect )
|
||||||
{
|
{
|
||||||
|
if( !m_init )
|
||||||
|
{
|
||||||
|
if( aRect.IsValid() )
|
||||||
|
{
|
||||||
|
m_Pos = aRect.GetPosition();
|
||||||
|
m_Size = aRect.GetSize();
|
||||||
|
m_init = true;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Normalize(); // ensure width and height >= 0
|
Normalize(); // ensure width and height >= 0
|
||||||
EDA_RECT rect = aRect;
|
EDA_RECT rect = aRect;
|
||||||
rect.Normalize(); // ensure width and height >= 0
|
rect.Normalize(); // ensure width and height >= 0
|
||||||
|
@ -692,6 +715,13 @@ void EDA_RECT::Merge( const EDA_RECT& aRect )
|
||||||
|
|
||||||
void EDA_RECT::Merge( const wxPoint& aPoint )
|
void EDA_RECT::Merge( const wxPoint& aPoint )
|
||||||
{
|
{
|
||||||
|
if( !m_init )
|
||||||
|
{
|
||||||
|
m_Pos = aPoint;
|
||||||
|
m_Size = wxSize( 0, 0 );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Normalize(); // ensure width and height >= 0
|
Normalize(); // ensure width and height >= 0
|
||||||
|
|
||||||
wxPoint end = GetEnd();
|
wxPoint end = GetEnd();
|
||||||
|
|
|
@ -46,13 +46,15 @@ class EDA_RECT
|
||||||
private:
|
private:
|
||||||
wxPoint m_Pos; // Rectangle Origin
|
wxPoint m_Pos; // Rectangle Origin
|
||||||
wxSize m_Size; // Rectangle Size
|
wxSize m_Size; // Rectangle Size
|
||||||
|
bool m_init; // Is the rectangle initialized
|
||||||
|
|
||||||
public:
|
public:
|
||||||
EDA_RECT() { };
|
EDA_RECT() : m_init( false ) { };
|
||||||
|
|
||||||
EDA_RECT( const wxPoint& aPos, const wxSize& aSize ) :
|
EDA_RECT( const wxPoint& aPos, const wxSize& aSize ) :
|
||||||
m_Pos( aPos ),
|
m_Pos( aPos ),
|
||||||
m_Size( aSize )
|
m_Size( aSize ),
|
||||||
|
m_init( true )
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
virtual ~EDA_RECT() { };
|
virtual ~EDA_RECT() { };
|
||||||
|
@ -121,20 +123,83 @@ public:
|
||||||
int GetTop() const { return m_Pos.y; }
|
int GetTop() const { return m_Pos.y; }
|
||||||
int GetBottom() const { return m_Pos.y + m_Size.y; } // Y axis from top to bottom
|
int GetBottom() const { return m_Pos.y + m_Size.y; } // Y axis from top to bottom
|
||||||
|
|
||||||
void SetOrigin( const wxPoint& pos ) { m_Pos = pos; }
|
bool IsValid() const
|
||||||
void SetOrigin( int x, int y ) { m_Pos.x = x; m_Pos.y = y; }
|
|
||||||
void SetSize( const wxSize& size ) { m_Size = size; }
|
|
||||||
void SetSize( int w, int h ) { m_Size.x = w; m_Size.y = h; }
|
|
||||||
void Offset( int dx, int dy ) { m_Pos.x += dx; m_Pos.y += dy; }
|
|
||||||
void Offset( const wxPoint& offset ) { m_Pos += offset; }
|
|
||||||
void SetX( int val ) { m_Pos.x = val; }
|
|
||||||
void SetY( int val ) { m_Pos.y = val; }
|
|
||||||
void SetWidth( int val ) { m_Size.x = val; }
|
|
||||||
void SetHeight( int val ) { m_Size.y = val; }
|
|
||||||
void SetEnd( int x, int y ) { SetEnd( wxPoint( x, y ) ); }
|
|
||||||
void SetEnd( const wxPoint& pos )
|
|
||||||
{
|
{
|
||||||
m_Size.x = pos.x - m_Pos.x; m_Size.y = pos.y - m_Pos.y;
|
return m_init;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetOrigin( const wxPoint &pos )
|
||||||
|
{
|
||||||
|
m_Pos = pos;
|
||||||
|
m_init = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetOrigin( int x, int y )
|
||||||
|
{
|
||||||
|
m_Pos.x = x;
|
||||||
|
m_Pos.y = y;
|
||||||
|
m_init = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetSize( const wxSize &size )
|
||||||
|
{
|
||||||
|
m_Size = size;
|
||||||
|
m_init = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetSize( int w, int h )
|
||||||
|
{
|
||||||
|
m_Size.x = w;
|
||||||
|
m_Size.y = h;
|
||||||
|
m_init = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Offset( int dx, int dy )
|
||||||
|
{
|
||||||
|
m_Pos.x += dx;
|
||||||
|
m_Pos.y += dy;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Offset( const wxPoint &offset )
|
||||||
|
{
|
||||||
|
m_Pos += offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetX( int val )
|
||||||
|
{
|
||||||
|
m_Pos.x = val;
|
||||||
|
m_init = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetY( int val )
|
||||||
|
{
|
||||||
|
m_Pos.y = val;
|
||||||
|
m_init = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetWidth( int val )
|
||||||
|
{
|
||||||
|
m_Size.x = val;
|
||||||
|
m_init = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetHeight( int val )
|
||||||
|
{
|
||||||
|
m_Size.y = val;
|
||||||
|
m_init = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetEnd( int x, int y )
|
||||||
|
{
|
||||||
|
SetEnd( wxPoint( x, y ) );
|
||||||
|
m_init = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetEnd( const wxPoint &pos )
|
||||||
|
{
|
||||||
|
m_Size.x = pos.x - m_Pos.x;
|
||||||
|
m_Size.y = pos.y - m_Pos.y;
|
||||||
|
m_init = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue