KiCad PCB EDA Suite
EDA_RECT Class Reference

Class EDA_RECT handles the component boundary box. More...

#include <eda_rect.h>

Public Member Functions

 EDA_RECT ()
 
 EDA_RECT (const wxPoint &aPos, const wxSize &aSize)
 
virtual ~EDA_RECT ()
 
wxPoint Centre () const
 
void Move (const wxPoint &aMoveVector)
 Function Move moves the rectangle by the aMoveVector. More...
 
void Normalize ()
 Function Normalize ensures that the height ant width are positive. More...
 
bool Contains (const wxPoint &aPoint) const
 Function Contains. More...
 
bool Contains (int x, int y) const
 Function Contains. More...
 
bool Contains (const EDA_RECT &aRect) const
 Function Contains. More...
 
const wxSize GetSize () const
 
int GetSizeMax () const
 GetSizeMax. More...
 
int GetX () const
 
int GetY () const
 
const wxPoint GetOrigin () const
 
const wxPoint GetPosition () const
 
const wxPoint GetEnd () const
 
const wxPoint GetCenter () const
 
int GetWidth () const
 
int GetHeight () const
 
int GetRight () const
 
int GetLeft () const
 
int GetTop () const
 
int GetBottom () const
 
bool IsValid () const
 
void SetOrigin (const wxPoint &pos)
 
void SetOrigin (int x, int y)
 
void SetSize (const wxSize &size)
 
void SetSize (int w, int h)
 
void Offset (int dx, int dy)
 
void Offset (const wxPoint &offset)
 
void SetX (int val)
 
void SetY (int val)
 
void SetWidth (int val)
 
void SetHeight (int val)
 
void SetEnd (int x, int y)
 
void SetEnd (const wxPoint &pos)
 
void RevertYAxis ()
 Function RevertYAxis Mirror the rectangle from the X axis (negate Y pos and size) More...
 
bool Intersects (const EDA_RECT &aRect) const
 Function Intersects tests for a common area between rectangles. More...
 
bool Intersects (const EDA_RECT &aRect, double aRot) const
 Tests for a common area between this rectangle, and a rectangle with arbitrary rotation. More...
 
bool Intersects (const wxPoint &aPoint1, const wxPoint &aPoint2) const
 Function Intersects tests for a common area between a segment and this rectangle. More...
 
const wxPoint ClosestPointTo (const wxPoint &aPoint) const
 Return the point in this rect that is closest to the provided point. More...
 
const wxPoint FarthestPointTo (const wxPoint &aPoint) const
 Return the point in this rect that is farthest from the provided point. More...
 
bool IntersectsCircle (const wxPoint &aCenter, const int aRadius) const
 Function IntersectsCircle tests for a common area between a circle and this rectangle. More...
 
bool IntersectsCircleEdge (const wxPoint &aCenter, const int aRadius, const int aWidth) const
 IntersectsCircleEdge Tests for intersection between this rect and the edge (radius) of a circle. More...
 
 operator wxRect () const
 Function operator(wxRect) overloads the cast operator to return a wxRect wxRect does not accept negative values for size, so ensure the wxRect size is always >= 0. More...
 
 operator BOX2I () const
 Function operator(BOX2I) overloads the cast operator to return a BOX2I. More...
 
EDA_RECTInflate (wxCoord dx, wxCoord dy)
 Function Inflate inflates the rectangle horizontally by dx and vertically by dy. More...
 
EDA_RECTInflate (int aDelta)
 Function Inflate inflates the rectangle horizontally and vertically by aDelta. More...
 
void Merge (const EDA_RECT &aRect)
 Function Merge modifies the position and size of the rectangle in order to contain aRect. More...
 
void Merge (const wxPoint &aPoint)
 Function Merge modifies the position and size of the rectangle in order to contain the given point. More...
 
double GetArea () const
 Function GetArea returns the area of the rectangle. More...
 
EDA_RECT Common (const EDA_RECT &aRect) const
 Function Common returns the area that is common with another rectangle. More...
 
const EDA_RECT GetBoundingBoxRotated (wxPoint aRotCenter, double aAngle)
 Function GetBoundingBoxRotated. More...
 

Private Attributes

wxPoint m_Pos
 
wxSize m_Size
 
bool m_init
 

Detailed Description

Class EDA_RECT handles the component boundary box.

This class is similar to wxRect, but some wxRect functions are very curious, and are working only if dimensions are >= 0 (not always the case in KiCad) and also KiCad needs some specific method. so I prefer this more suitable class

Definition at line 44 of file eda_rect.h.

Constructor & Destructor Documentation

◆ EDA_RECT() [1/2]

EDA_RECT::EDA_RECT ( )
inline

Definition at line 52 of file eda_rect.h.

52 : m_init( false ) { };
bool m_init
Definition: eda_rect.h:49

◆ EDA_RECT() [2/2]

EDA_RECT::EDA_RECT ( const wxPoint &  aPos,
const wxSize &  aSize 
)
inline

Definition at line 54 of file eda_rect.h.

54  :
55  m_Pos( aPos ),
56  m_Size( aSize ),
57  m_init( true )
58  { }
wxSize m_Size
Definition: eda_rect.h:48
bool m_init
Definition: eda_rect.h:49
wxPoint m_Pos
Definition: eda_rect.h:47

◆ ~EDA_RECT()

virtual EDA_RECT::~EDA_RECT ( )
inlinevirtual

Definition at line 60 of file eda_rect.h.

60 { };

Member Function Documentation

◆ Centre()

◆ ClosestPointTo()

const wxPoint EDA_RECT::ClosestPointTo ( const wxPoint &  aPoint) const

Return the point in this rect that is closest to the provided point.

Definition at line 500 of file base_struct.cpp.

501 {
502  EDA_RECT me( *this );
503 
504  me.Normalize(); // ensure size is >= 0
505 
506  // Determine closest point to the circle centre within this rect
507  int nx = std::max( me.GetLeft(), std::min( aPoint.x, me.GetRight() ) );
508  int ny = std::max( me.GetTop(), std::min( aPoint.y, me.GetBottom() ) );
509 
510  return wxPoint( nx, ny );
511 }
#define max(a, b)
Definition: auxiliary.h:86
Class EDA_RECT handles the component boundary box.
Definition: eda_rect.h:44
#define min(a, b)
Definition: auxiliary.h:85

References GetBottom(), GetLeft(), GetRight(), GetTop(), max, min, and Normalize().

Referenced by IntersectsCircle().

◆ Common()

EDA_RECT EDA_RECT::Common ( const EDA_RECT aRect) const

Function Common returns the area that is common with another rectangle.

Parameters
aRectis the rectangle to find the common area with.
Returns
The common area rect or 0-sized rectangle if there is no intersection.

Definition at line 698 of file base_struct.cpp.

699 {
700  EDA_RECT r;
701 
702  if( Intersects( aRect ) )
703  {
704  wxPoint originA( std::min( GetOrigin().x, GetEnd().x ),
705  std::min( GetOrigin().y, GetEnd().y ) );
706  wxPoint originB( std::min( aRect.GetOrigin().x, aRect.GetEnd().x ),
707  std::min( aRect.GetOrigin().y, aRect.GetEnd().y ) );
708  wxPoint endA( std::max( GetOrigin().x, GetEnd().x ),
709  std::max( GetOrigin().y, GetEnd().y ) );
710  wxPoint endB( std::max( aRect.GetOrigin().x, aRect.GetEnd().x ),
711  std::max( aRect.GetOrigin().y, aRect.GetEnd().y ) );
712 
713  r.SetOrigin( wxPoint( std::max( originA.x, originB.x ), std::max( originA.y, originB.y ) ) );
714  r.SetEnd ( wxPoint( std::min( endA.x, endB.x ), std::min( endA.y, endB.y ) ) );
715  }
716 
717  return r;
718 }
void SetOrigin(const wxPoint &pos)
Definition: eda_rect.h:131
const wxPoint GetEnd() const
Definition: eda_rect.h:116
const wxPoint GetOrigin() const
Definition: eda_rect.h:114
void SetEnd(int x, int y)
Definition: eda_rect.h:192
#define max(a, b)
Definition: auxiliary.h:86
Class EDA_RECT handles the component boundary box.
Definition: eda_rect.h:44
bool Intersects(const EDA_RECT &aRect) const
Function Intersects tests for a common area between rectangles.
#define min(a, b)
Definition: auxiliary.h:85

References GetEnd(), GetOrigin(), Intersects(), max, min, SetEnd(), and SetOrigin().

Referenced by calcCommonArea(), LIB_ARC::HitTest(), and DRAWSEGMENT::HitTest().

◆ Contains() [1/3]

bool EDA_RECT::Contains ( const wxPoint &  aPoint) const

Function Contains.

Parameters
aPoint= the wxPoint to test
Returns
true if aPoint is inside the boundary box. A point on a edge is seen as inside

Definition at line 308 of file base_struct.cpp.

309 {
310  wxPoint rel_pos = aPoint - m_Pos;
311  wxSize size = m_Size;
312 
313  if( size.x < 0 )
314  {
315  size.x = -size.x;
316  rel_pos.x += size.x;
317  }
318 
319  if( size.y < 0 )
320  {
321  size.y = -size.y;
322  rel_pos.y += size.y;
323  }
324 
325  return (rel_pos.x >= 0) && (rel_pos.y >= 0) && ( rel_pos.y <= size.y) && ( rel_pos.x <= size.x);
326 }
wxSize m_Size
Definition: eda_rect.h:48
wxPoint m_Pos
Definition: eda_rect.h:47

References m_Pos, and m_Size.

Referenced by AR_AUTOPLACER::AutoplaceModules(), Contains(), GRPutPixel(), LIB_CIRCLE::HitTest(), LIB_ARC::HitTest(), LIB_BEZIER::HitTest(), LIB_POLYLINE::HitTest(), SCH_PIN::HitTest(), PCB_TARGET::HitTest(), WS_DRAW_ITEM_BASE::HitTest(), SCH_JUNCTION::HitTest(), SCH_NO_CONNECT::HitTest(), SCH_BUS_ENTRY_BASE::HitTest(), LIB_PIN::HitTest(), SCH_BITMAP::HitTest(), WS_DRAW_ITEM_POLYPOLYGONS::HitTest(), LIB_ITEM::HitTest(), TRACK::HitTest(), SCH_FIELD::HitTest(), SCH_SHEET_PIN::HitTest(), SCH_TEXT::HitTest(), SCH_LINE::HitTest(), DRAWSEGMENT::HitTest(), DIMENSION::HitTest(), GERBER_DRAW_ITEM::HitTest(), VIA::HitTest(), WS_DRAW_ITEM_BITMAP::HitTest(), ZONE_CONTAINER::HitTest(), MODULE::HitTest(), SCH_SHEET::HitTest(), SCH_COMPONENT::HitTest(), D_PAD::HitTest(), MARKER_BASE::HitTestMarker(), LIB_RECTANGLE::Inside(), LIB_BEZIER::Inside(), LIB_ARC::Inside(), LIB_POLYLINE::Inside(), LIB_PIN::Inside(), Intersects(), EE_SELECTION_TOOL::Main(), SELECTION_TOOL::Main(), AR_AUTOPLACER::nearestPad(), TEXTE_MODULE::TextHitTest(), and EDA_TEXT::TextHitTest().

◆ Contains() [2/3]

bool EDA_RECT::Contains ( int  x,
int  y 
) const
inline

Function Contains.

Parameters
x= the x coordinate of the point to test
y= the x coordinate of the point to test
Returns
true if point is inside the boundary box. A point on a edge is seen as inside

Definition at line 94 of file eda_rect.h.

94 { return Contains( wxPoint( x, y ) ); }
bool Contains(const wxPoint &aPoint) const
Function Contains.

References Contains().

Referenced by Contains().

◆ Contains() [3/3]

bool EDA_RECT::Contains ( const EDA_RECT aRect) const

Function Contains.

Parameters
aRect= the EDA_RECT to test
Returns
true if aRect is Contained. A common edge is seen as contained

Definition at line 329 of file base_struct.cpp.

330 {
331  return Contains( aRect.GetOrigin() ) && Contains( aRect.GetEnd() );
332 }
bool Contains(const wxPoint &aPoint) const
Function Contains.
const wxPoint GetEnd() const
Definition: eda_rect.h:116
const wxPoint GetOrigin() const
Definition: eda_rect.h:114

References Contains(), GetEnd(), and GetOrigin().

◆ FarthestPointTo()

const wxPoint EDA_RECT::FarthestPointTo ( const wxPoint &  aPoint) const

Return the point in this rect that is farthest from the provided point.

Definition at line 514 of file base_struct.cpp.

515 {
516  EDA_RECT me( *this );
517 
518  me.Normalize(); // ensure size is >= 0
519 
520  int fx = std::max( std::abs( aPoint.x - me.GetLeft() ), std::abs( aPoint.x - me.GetRight() ) );
521  int fy = std::max( std::abs( aPoint.y - me.GetTop() ), std::abs( aPoint.y - me.GetBottom() ) );
522 
523  return wxPoint( fx, fy );
524 }
#define abs(a)
Definition: auxiliary.h:84
#define max(a, b)
Definition: auxiliary.h:86
Class EDA_RECT handles the component boundary box.
Definition: eda_rect.h:44

References abs, GetBottom(), GetLeft(), GetRight(), GetTop(), max, and Normalize().

Referenced by IntersectsCircleEdge().

◆ GetArea()

double EDA_RECT::GetArea ( ) const

Function GetArea returns the area of the rectangle.

Returns
The area of the rectangle.

Definition at line 692 of file base_struct.cpp.

693 {
694  return (double) GetWidth() * (double) GetHeight();
695 }
int GetWidth() const
Definition: eda_rect.h:119
int GetHeight() const
Definition: eda_rect.h:120

References GetHeight(), and GetWidth().

Referenced by calcArea(), calcCommonArea(), MODULE::CoverageRatio(), and SCH_COMPONENT::operator<().

◆ GetBottom()

◆ GetBoundingBoxRotated()

const EDA_RECT EDA_RECT::GetBoundingBoxRotated ( wxPoint  aRotCenter,
double  aAngle 
)

Function GetBoundingBoxRotated.

Returns
the bounding box of this, after rotation
Parameters
aAngle= the rotation angle in 0.1 deg.
aRotCenter= the rotation point. useful to calculate bounding box of rotated items, when rotation if not k*90 degrees

Definition at line 721 of file base_struct.cpp.

722 {
723  wxPoint corners[4];
724 
725  // Build the corners list
726  corners[0] = GetOrigin();
727  corners[2] = GetEnd();
728  corners[1].x = corners[0].x;
729  corners[1].y = corners[2].y;
730  corners[3].x = corners[2].x;
731  corners[3].y = corners[0].y;
732 
733  // Rotate all corners, to find the bounding box
734  for( int ii = 0; ii < 4; ii ++ )
735  RotatePoint( &corners[ii], aRotCenter, aAngle );
736 
737  // Find the corners bounding box
738  wxPoint start = corners[0];
739  wxPoint end = corners[0];
740 
741  for( int ii = 1; ii < 4; ii ++ )
742  {
743  start.x = std::min( start.x, corners[ii].x);
744  start.y = std::min( start.y, corners[ii].y);
745  end.x = std::max( end.x, corners[ii].x);
746  end.y = std::max( end.y, corners[ii].y);
747  }
748 
749  EDA_RECT bbox;
750  bbox.SetOrigin( start );
751  bbox.SetEnd( end );
752 
753  return bbox;
754 }
void SetOrigin(const wxPoint &pos)
Definition: eda_rect.h:131
void RotatePoint(int *pX, int *pY, double angle)
Definition: trigo.cpp:206
const wxPoint GetEnd() const
Definition: eda_rect.h:116
const wxPoint GetOrigin() const
Definition: eda_rect.h:114
void SetEnd(int x, int y)
Definition: eda_rect.h:192
#define max(a, b)
Definition: auxiliary.h:86
Class EDA_RECT handles the component boundary box.
Definition: eda_rect.h:44
#define min(a, b)
Definition: auxiliary.h:85

References GetEnd(), GetOrigin(), max, min, RotatePoint(), SetEnd(), and SetOrigin().

Referenced by TEXTE_PCB::GetBoundingBox(), TEXTE_MODULE::GetBoundingBox(), D_PAD::GetBoundingBox(), and TEXTE_MODULE::ViewBBox().

◆ GetCenter()

const wxPoint EDA_RECT::GetCenter ( ) const
inline

Definition at line 117 of file eda_rect.h.

117 { return wxPoint( m_Pos.x + ( m_Size.x / 2 ), m_Pos.y + ( m_Size.y / 2 ) ); }
wxSize m_Size
Definition: eda_rect.h:48
wxPoint m_Pos
Definition: eda_rect.h:47

References m_Pos, and m_Size.

Referenced by SCH_EDITOR_CONTROL::FindNext(), SCH_SHEET::GetRotationCenter(), SCH_EDIT_TOOL::Mirror(), DIALOG_EXPORT_STEP::onExportButton(), and SCH_EDIT_TOOL::Rotate().

◆ GetEnd()

◆ GetHeight()

◆ GetLeft()

◆ GetOrigin()

◆ GetPosition()

◆ GetRight()

◆ GetSize()

◆ GetSizeMax()

int EDA_RECT::GetSizeMax ( ) const
inline

GetSizeMax.

Returns
the max size dimension

Definition at line 109 of file eda_rect.h.

109 { return ( m_Size.x > m_Size.y )?m_Size.x:m_Size.y; }
wxSize m_Size
Definition: eda_rect.h:48

References m_Size.

Referenced by CINFO3D_VISU::AddShapeWithClearanceToContainer().

◆ GetTop()

◆ GetWidth()

◆ GetX()

◆ GetY()

◆ Inflate() [1/2]

EDA_RECT & EDA_RECT::Inflate ( wxCoord  dx,
wxCoord  dy 
)

Function Inflate inflates the rectangle horizontally by dx and vertically by dy.

If dx and/or dy is negative the rectangle is deflated.

Definition at line 575 of file base_struct.cpp.

576 {
577  if( m_Size.x >= 0 )
578  {
579  if( m_Size.x < -2 * dx )
580  {
581  // Don't allow deflate to eat more width than we have,
582  m_Pos.x += m_Size.x / 2;
583  m_Size.x = 0;
584  }
585  else
586  {
587  // The inflate is valid.
588  m_Pos.x -= dx;
589  m_Size.x += 2 * dx;
590  }
591  }
592  else // size.x < 0:
593  {
594  if( m_Size.x > -2 * dx )
595  {
596  // Don't allow deflate to eat more width than we have,
597  m_Pos.x -= m_Size.x / 2;
598  m_Size.x = 0;
599  }
600  else
601  {
602  // The inflate is valid.
603  m_Pos.x += dx;
604  m_Size.x -= 2 * dx; // m_Size.x <0: inflate when dx > 0
605  }
606  }
607 
608  if( m_Size.y >= 0 )
609  {
610  if( m_Size.y < -2 * dy )
611  {
612  // Don't allow deflate to eat more height than we have,
613  m_Pos.y += m_Size.y / 2;
614  m_Size.y = 0;
615  }
616  else
617  {
618  // The inflate is valid.
619  m_Pos.y -= dy;
620  m_Size.y += 2 * dy;
621  }
622  }
623  else // size.y < 0:
624  {
625  if( m_Size.y > 2 * dy )
626  {
627  // Don't allow deflate to eat more height than we have,
628  m_Pos.y -= m_Size.y / 2;
629  m_Size.y = 0;
630  }
631  else
632  {
633  // The inflate is valid.
634  m_Pos.y += dy;
635  m_Size.y -= 2 * dy; // m_Size.y <0: inflate when dy > 0
636  }
637  }
638 
639  return *this;
640 }
wxSize m_Size
Definition: eda_rect.h:48
wxPoint m_Pos
Definition: eda_rect.h:47

References m_Pos, and m_Size.

Referenced by AR_AUTOPLACER::addPad(), BuildBoardPolygonOutlines(), ZONE_FILLER::buildCopperItemClearances(), AR_AUTOPLACER::buildFpAreas(), FillNegativeKnockout(), AR_AUTOPLACER::genModuleOnRoutingMatrix(), APERTURE_MACRO::GetApertureMacroShape(), LIB_CIRCLE::GetBoundingBox(), LIB_RECTANGLE::GetBoundingBox(), SCH_JUNCTION::GetBoundingBox(), SCH_NO_CONNECT::GetBoundingBox(), LIB_ARC::GetBoundingBox(), LIB_BEZIER::GetBoundingBox(), LIB_POLYLINE::GetBoundingBox(), SCH_BUS_ENTRY_BASE::GetBoundingBox(), LIB_PIN::GetBoundingBox(), BITMAP_BASE::GetBoundingBox(), DRAWSEGMENT::GetBoundingBox(), GERBER_DRAW_ITEM::GetBoundingBox(), SCH_SHEET::GetBoundingBox(), D_PAD::GetBoundingBox(), MODULE::GetFootprintRect(), GRCSegm(), GRLineArray(), GRSFilledRect(), hasThermalConnection(), LIB_CIRCLE::HitTest(), LIB_ARC::HitTest(), LIB_BEZIER::HitTest(), LIB_POLYLINE::HitTest(), SCH_PIN::HitTest(), PCB_TARGET::HitTest(), WS_DRAW_ITEM_BASE::HitTest(), SCH_JUNCTION::HitTest(), SCH_NO_CONNECT::HitTest(), SCH_BUS_ENTRY_BASE::HitTest(), LIB_PIN::HitTest(), SCH_BITMAP::HitTest(), WS_DRAW_ITEM_POLYPOLYGONS::HitTest(), LIB_ITEM::HitTest(), TRACK::HitTest(), SCH_FIELD::HitTest(), SCH_SHEET_PIN::HitTest(), SCH_TEXT::HitTest(), SCH_LINE::HitTest(), DRAWSEGMENT::HitTest(), DIMENSION::HitTest(), VIA::HitTest(), WS_DRAW_ITEM_BITMAP::HitTest(), ZONE_CONTAINER::HitTest(), MODULE::HitTest(), SCH_SHEET::HitTest(), SCH_COMPONENT::HitTest(), D_PAD::HitTest(), MARKER_BASE::HitTestMarker(), Inflate(), CINFO3D_VISU::InitSettings(), Intersects(), SpreadFootprints(), AR_AUTOPLACER::testModuleOnBoard(), AR_AUTOPLACER::testRectangle(), TEXTE_MODULE::TextHitTest(), EDA_TEXT::TextHitTest(), EDA_TEXT::TransformBoundingBoxWithClearanceToPolygon(), MODULE::ViewBBox(), and WinClipAndDrawLine().

◆ Inflate() [2/2]

EDA_RECT & EDA_RECT::Inflate ( int  aDelta)

Function Inflate inflates the rectangle horizontally and vertically by aDelta.

If aDelta is negative the rectangle is deflated.

Definition at line 568 of file base_struct.cpp.

569 {
570  Inflate( aDelta, aDelta );
571  return *this;
572 }
EDA_RECT & Inflate(wxCoord dx, wxCoord dy)
Function Inflate inflates the rectangle horizontally by dx and vertically by dy.

References Inflate().

◆ Intersects() [1/3]

bool EDA_RECT::Intersects ( const EDA_RECT aRect) const

Function Intersects tests for a common area between rectangles.

Parameters
aRectA rectangle to test intersection with.
Returns
bool - true if the argument rectangle intersects this rectangle. (i.e. if the 2 rectangles have at least a common point)

Definition at line 361 of file base_struct.cpp.

362 {
363  if( !m_init )
364  return false;
365 
366  // this logic taken from wxWidgets' geometry.cpp file:
367  bool rc;
368  EDA_RECT me(*this);
369  EDA_RECT rect(aRect);
370  me.Normalize(); // ensure size is >= 0
371  rect.Normalize(); // ensure size is >= 0
372 
373  // calculate the left common area coordinate:
374  int left = std::max( me.m_Pos.x, rect.m_Pos.x );
375  // calculate the right common area coordinate:
376  int right = std::min( me.m_Pos.x + me.m_Size.x, rect.m_Pos.x + rect.m_Size.x );
377  // calculate the upper common area coordinate:
378  int top = std::max( me.m_Pos.y, aRect.m_Pos.y );
379  // calculate the lower common area coordinate:
380  int bottom = std::min( me.m_Pos.y + me.m_Size.y, rect.m_Pos.y + rect.m_Size.y );
381 
382  // if a common area exists, it must have a positive (null accepted) size
383  if( left <= right && top <= bottom )
384  rc = true;
385  else
386  rc = false;
387 
388  return rc;
389 }
#define max(a, b)
Definition: auxiliary.h:86
bool m_init
Definition: eda_rect.h:49
Class EDA_RECT handles the component boundary box.
Definition: eda_rect.h:44
wxPoint m_Pos
Definition: eda_rect.h:47
#define min(a, b)
Definition: auxiliary.h:85

References m_init, m_Pos, m_Size, max, min, and Normalize().

Referenced by ZONE_FILLER::buildCopperItemClearances(), Common(), AUTOPLACER::filtered_colliders(), hasThermalConnection(), LIB_CIRCLE::HitTest(), LIB_ARC::HitTest(), LIB_BEZIER::HitTest(), LIB_POLYLINE::HitTest(), PCB_TARGET::HitTest(), WS_DRAW_ITEM_BASE::HitTest(), SCH_JUNCTION::HitTest(), SCH_NO_CONNECT::HitTest(), SCH_BUS_ENTRY_BASE::HitTest(), SCH_BITMAP::HitTest(), WS_DRAW_ITEM_POLYPOLYGONS::HitTest(), LIB_ITEM::HitTest(), TRACK::HitTest(), SCH_FIELD::HitTest(), SCH_TEXT::HitTest(), SCH_LINE::HitTest(), DRAWSEGMENT::HitTest(), DIMENSION::HitTest(), ZONE_CONTAINER::HitTest(), MODULE::HitTest(), SCH_SHEET::HitTest(), SCH_COMPONENT::HitTest(), D_PAD::HitTest(), LIB_TEXT::Inside(), LIB_FIELD::Inside(), Intersects(), TEXTE_MODULE::TextHitTest(), and EDA_TEXT::TextHitTest().

◆ Intersects() [2/3]

bool EDA_RECT::Intersects ( const EDA_RECT aRect,
double  aRot 
) const

Tests for a common area between this rectangle, and a rectangle with arbitrary rotation.

Parameters
aRecta rectangle to test intersection with
aRotrectangle rotation (in 1/10 degrees)

Definition at line 392 of file base_struct.cpp.

393 {
394  if( !m_init )
395  return false;
396 
397  /* Most rectangles will be axis aligned.
398  * It is quicker to check for this case and pass the rect
399  * to the simpler intersection test
400  */
401 
402  // Prevent floating point comparison errors
403  static const double ROT_EPS = 0.000000001;
404 
405  static const double ROT_PARALLEL[] = { -3600, -1800, 0, 1800, 3600 };
406  static const double ROT_PERPENDICULAR[] = { -2700, -900, 0, 900, 2700 };
407 
408  NORMALIZE_ANGLE_POS<double>( aRot );
409 
410  // Test for non-rotated rectangle
411  for( int ii = 0; ii < 5; ii++ )
412  {
413  if( std::fabs( aRot - ROT_PARALLEL[ii] ) < ROT_EPS )
414  {
415  return Intersects( aRect );
416  }
417  }
418 
419  // Test for rectangle rotated by multiple of 90 degrees
420  for( int jj = 0; jj < 4; jj++ )
421  {
422  if( std::fabs( aRot - ROT_PERPENDICULAR[jj] ) < ROT_EPS )
423  {
424  EDA_RECT rotRect;
425 
426  // Rotate the supplied rect by 90 degrees
427  rotRect.SetOrigin( aRect.Centre() );
428  rotRect.Inflate( aRect.GetHeight(), aRect.GetWidth() );
429  return Intersects( rotRect );
430  }
431  }
432 
433  /* There is some non-orthogonal rotation.
434  * There are three cases to test:
435  * A) One point of this rect is inside the rotated rect
436  * B) One point of the rotated rect is inside this rect
437  * C) One of the sides of the rotated rect intersect this
438  */
439 
440  wxPoint corners[4];
441 
442  /* Test A : Any corners exist in rotated rect? */
443 
444  corners[0] = m_Pos;
445  corners[1] = m_Pos + wxPoint( m_Size.x, 0 );
446  corners[2] = m_Pos + wxPoint( m_Size.x, m_Size.y );
447  corners[3] = m_Pos + wxPoint( 0, m_Size.y );
448 
449  wxPoint rCentre = aRect.Centre();
450 
451  for( int i = 0; i < 4; i++ )
452  {
453  wxPoint delta = corners[i] - rCentre;
454  RotatePoint( &delta, -aRot );
455  delta += rCentre;
456 
457  if( aRect.Contains( delta ) )
458  {
459  return true;
460  }
461  }
462 
463  /* Test B : Any corners of rotated rect exist in this one? */
464  int w = aRect.GetWidth() / 2;
465  int h = aRect.GetHeight() / 2;
466 
467  // Construct corners around center of shape
468  corners[0] = wxPoint( -w, -h );
469  corners[1] = wxPoint( w, -h );
470  corners[2] = wxPoint( w, h );
471  corners[3] = wxPoint( -w, h );
472 
473  // Rotate and test each corner
474  for( int j=0; j<4; j++ )
475  {
476  RotatePoint( &corners[j], aRot );
477  corners[j] += rCentre;
478 
479  if( Contains( corners[j] ) )
480  {
481  return true;
482  }
483  }
484 
485  /* Test C : Any sides of rotated rect intersect this */
486 
487  if( Intersects( corners[0], corners[1] ) ||
488  Intersects( corners[1], corners[2] ) ||
489  Intersects( corners[2], corners[3] ) ||
490  Intersects( corners[3], corners[0] ) )
491  {
492  return true;
493  }
494 
495 
496  return false;
497 }
int GetWidth() const
Definition: eda_rect.h:119
void SetOrigin(const wxPoint &pos)
Definition: eda_rect.h:131
void RotatePoint(int *pX, int *pY, double angle)
Definition: trigo.cpp:206
bool Contains(const wxPoint &aPoint) const
Function Contains.
wxSize m_Size
Definition: eda_rect.h:48
int GetHeight() const
Definition: eda_rect.h:120
bool m_init
Definition: eda_rect.h:49
size_t i
Definition: json11.cpp:649
Class EDA_RECT handles the component boundary box.
Definition: eda_rect.h:44
wxPoint m_Pos
Definition: eda_rect.h:47
wxPoint Centre() const
Definition: eda_rect.h:62
bool Intersects(const EDA_RECT &aRect) const
Function Intersects tests for a common area between rectangles.
EDA_RECT & Inflate(wxCoord dx, wxCoord dy)
Function Inflate inflates the rectangle horizontally by dx and vertically by dy.

References Centre(), Contains(), GetHeight(), GetWidth(), i, Inflate(), Intersects(), m_init, m_Pos, m_Size, RotatePoint(), and SetOrigin().

◆ Intersects() [3/3]

bool EDA_RECT::Intersects ( const wxPoint &  aPoint1,
const wxPoint &  aPoint2 
) const

Function Intersects tests for a common area between a segment and this rectangle.

Parameters
aPoint1First point of the segment to test intersection with.
aPoint2Second point of the segment to test intersection with.
Returns
bool - true if the argument segment intersects this rectangle. (i.e. if the segment and rectangle have at least a common point)

Definition at line 335 of file base_struct.cpp.

336 {
337  wxPoint point2, point4;
338 
339  if( Contains( aPoint1 ) || Contains( aPoint2 ) )
340  return true;
341 
342  point2.x = GetEnd().x;
343  point2.y = GetOrigin().y;
344  point4.x = GetOrigin().x;
345  point4.y = GetEnd().y;
346 
347  //Only need to test 3 sides since a straight line cant enter and exit on same side
348  if( SegmentIntersectsSegment( aPoint1, aPoint2, GetOrigin() , point2 ) )
349  return true;
350 
351  if( SegmentIntersectsSegment( aPoint1, aPoint2, point2 , GetEnd() ) )
352  return true;
353 
354  if( SegmentIntersectsSegment( aPoint1, aPoint2, GetEnd() , point4 ) )
355  return true;
356 
357  return false;
358 }
bool Contains(const wxPoint &aPoint) const
Function Contains.
const wxPoint GetEnd() const
Definition: eda_rect.h:116
const wxPoint GetOrigin() const
Definition: eda_rect.h:114
bool SegmentIntersectsSegment(const wxPoint &a_p1_l1, const wxPoint &a_p2_l1, const wxPoint &a_p1_l2, const wxPoint &a_p2_l2, wxPoint *aIntersectionPoint)
Function SegmentIntersectsSegment.
Definition: trigo.cpp:59

References Contains(), GetEnd(), GetOrigin(), and SegmentIntersectsSegment().

◆ IntersectsCircle()

bool EDA_RECT::IntersectsCircle ( const wxPoint &  aCenter,
const int  aRadius 
) const

Function IntersectsCircle tests for a common area between a circle and this rectangle.

Parameters
aCentercenter of the circle
aRadiusradius of the circle

Definition at line 527 of file base_struct.cpp.

528 {
529  if( !m_init )
530  return false;
531 
532  wxPoint closest = ClosestPointTo( aCenter );
533 
534  double dx = aCenter.x - closest.x;
535  double dy = aCenter.y - closest.y;
536 
537  double r = (double) aRadius;
538 
539  return ( dx * dx + dy * dy ) <= ( r * r );
540 }
bool m_init
Definition: eda_rect.h:49
const wxPoint ClosestPointTo(const wxPoint &aPoint) const
Return the point in this rect that is closest to the provided point.

References ClosestPointTo(), and m_init.

Referenced by VIA::HitTest(), D_PAD::HitTest(), LIB_CIRCLE::Inside(), and IntersectsCircleEdge().

◆ IntersectsCircleEdge()

bool EDA_RECT::IntersectsCircleEdge ( const wxPoint &  aCenter,
const int  aRadius,
const int  aWidth 
) const

IntersectsCircleEdge Tests for intersection between this rect and the edge (radius) of a circle.

Parameters
aCentercenter of the circle
aRadiusradius of the circle
aWidthwidth of the circle edge

Definition at line 543 of file base_struct.cpp.

544 {
545  if( !m_init )
546  return false;
547 
548  EDA_RECT me( *this );
549  me.Normalize(); // ensure size is >= 0
550 
551  // Test if the circle intersects at all
552  if( !IntersectsCircle( aCenter, aRadius + aWidth / 2 ) )
553  {
554  return false;
555  }
556 
557  wxPoint farpt = FarthestPointTo( aCenter );
558  // Farthest point must be further than the inside of the line
559  double fx = (double) farpt.x;
560  double fy = (double) farpt.y;
561 
562  double r = (double) aRadius - (double) aWidth / 2;
563 
564  return ( fx * fx + fy * fy ) > ( r * r );
565 }
bool IntersectsCircle(const wxPoint &aCenter, const int aRadius) const
Function IntersectsCircle tests for a common area between a circle and this rectangle.
const wxPoint FarthestPointTo(const wxPoint &aPoint) const
Return the point in this rect that is farthest from the provided point.
bool m_init
Definition: eda_rect.h:49
Class EDA_RECT handles the component boundary box.
Definition: eda_rect.h:44

References FarthestPointTo(), IntersectsCircle(), m_init, and Normalize().

Referenced by LIB_CIRCLE::HitTest(), LIB_ARC::HitTest(), and DRAWSEGMENT::HitTest().

◆ IsValid()

bool EDA_RECT::IsValid ( ) const
inline

Definition at line 126 of file eda_rect.h.

127  {
128  return m_init;
129  }
bool m_init
Definition: eda_rect.h:49

References m_init.

Referenced by Merge().

◆ Merge() [1/2]

void EDA_RECT::Merge ( const EDA_RECT aRect)

Function Merge modifies the position and size of the rectangle in order to contain aRect.

It is mainly used to calculate bounding boxes.

Parameters
aRectThe rectangle to merge with this rectangle.

Definition at line 643 of file base_struct.cpp.

644 {
645  if( !m_init )
646  {
647  if( aRect.IsValid() )
648  {
649  m_Pos = aRect.GetPosition();
650  m_Size = aRect.GetSize();
651  m_init = true;
652  }
653  return;
654  }
655 
656  Normalize(); // ensure width and height >= 0
657  EDA_RECT rect = aRect;
658  rect.Normalize(); // ensure width and height >= 0
659  wxPoint end = GetEnd();
660  wxPoint rect_end = rect.GetEnd();
661 
662  // Change origin and size in order to contain the given rect
663  m_Pos.x = std::min( m_Pos.x, rect.m_Pos.x );
664  m_Pos.y = std::min( m_Pos.y, rect.m_Pos.y );
665  end.x = std::max( end.x, rect_end.x );
666  end.y = std::max( end.y, rect_end.y );
667  SetEnd( end );
668 }
const wxPoint GetEnd() const
Definition: eda_rect.h:116
wxSize m_Size
Definition: eda_rect.h:48
void SetEnd(int x, int y)
Definition: eda_rect.h:192
const wxPoint GetPosition() const
Definition: eda_rect.h:115
void Normalize()
Function Normalize ensures that the height ant width are positive.
#define max(a, b)
Definition: auxiliary.h:86
bool m_init
Definition: eda_rect.h:49
Class EDA_RECT handles the component boundary box.
Definition: eda_rect.h:44
wxPoint m_Pos
Definition: eda_rect.h:47
bool IsValid() const
Definition: eda_rect.h:126
const wxSize GetSize() const
Definition: eda_rect.h:103
#define min(a, b)
Definition: auxiliary.h:85

References GetEnd(), GetPosition(), GetSize(), IsValid(), m_init, m_Pos, m_Size, max, min, Normalize(), and SetEnd().

Referenced by DRAWSEGMENT::computeArcBBox(), GBR_LAYOUT::ComputeBoundingBox(), BOARD::ComputeBoundingBox(), LIB_PART::GetBodyBoundingBox(), SELECTION::GetBoundingBox(), MODULE::GetBoundingBox(), DRAWSEGMENT::GetBoundingBox(), SCH_COMPONENT::GetBoundingBox(), D_PAD::GetBoundingBox(), GERBVIEW_SELECTION::GetCenter(), MODULE::GetFootprintRect(), MODULE::GetFpPadsLocalBbox(), getSheetBbox(), LIB_PART::GetUnitBoundingBox(), GERBVIEW_SELECTION::ViewBBox(), and MODULE::ViewBBox().

◆ Merge() [2/2]

void EDA_RECT::Merge ( const wxPoint &  aPoint)

Function Merge modifies the position and size of the rectangle in order to contain the given point.

Parameters
aPointThe point to merge with the rectangle.

Definition at line 671 of file base_struct.cpp.

672 {
673  if( !m_init )
674  {
675  m_Pos = aPoint;
676  m_Size = wxSize( 0, 0 );
677  return;
678  }
679 
680  Normalize(); // ensure width and height >= 0
681 
682  wxPoint end = GetEnd();
683  // Change origin and size in order to contain the given rect
684  m_Pos.x = std::min( m_Pos.x, aPoint.x );
685  m_Pos.y = std::min( m_Pos.y, aPoint.y );
686  end.x = std::max( end.x, aPoint.x );
687  end.y = std::max( end.y, aPoint.y );
688  SetEnd( end );
689 }
const wxPoint GetEnd() const
Definition: eda_rect.h:116
wxSize m_Size
Definition: eda_rect.h:48
void SetEnd(int x, int y)
Definition: eda_rect.h:192
void Normalize()
Function Normalize ensures that the height ant width are positive.
#define max(a, b)
Definition: auxiliary.h:86
bool m_init
Definition: eda_rect.h:49
wxPoint m_Pos
Definition: eda_rect.h:47
#define min(a, b)
Definition: auxiliary.h:85

References GetEnd(), m_init, m_Pos, m_Size, max, min, Normalize(), and SetEnd().

◆ Move()

void EDA_RECT::Move ( const wxPoint &  aMoveVector)

Function Move moves the rectangle by the aMoveVector.

Parameters
aMoveVectorA wxPoint that is the value to move this rectangle

Definition at line 302 of file base_struct.cpp.

303 {
304  m_Pos += aMoveVector;
305 }
wxPoint m_Pos
Definition: eda_rect.h:47

References m_Pos.

Referenced by APERTURE_MACRO::GetApertureMacroShape(), SCH_BITMAP::GetBoundingBox(), SCH_FIELD::GetBoundingBox(), GERBER_DRAW_ITEM::GetBoundingBox(), AR_AUTOPLACER::getOptimalModulePlacement(), EDA_TEXT::GetTextBox(), and AR_AUTOPLACER::testModuleOnBoard().

◆ Normalize()

◆ Offset() [1/2]

void EDA_RECT::Offset ( int  dx,
int  dy 
)
inline

Definition at line 157 of file eda_rect.h.

158  {
159  m_Pos.x += dx;
160  m_Pos.y += dy;
161  }
wxPoint m_Pos
Definition: eda_rect.h:47

References m_Pos.

Referenced by SCH_COMPONENT::GetBodyBoundingBox(), and SCH_PIN::GetBoundingBox().

◆ Offset() [2/2]

void EDA_RECT::Offset ( const wxPoint &  offset)
inline

Definition at line 163 of file eda_rect.h.

164  {
165  m_Pos += offset;
166  }
wxPoint m_Pos
Definition: eda_rect.h:47

References m_Pos.

◆ operator BOX2I()

EDA_RECT::operator BOX2I ( ) const
inline

Function operator(BOX2I) overloads the cast operator to return a BOX2I.

Returns
BOX2I - this box shaped as a BOX2I object.

Definition at line 293 of file eda_rect.h.

294  {
295  EDA_RECT rect( m_Pos, m_Size );
296  rect.Normalize();
297  return BOX2I( rect.GetOrigin(), rect.GetSize() );
298  }
BOX2< VECTOR2I > BOX2I
Definition: box2.h:520
wxSize m_Size
Definition: eda_rect.h:48
Class EDA_RECT handles the component boundary box.
Definition: eda_rect.h:44
wxPoint m_Pos
Definition: eda_rect.h:47

References GetOrigin(), GetSize(), m_Pos, m_Size, and Normalize().

◆ operator wxRect()

EDA_RECT::operator wxRect ( ) const
inline

Function operator(wxRect) overloads the cast operator to return a wxRect wxRect does not accept negative values for size, so ensure the wxRect size is always >= 0.

Definition at line 281 of file eda_rect.h.

282  {
283  EDA_RECT rect( m_Pos, m_Size );
284  rect.Normalize();
285  return wxRect( rect.m_Pos, rect.m_Size );
286  }
wxSize m_Size
Definition: eda_rect.h:48
Class EDA_RECT handles the component boundary box.
Definition: eda_rect.h:44
wxPoint m_Pos
Definition: eda_rect.h:47

References m_Pos, m_Size, and Normalize().

◆ RevertYAxis()

void EDA_RECT::RevertYAxis ( )
inline

Function RevertYAxis Mirror the rectangle from the X axis (negate Y pos and size)

Definition at line 209 of file eda_rect.h.

210  {
211  m_Pos.y = -m_Pos.y;
212  m_Size.y = -m_Size.y;
213  Normalize();
214  }
wxSize m_Size
Definition: eda_rect.h:48
void Normalize()
Function Normalize ensures that the height ant width are positive.
wxPoint m_Pos
Definition: eda_rect.h:47

References m_Pos, m_Size, and Normalize().

Referenced by KIGFX::SCH_PAINTER::draw(), LIB_CIRCLE::GetBoundingBox(), LIB_RECTANGLE::GetBoundingBox(), LIB_TEXT::GetBoundingBox(), LIB_BEZIER::GetBoundingBox(), LIB_POLYLINE::GetBoundingBox(), SCH_PIN::GetBoundingBox(), LIB_PIN::GetBoundingBox(), LIB_FIELD::GetBoundingBox(), LIB_TEXT::Plot(), LIB_FIELD::Plot(), and LIB_TEXT::print().

◆ SetEnd() [1/2]

◆ SetEnd() [2/2]

void EDA_RECT::SetEnd ( const wxPoint &  pos)
inline

Definition at line 198 of file eda_rect.h.

199  {
200  m_Size.x = pos.x - m_Pos.x;
201  m_Size.y = pos.y - m_Pos.y;
202  m_init = true;
203  }
wxSize m_Size
Definition: eda_rect.h:48
bool m_init
Definition: eda_rect.h:49
wxPoint m_Pos
Definition: eda_rect.h:47

References m_init, m_Pos, and m_Size.

◆ SetHeight()

void EDA_RECT::SetHeight ( int  val)
inline

Definition at line 186 of file eda_rect.h.

187  {
188  m_Size.y = val;
189  m_init = true;
190  }
wxSize m_Size
Definition: eda_rect.h:48
bool m_init
Definition: eda_rect.h:49

References m_init, and m_Size.

Referenced by SCH_COMPONENT::GetBodyBoundingBox(), PCB_TARGET::GetBoundingBox(), WS_DRAW_ITEM_POLYPOLYGONS::GetBoundingBox(), DIMENSION::GetBoundingBox(), and SpreadFootprints().

◆ SetOrigin() [1/2]

◆ SetOrigin() [2/2]

void EDA_RECT::SetOrigin ( int  x,
int  y 
)
inline

Definition at line 137 of file eda_rect.h.

138  {
139  m_Pos.x = x;
140  m_Pos.y = y;
141  m_init = true;
142  }
bool m_init
Definition: eda_rect.h:49
wxPoint m_Pos
Definition: eda_rect.h:47

References m_init, and m_Pos.

◆ SetSize() [1/2]

void EDA_RECT::SetSize ( const wxSize &  size)
inline

Definition at line 144 of file eda_rect.h.

145  {
146  m_Size = size;
147  m_init = true;
148  }
wxSize m_Size
Definition: eda_rect.h:48
bool m_init
Definition: eda_rect.h:49

References m_init, and m_Size.

Referenced by WS_DRAW_ITEM_BITMAP::GetBoundingBox(), D_PAD::GetBoundingBox(), EDA_TEXT::GetTextBox(), D_PAD::HitTest(), and DIALOG_SHIM::ResetSize().

◆ SetSize() [2/2]

void EDA_RECT::SetSize ( int  w,
int  h 
)
inline

Definition at line 150 of file eda_rect.h.

151  {
152  m_Size.x = w;
153  m_Size.y = h;
154  m_init = true;
155  }
wxSize m_Size
Definition: eda_rect.h:48
bool m_init
Definition: eda_rect.h:49

References m_init, and m_Size.

◆ SetWidth()

void EDA_RECT::SetWidth ( int  val)
inline

Definition at line 180 of file eda_rect.h.

181  {
182  m_Size.x = val;
183  m_init = true;
184  }
wxSize m_Size
Definition: eda_rect.h:48
bool m_init
Definition: eda_rect.h:49

References m_init, and m_Size.

Referenced by SCH_COMPONENT::GetBodyBoundingBox(), PCB_TARGET::GetBoundingBox(), WS_DRAW_ITEM_POLYPOLYGONS::GetBoundingBox(), DIMENSION::GetBoundingBox(), and SpreadFootprints().

◆ SetX()

void EDA_RECT::SetX ( int  val)
inline

◆ SetY()

Member Data Documentation

◆ m_init

bool EDA_RECT::m_init
private

◆ m_Pos

◆ m_Size


The documentation for this class was generated from the following files: