KiCad PCB EDA Suite
EDA_RECT Class Reference

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...
 
bool Intersects (const wxPoint &aPoint1, const wxPoint &aPoint2, wxPoint *aIntersection1, wxPoint *aIntersection2) const
 Tests for intersection between a segment and this rectangle, returning the intersections. 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) const
 Function GetBoundingBoxRotated. More...
 

Private Attributes

wxPoint m_pos
 
wxSize m_size
 
bool m_init
 

Detailed Description

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  { }
wxPoint m_pos
Definition: eda_rect.h:47
wxSize m_size
Definition: eda_rect.h:48
bool m_init
Definition: eda_rect.h:49

◆ ~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 287 of file eda_rect.cpp.

288 {
289  EDA_RECT me( *this );
290 
291  me.Normalize(); // ensure size is >= 0
292 
293  // Determine closest point to the circle centre within this rect
294  int nx = std::max( me.GetLeft(), std::min( aPoint.x, me.GetRight() ) );
295  int ny = std::max( me.GetTop(), std::min( aPoint.y, me.GetBottom() ) );
296 
297  return wxPoint( nx, ny );
298 }
EDA_RECT handles the component boundary box.
Definition: eda_rect.h:44

References GetBottom(), GetLeft(), GetRight(), GetTop(), 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 487 of file eda_rect.cpp.

488 {
489  EDA_RECT r;
490 
491  if( Intersects( aRect ) )
492  {
493  wxPoint originA(
494  std::min( GetOrigin().x, GetEnd().x ), std::min( GetOrigin().y, GetEnd().y ) );
495  wxPoint originB( std::min( aRect.GetOrigin().x, aRect.GetEnd().x ),
496  std::min( aRect.GetOrigin().y, aRect.GetEnd().y ) );
497  wxPoint endA(
498  std::max( GetOrigin().x, GetEnd().x ), std::max( GetOrigin().y, GetEnd().y ) );
499  wxPoint endB( std::max( aRect.GetOrigin().x, aRect.GetEnd().x ),
500  std::max( aRect.GetOrigin().y, aRect.GetEnd().y ) );
501 
502  r.SetOrigin(
503  wxPoint( std::max( originA.x, originB.x ), std::max( originA.y, originB.y ) ) );
504  r.SetEnd( wxPoint( std::min( endA.x, endB.x ), std::min( endA.y, endB.y ) ) );
505  }
506 
507  return r;
508 }
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
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.
Definition: eda_rect.cpp:150

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

Referenced by calcCommonArea(), LIB_ARC::HitTest(), and PCB_SHAPE::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 57 of file eda_rect.cpp.

58 {
59  wxPoint rel_pos = aPoint - m_pos;
60  wxSize size = m_size;
61 
62  if( size.x < 0 )
63  {
64  size.x = -size.x;
65  rel_pos.x += size.x;
66  }
67 
68  if( size.y < 0 )
69  {
70  size.y = -size.y;
71  rel_pos.y += size.y;
72  }
73 
74  return ( rel_pos.x >= 0 ) && ( rel_pos.y >= 0 ) && ( rel_pos.y <= size.y )
75  && ( rel_pos.x <= size.x );
76 }
wxPoint m_pos
Definition: eda_rect.h:47
wxSize m_size
Definition: eda_rect.h:48

References m_pos, and m_size.

Referenced by AR_AUTOPLACER::AutoplaceFootprints(), Contains(), GRPutPixel(), LIB_CIRCLE::HitTest(), LIB_BEZIER::HitTest(), LIB_ARC::HitTest(), LIB_POLYLINE::HitTest(), PCB_TARGET::HitTest(), SCH_PIN::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_SHEET_PIN::HitTest(), LIB_PIN::HitTest(), DIMENSION_BASE::HitTest(), SCH_LINE::HitTest(), GERBER_DRAW_ITEM::HitTest(), PCB_SHAPE::HitTest(), SCH_TEXT::HitTest(), ARC::HitTest(), WS_DRAW_ITEM_BITMAP::HitTest(), FOOTPRINT::HitTest(), VIA::HitTest(), ZONE::HitTest(), PAD::HitTest(), SCH_SHEET::HitTest(), SCH_COMPONENT::HitTest(), MARKER_BASE::HitTestMarker(), Intersects(), EE_SELECTION_TOOL::Main(), AR_AUTOPLACER::nearestPad(), ALTIUM_PCB::ParsePolygons6Data(), SELECTION_TOOL::selectPoint(), FP_TEXT::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.
Definition: eda_rect.cpp:57

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 79 of file eda_rect.cpp.

80 {
81  return Contains( aRect.GetOrigin() ) && Contains( aRect.GetEnd() );
82 }
bool Contains(const wxPoint &aPoint) const
Function Contains.
Definition: eda_rect.cpp:57
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 301 of file eda_rect.cpp.

302 {
303  EDA_RECT me( *this );
304 
305  me.Normalize(); // ensure size is >= 0
306 
307  int fx = std::max( std::abs( aPoint.x - me.GetLeft() ), std::abs( aPoint.x - me.GetRight() ) );
308  int fy = std::max( std::abs( aPoint.y - me.GetTop() ), std::abs( aPoint.y - me.GetBottom() ) );
309 
310  return wxPoint( fx, fy );
311 }
EDA_RECT handles the component boundary box.
Definition: eda_rect.h:44

References GetBottom(), GetLeft(), GetRight(), GetTop(), 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 481 of file eda_rect.cpp.

482 {
483  return (double) GetWidth() * (double) GetHeight();
484 }
int GetWidth() const
Definition: eda_rect.h:119
int GetHeight() const
Definition: eda_rect.h:120

References GetHeight(), and GetWidth().

Referenced by calcArea(), calcCommonArea(), FOOTPRINT::CoverageRatio(), SELECTION_TOOL::GuessSelectionCandidates(), and SCH_COMPONENT::operator<().

◆ GetBottom()

◆ GetBoundingBoxRotated()

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

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 511 of file eda_rect.cpp.

512 {
513  wxPoint corners[4];
514 
515  // Build the corners list
516  corners[0] = GetOrigin();
517  corners[2] = GetEnd();
518  corners[1].x = corners[0].x;
519  corners[1].y = corners[2].y;
520  corners[3].x = corners[2].x;
521  corners[3].y = corners[0].y;
522 
523  // Rotate all corners, to find the bounding box
524  for( int ii = 0; ii < 4; ii++ )
525  RotatePoint( &corners[ii], aRotCenter, aAngle );
526 
527  // Find the corners bounding box
528  wxPoint start = corners[0];
529  wxPoint end = corners[0];
530 
531  for( int ii = 1; ii < 4; ii++ )
532  {
533  start.x = std::min( start.x, corners[ii].x );
534  start.y = std::min( start.y, corners[ii].y );
535  end.x = std::max( end.x, corners[ii].x );
536  end.y = std::max( end.y, corners[ii].y );
537  }
538 
539  EDA_RECT bbox;
540  bbox.SetOrigin( start );
541  bbox.SetEnd( end );
542 
543  return bbox;
544 }
void SetOrigin(const wxPoint &pos)
Definition: eda_rect.h:131
void RotatePoint(int *pX, int *pY, double angle)
Definition: trigo.cpp:208
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
EDA_RECT handles the component boundary box.
Definition: eda_rect.h:44

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

Referenced by PCB_TEXT::GetBoundingBox(), FP_TEXT::GetBoundingBox(), and FP_TEXT::ViewBBox().

◆ GetCenter()

const wxPoint EDA_RECT::GetCenter ( ) const
inline

◆ GetEnd()

◆ GetHeight()

◆ GetLeft()

◆ GetOrigin()

◆ GetPosition()

const wxPoint EDA_RECT::GetPosition ( ) const
inline

◆ 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 BOARD_ADAPTER::AddShapeWithClearanceToContainer(), and SCH_GLOBALLABEL::AutoplaceFields().

◆ GetTop()

◆ GetWidth()

int EDA_RECT::GetWidth ( ) const
inline

◆ 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 363 of file eda_rect.cpp.

364 {
365  if( m_size.x >= 0 )
366  {
367  if( m_size.x < -2 * dx )
368  {
369  // Don't allow deflate to eat more width than we have,
370  m_pos.x += m_size.x / 2;
371  m_size.x = 0;
372  }
373  else
374  {
375  // The inflate is valid.
376  m_pos.x -= dx;
377  m_size.x += 2 * dx;
378  }
379  }
380  else // size.x < 0:
381  {
382  if( m_size.x > -2 * dx )
383  {
384  // Don't allow deflate to eat more width than we have,
385  m_pos.x -= m_size.x / 2;
386  m_size.x = 0;
387  }
388  else
389  {
390  // The inflate is valid.
391  m_pos.x += dx;
392  m_size.x -= 2 * dx; // m_Size.x <0: inflate when dx > 0
393  }
394  }
395 
396  if( m_size.y >= 0 )
397  {
398  if( m_size.y < -2 * dy )
399  {
400  // Don't allow deflate to eat more height than we have,
401  m_pos.y += m_size.y / 2;
402  m_size.y = 0;
403  }
404  else
405  {
406  // The inflate is valid.
407  m_pos.y -= dy;
408  m_size.y += 2 * dy;
409  }
410  }
411  else // size.y < 0:
412  {
413  if( m_size.y > 2 * dy )
414  {
415  // Don't allow deflate to eat more height than we have,
416  m_pos.y -= m_size.y / 2;
417  m_size.y = 0;
418  }
419  else
420  {
421  // The inflate is valid.
422  m_pos.y += dy;
423  m_size.y -= 2 * dy; // m_Size.y <0: inflate when dy > 0
424  }
425  }
426 
427  return *this;
428 }
wxPoint m_pos
Definition: eda_rect.h:47
wxSize m_size
Definition: eda_rect.h:48

References m_pos, and m_size.

Referenced by AR_AUTOPLACER::addPad(), buildBoardBoundingBoxPoly(), BuildBoardPolygonOutlines(), ZONE_FILLER::buildCopperItemClearances(), AR_AUTOPLACER::buildFpAreas(), ZONE_FILLER::Fill(), FillNegativeKnockout(), SCH_EDITOR_CONTROL::FindComponentAndItem(), AR_AUTOPLACER::genModuleOnRoutingMatrix(), APERTURE_MACRO::GetApertureMacroShape(), SCH_SHEET::GetBodyBoundingBox(), LIB_CIRCLE::GetBoundingBox(), LIB_RECTANGLE::GetBoundingBox(), SCH_JUNCTION::GetBoundingBox(), LIB_BEZIER::GetBoundingBox(), LIB_ARC::GetBoundingBox(), SCH_NO_CONNECT::GetBoundingBox(), LIB_POLYLINE::GetBoundingBox(), SCH_BUS_ENTRY_BASE::GetBoundingBox(), PCB_GROUP::GetBoundingBox(), BITMAP_BASE::GetBoundingBox(), LIB_PIN::GetBoundingBox(), GERBER_DRAW_ITEM::GetBoundingBox(), PCB_SHAPE::GetBoundingBox(), SCH_LABEL::GetBoundingBox(), FOOTPRINT::GetFootprintRect(), SCH_SCREEN::GetItem(), GRCSegm(), GRLineArray(), GRSFilledRect(), EE_SELECTION_TOOL::GuessSelectionCandidates(), hasThermalConnection(), LIB_CIRCLE::HitTest(), LIB_BEZIER::HitTest(), LIB_ARC::HitTest(), LIB_POLYLINE::HitTest(), PCB_TARGET::HitTest(), SCH_PIN::HitTest(), WS_DRAW_ITEM_BASE::HitTest(), SCH_NO_CONNECT::HitTest(), SCH_JUNCTION::HitTest(), SCH_BUS_ENTRY_BASE::HitTest(), SCH_BITMAP::HitTest(), WS_DRAW_ITEM_POLYPOLYGONS::HitTest(), LIB_ITEM::HitTest(), TRACK::HitTest(), SCH_FIELD::HitTest(), SCH_SHEET_PIN::HitTest(), LIB_PIN::HitTest(), DIMENSION_BASE::HitTest(), SCH_LINE::HitTest(), PCB_SHAPE::HitTest(), SCH_TEXT::HitTest(), ARC::HitTest(), WS_DRAW_ITEM_BITMAP::HitTest(), FOOTPRINT::HitTest(), VIA::HitTest(), ZONE::HitTest(), PAD::HitTest(), SCH_SHEET::HitTest(), SCH_COMPONENT::HitTest(), MARKER_BASE::HitTestMarker(), Inflate(), BOARD_ADAPTER::InitSettings(), Intersects(), EE_RTREE::Overlapping(), DRC_RTREE::Overlapping(), DRC_RTREE::QueryColliding(), SpreadFootprints(), AR_AUTOPLACER::testFootprintOnBoard(), AR_AUTOPLACER::testRectangle(), FP_TEXT::TextHitTest(), EDA_TEXT::TextHitTest(), EDA_TEXT::TransformBoundingBoxWithClearanceToPolygon(), ALIGNED_DIMENSION::updateGeometry(), ORTHOGONAL_DIMENSION::updateGeometry(), LEADER::updateGeometry(), FOOTPRINT::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 356 of file eda_rect.cpp.

357 {
358  Inflate( aDelta, aDelta );
359  return *this;
360 }
EDA_RECT & Inflate(wxCoord dx, wxCoord dy)
Function Inflate inflates the rectangle horizontally by dx and vertically by dy.
Definition: eda_rect.cpp:363

References Inflate().

◆ Intersects() [1/4]

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 150 of file eda_rect.cpp.

151 {
152  if( !m_init )
153  return false;
154 
155  // this logic taken from wxWidgets' geometry.cpp file:
156  bool rc;
157  EDA_RECT me( *this );
158  EDA_RECT rect( aRect );
159  me.Normalize(); // ensure size is >= 0
160  rect.Normalize(); // ensure size is >= 0
161 
162  // calculate the left common area coordinate:
163  int left = std::max( me.m_pos.x, rect.m_pos.x );
164  // calculate the right common area coordinate:
165  int right = std::min( me.m_pos.x + me.m_size.x, rect.m_pos.x + rect.m_size.x );
166  // calculate the upper common area coordinate:
167  int top = std::max( me.m_pos.y, aRect.m_pos.y );
168  // calculate the lower common area coordinate:
169  int bottom = std::min( me.m_pos.y + me.m_size.y, rect.m_pos.y + rect.m_size.y );
170 
171  // if a common area exists, it must have a positive (null accepted) size
172  if( left <= right && top <= bottom )
173  rc = true;
174  else
175  rc = false;
176 
177  return rc;
178 }
wxPoint m_pos
Definition: eda_rect.h:47
bool m_init
Definition: eda_rect.h:49
EDA_RECT handles the component boundary box.
Definition: eda_rect.h:44

References m_init, m_pos, m_size, and Normalize().

Referenced by ZONE_FILLER::addHatchFillTypeOnZone(), BOOST_AUTO_TEST_CASE(), Common(), ZONE_FILLER::Fill(), AUTOPLACER::filtered_colliders(), hasThermalConnection(), LIB_CIRCLE::HitTest(), LIB_BEZIER::HitTest(), LIB_ARC::HitTest(), LIB_POLYLINE::HitTest(), PCB_TARGET::HitTest(), SCH_NO_CONNECT::HitTest(), WS_DRAW_ITEM_BASE::HitTest(), SCH_BUS_ENTRY_BASE::HitTest(), SCH_BITMAP::HitTest(), WS_DRAW_ITEM_POLYPOLYGONS::HitTest(), LIB_ITEM::HitTest(), TRACK::HitTest(), SCH_FIELD::HitTest(), LIB_PIN::HitTest(), DIMENSION_BASE::HitTest(), SCH_LINE::HitTest(), PCB_SHAPE::HitTest(), SCH_TEXT::HitTest(), ARC::HitTest(), FOOTPRINT::HitTest(), ZONE::HitTest(), PAD::HitTest(), SCH_SHEET::HitTest(), SCH_COMPONENT::HitTest(), Intersects(), DRC_TEST_PROVIDER_COPPER_CLEARANCE::testItemAgainstZones(), FP_TEXT::TextHitTest(), and EDA_TEXT::TextHitTest().

◆ Intersects() [2/4]

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 181 of file eda_rect.cpp.

182 {
183  if( !m_init )
184  return false;
185 
186  /* Most rectangles will be axis aligned.
187  * It is quicker to check for this case and pass the rect
188  * to the simpler intersection test
189  */
190 
191  // Prevent floating point comparison errors
192  static const double ROT_EPS = 0.000000001;
193 
194  static const double ROT_PARALLEL[] = { -3600, -1800, 0, 1800, 3600 };
195  static const double ROT_PERPENDICULAR[] = { -2700, -900, 0, 900, 2700 };
196 
197  NORMALIZE_ANGLE_POS<double>( aRot );
198 
199  // Test for non-rotated rectangle
200  for( int ii = 0; ii < 5; ii++ )
201  {
202  if( std::fabs( aRot - ROT_PARALLEL[ii] ) < ROT_EPS )
203  {
204  return Intersects( aRect );
205  }
206  }
207 
208  // Test for rectangle rotated by multiple of 90 degrees
209  for( int jj = 0; jj < 4; jj++ )
210  {
211  if( std::fabs( aRot - ROT_PERPENDICULAR[jj] ) < ROT_EPS )
212  {
213  EDA_RECT rotRect;
214 
215  // Rotate the supplied rect by 90 degrees
216  rotRect.SetOrigin( aRect.Centre() );
217  rotRect.Inflate( aRect.GetHeight(), aRect.GetWidth() );
218  return Intersects( rotRect );
219  }
220  }
221 
222  /* There is some non-orthogonal rotation.
223  * There are three cases to test:
224  * A) One point of this rect is inside the rotated rect
225  * B) One point of the rotated rect is inside this rect
226  * C) One of the sides of the rotated rect intersect this
227  */
228 
229  wxPoint corners[4];
230 
231  /* Test A : Any corners exist in rotated rect? */
232 
233  corners[0] = m_pos;
234  corners[1] = m_pos + wxPoint( m_size.x, 0 );
235  corners[2] = m_pos + wxPoint( m_size.x, m_size.y );
236  corners[3] = m_pos + wxPoint( 0, m_size.y );
237 
238  wxPoint rCentre = aRect.Centre();
239 
240  for( int i = 0; i < 4; i++ )
241  {
242  wxPoint delta = corners[i] - rCentre;
243  RotatePoint( &delta, -aRot );
244  delta += rCentre;
245 
246  if( aRect.Contains( delta ) )
247  {
248  return true;
249  }
250  }
251 
252  /* Test B : Any corners of rotated rect exist in this one? */
253  int w = aRect.GetWidth() / 2;
254  int h = aRect.GetHeight() / 2;
255 
256  // Construct corners around center of shape
257  corners[0] = wxPoint( -w, -h );
258  corners[1] = wxPoint( w, -h );
259  corners[2] = wxPoint( w, h );
260  corners[3] = wxPoint( -w, h );
261 
262  // Rotate and test each corner
263  for( int j = 0; j < 4; j++ )
264  {
265  RotatePoint( &corners[j], aRot );
266  corners[j] += rCentre;
267 
268  if( Contains( corners[j] ) )
269  {
270  return true;
271  }
272  }
273 
274  /* Test C : Any sides of rotated rect intersect this */
275 
276  if( Intersects( corners[0], corners[1] ) || Intersects( corners[1], corners[2] )
277  || Intersects( corners[2], corners[3] ) || Intersects( corners[3], corners[0] ) )
278  {
279  return true;
280  }
281 
282 
283  return false;
284 }
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:208
bool Contains(const wxPoint &aPoint) const
Function Contains.
Definition: eda_rect.cpp:57
int GetHeight() const
Definition: eda_rect.h:120
wxPoint m_pos
Definition: eda_rect.h:47
wxSize m_size
Definition: eda_rect.h:48
bool m_init
Definition: eda_rect.h:49
EDA_RECT handles the component boundary box.
Definition: eda_rect.h:44
wxPoint Centre() const
Definition: eda_rect.h:62
bool Intersects(const EDA_RECT &aRect) const
Function Intersects tests for a common area between rectangles.
Definition: eda_rect.cpp:150
EDA_RECT & Inflate(wxCoord dx, wxCoord dy)
Function Inflate inflates the rectangle horizontally by dx and vertically by dy.
Definition: eda_rect.cpp:363

References Centre(), Contains(), GetHeight(), GetWidth(), Inflate(), Intersects(), m_init, m_pos, m_size, RotatePoint(), and SetOrigin().

◆ Intersects() [3/4]

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 85 of file eda_rect.cpp.

86 {
87  wxPoint point2, point4;
88 
89  if( Contains( aPoint1 ) || Contains( aPoint2 ) )
90  return true;
91 
92  point2.x = GetEnd().x;
93  point2.y = GetOrigin().y;
94  point4.x = GetOrigin().x;
95  point4.y = GetEnd().y;
96 
97  //Only need to test 3 sides since a straight line cant enter and exit on same side
98  if( SegmentIntersectsSegment( aPoint1, aPoint2, GetOrigin(), point2 ) )
99  return true;
100 
101  if( SegmentIntersectsSegment( aPoint1, aPoint2, point2, GetEnd() ) )
102  return true;
103 
104  if( SegmentIntersectsSegment( aPoint1, aPoint2, GetEnd(), point4 ) )
105  return true;
106 
107  return false;
108 }
bool Contains(const wxPoint &aPoint) const
Function Contains.
Definition: eda_rect.cpp:57
bool SegmentIntersectsSegment(const wxPoint &a_p1_l1, const wxPoint &a_p2_l1, const wxPoint &a_p1_l2, const wxPoint &a_p2_l2, wxPoint *aIntersectionPoint=nullptr)
Test if two lines intersect.
Definition: trigo.cpp:61
const wxPoint GetEnd() const
Definition: eda_rect.h:116
const wxPoint GetOrigin() const
Definition: eda_rect.h:114

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

◆ Intersects() [4/4]

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

Tests for intersection between a segment and this rectangle, returning the intersections.

Parameters
aPoint1is the first point of the segment to test intersection with
aPoint2is the second point of the segment to test intersection with
aIntersection1will be filled with the first intersection point, if any
aIntersection2will be filled with the second intersection point, if any
Returns
true if the segment intersects the rect

Definition at line 111 of file eda_rect.cpp.

113 {
114  wxPoint point2, point4;
115 
116  point2.x = GetEnd().x;
117  point2.y = GetOrigin().y;
118  point4.x = GetOrigin().x;
119  point4.y = GetEnd().y;
120 
121  bool intersects = false;
122 
123  wxPoint* aPointToFill = aIntersection1;
124 
125  if( SegmentIntersectsSegment( aPoint1, aPoint2, GetOrigin(), point2, aPointToFill ) )
126  intersects = true;
127 
128  if( intersects )
129  aPointToFill = aIntersection2;
130 
131  if( SegmentIntersectsSegment( aPoint1, aPoint2, point2, GetEnd(), aPointToFill ) )
132  intersects = true;
133 
134  if( intersects )
135  aPointToFill = aIntersection2;
136 
137  if( SegmentIntersectsSegment( aPoint1, aPoint2, GetEnd(), point4, aPointToFill ) )
138  intersects = true;
139 
140  if( intersects )
141  aPointToFill = aIntersection2;
142 
143  if( SegmentIntersectsSegment( aPoint1, aPoint2, point4, GetOrigin(), aPointToFill ) )
144  intersects = true;
145 
146  return intersects;
147 }
bool SegmentIntersectsSegment(const wxPoint &a_p1_l1, const wxPoint &a_p2_l1, const wxPoint &a_p1_l2, const wxPoint &a_p2_l2, wxPoint *aIntersectionPoint=nullptr)
Test if two lines intersect.
Definition: trigo.cpp:61
const wxPoint GetEnd() const
Definition: eda_rect.h:116
const wxPoint GetOrigin() const
Definition: eda_rect.h:114

References 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 314 of file eda_rect.cpp.

315 {
316  if( !m_init )
317  return false;
318 
319  wxPoint closest = ClosestPointTo( aCenter );
320 
321  double dx = static_cast<double>( aCenter.x ) - closest.x;
322  double dy = static_cast<double>( aCenter.y ) - closest.y;
323 
324  double r = static_cast<double>( aRadius );
325 
326  return ( dx * dx + dy * dy ) <= ( r * r );
327 }
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.
Definition: eda_rect.cpp:287

References ClosestPointTo(), and m_init.

Referenced by VIA::HitTest(), 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 330 of file eda_rect.cpp.

332 {
333  if( !m_init )
334  return false;
335 
336  EDA_RECT me( *this );
337  me.Normalize(); // ensure size is >= 0
338 
339  // Test if the circle intersects at all
340  if( !IntersectsCircle( aCenter, aRadius + aWidth / 2 ) )
341  {
342  return false;
343  }
344 
345  wxPoint farpt = FarthestPointTo( aCenter );
346  // Farthest point must be further than the inside of the line
347  double fx = (double) farpt.x;
348  double fy = (double) farpt.y;
349 
350  double r = (double) aRadius - (double) aWidth / 2;
351 
352  return ( fx * fx + fy * fy ) > ( r * r );
353 }
bool IntersectsCircle(const wxPoint &aCenter, const int aRadius) const
Function IntersectsCircle tests for a common area between a circle and this rectangle.
Definition: eda_rect.cpp:314
const wxPoint FarthestPointTo(const wxPoint &aPoint) const
Return the point in this rect that is farthest from the provided point.
Definition: eda_rect.cpp:301
bool m_init
Definition: eda_rect.h:49
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 PCB_SHAPE::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 431 of file eda_rect.cpp.

432 {
433  if( !m_init )
434  {
435  if( aRect.IsValid() )
436  {
437  m_pos = aRect.GetPosition();
438  m_size = aRect.GetSize();
439  m_init = true;
440  }
441  return;
442  }
443 
444  Normalize(); // ensure width and height >= 0
445  EDA_RECT rect = aRect;
446  rect.Normalize(); // ensure width and height >= 0
447  wxPoint end = GetEnd();
448  wxPoint rect_end = rect.GetEnd();
449 
450  // Change origin and size in order to contain the given rect
451  m_pos.x = std::min( m_pos.x, rect.m_pos.x );
452  m_pos.y = std::min( m_pos.y, rect.m_pos.y );
453  end.x = std::max( end.x, rect_end.x );
454  end.y = std::max( end.y, rect_end.y );
455  SetEnd( end );
456 }
const wxPoint GetEnd() const
Definition: eda_rect.h:116
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.
Definition: eda_rect.cpp:35
wxPoint m_pos
Definition: eda_rect.h:47
wxSize m_size
Definition: eda_rect.h:48
bool m_init
Definition: eda_rect.h:49
EDA_RECT handles the component boundary box.
Definition: eda_rect.h:44
bool IsValid() const
Definition: eda_rect.h:126
const wxSize GetSize() const
Definition: eda_rect.h:103

References GetEnd(), GetPosition(), GetSize(), IsValid(), m_init, m_pos, m_size, Normalize(), and SetEnd().

Referenced by PCB_SHAPE::computeArcBBox(), GBR_LAYOUT::ComputeBoundingBox(), BOARD::ComputeBoundingBox(), LIB_PART::GetBodyBoundingBox(), EE_SELECTION::GetBoundingBox(), PCB_GROUP::GetBoundingBox(), SELECTION::GetBoundingBox(), FOOTPRINT::GetBoundingBox(), PCB_SHAPE::GetBoundingBox(), SCH_COMPONENT::GetBoundingBox(), SCH_SHEET::GetBoundingBox(), GERBVIEW_SELECTION::GetCenter(), SELECTION::GetCenter(), SCH_EDIT_FRAME::GetDocumentExtents(), FOOTPRINT::GetFootprintRect(), FOOTPRINT::GetFpPadsLocalBbox(), getSheetBbox(), LIB_PART::GetUnitBoundingBox(), ARC::HitTest(), CADSTAR_SCH_ARCHIVE_LOADER::Load(), GERBVIEW_SELECTION::ViewBBox(), and FOOTPRINT::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 459 of file eda_rect.cpp.

460 {
461  if( !m_init )
462  {
463  m_pos = aPoint;
464  m_size = wxSize( 0, 0 );
465  m_init = true;
466  return;
467  }
468 
469  Normalize(); // ensure width and height >= 0
470 
471  wxPoint end = GetEnd();
472  // Change origin and size in order to contain the given rect
473  m_pos.x = std::min( m_pos.x, aPoint.x );
474  m_pos.y = std::min( m_pos.y, aPoint.y );
475  end.x = std::max( end.x, aPoint.x );
476  end.y = std::max( end.y, aPoint.y );
477  SetEnd( end );
478 }
const wxPoint GetEnd() const
Definition: eda_rect.h:116
void SetEnd(int x, int y)
Definition: eda_rect.h:192
void Normalize()
Function Normalize ensures that the height ant width are positive.
Definition: eda_rect.cpp:35
wxPoint m_pos
Definition: eda_rect.h:47
wxSize m_size
Definition: eda_rect.h:48
bool m_init
Definition: eda_rect.h:49

References GetEnd(), m_init, m_pos, m_size, 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 51 of file eda_rect.cpp.

52 {
53  m_pos += aMoveVector;
54 }
wxPoint m_pos
Definition: eda_rect.h:47

References m_pos.

Referenced by APERTURE_MACRO::GetApertureMacroShape(), SCH_BITMAP::GetBoundingBox(), SCH_FIELD::GetBoundingBox(), AR_AUTOPLACER::getOptimalFPPlacement(), EDA_TEXT::GetTextBox(), FOOTPRINT::SetPosition(), and AR_AUTOPLACER::testFootprintOnBoard().

◆ 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 304 of file eda_rect.h.

305  {
306  EDA_RECT rect( m_pos, m_size );
307  rect.Normalize();
308  return BOX2I( rect.GetOrigin(), rect.GetSize() );
309  }
BOX2< VECTOR2I > BOX2I
Definition: box2.h:522
wxPoint m_pos
Definition: eda_rect.h:47
wxSize m_size
Definition: eda_rect.h:48
EDA_RECT handles the component boundary box.
Definition: eda_rect.h:44

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 292 of file eda_rect.h.

293  {
294  EDA_RECT rect( m_pos, m_size );
295  rect.Normalize();
296  return wxRect( rect.m_pos, rect.m_size );
297  }
wxPoint m_pos
Definition: eda_rect.h:47
wxSize m_size
Definition: eda_rect.h:48
EDA_RECT handles the component boundary box.
Definition: eda_rect.h:44

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  }
void Normalize()
Function Normalize ensures that the height ant width are positive.
Definition: eda_rect.cpp:35
wxPoint m_pos
Definition: eda_rect.h:47
wxSize m_size
Definition: eda_rect.h:48

References m_pos, m_size, and Normalize().

Referenced by KIGFX::SCH_PAINTER::draw(), LIB_CIRCLE::GetBoundingBox(), LIB_RECTANGLE::GetBoundingBox(), LIB_BEZIER::GetBoundingBox(), LIB_TEXT::GetBoundingBox(), LIB_POLYLINE::GetBoundingBox(), SCH_PIN::GetBoundingBox(), LIB_FIELD::GetBoundingBox(), LIB_PIN::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  }
wxPoint m_pos
Definition: eda_rect.h:47
wxSize m_size
Definition: eda_rect.h:48
bool m_init
Definition: eda_rect.h:49

References m_init, m_pos, and m_size.

◆ SetHeight()

void EDA_RECT::SetHeight ( int  val)
inline

◆ 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  }
wxPoint m_pos
Definition: eda_rect.h:47
bool m_init
Definition: eda_rect.h:49

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(), EDA_TEXT::GetTextBox(), 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

◆ SetX()

void EDA_RECT::SetX ( int  val)
inline

◆ SetY()

void EDA_RECT::SetY ( int  val)
inline

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: