KiCad PCB EDA Suite
EDA_RECT Class Reference

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

#include <eda_rect.h>

Inheritance diagram for EDA_RECT:
BLOCK_SELECTOR

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
 
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
 

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::EDA_RECT ( )
inline

Definition at line 51 of file eda_rect.h.

51 { };
EDA_RECT::EDA_RECT ( const wxPoint aPos,
const wxSize &  aSize 
)
inline

Definition at line 53 of file eda_rect.h.

53  :
54  m_Pos( aPos ),
55  m_Size( aSize )
56  { }
wxSize m_Size
Definition: eda_rect.h:48
wxPoint m_Pos
Definition: eda_rect.h:47
virtual EDA_RECT::~EDA_RECT ( )
inlinevirtual

Definition at line 58 of file eda_rect.h.

58 { };

Member Function Documentation

wxPoint EDA_RECT::Centre ( ) const
inline

Definition at line 60 of file eda_rect.h.

References Contains(), Move(), Normalize(), wxPoint::x, and wxPoint::y.

Referenced by PCB_EDIT_FRAME::AppendBoardFile(), FOOTPRINT_EDIT_FRAME::BestZoom(), LIB_VIEW_FRAME::BestZoom(), PCB_BASE_FRAME::BestZoom(), GERBVIEW_FRAME::BestZoom(), LIB_EDIT_FRAME::BestZoom(), PCB_EDIT_FRAME::Block_Flip(), PCB_EDIT_FRAME::Block_Rotate(), KIGFX::SCH_PAINTER::draw(), SCH_FIELD::Draw(), LIB_TEXT::drawGraphic(), BOARD_NETLIST_UPDATER::estimateComponentInsertionPosition(), AUTOPLACER::field_box_placement(), AUTOPLACER::field_horiz_placement(), GENDRILL_WRITER_BASE::genDrillMapFile(), DRAWSEGMENT::GetCenter(), FOOTPRINT_EDIT_FRAME::HandleBlockEnd(), initializePlotter(), CINFO3D_VISU::InitSettings(), Intersects(), SCH_FIELD::IsHorizJustifyFlipped(), SCH_EAGLE_PLUGIN::loadSheet(), LIB_PIN::Matches(), SCH_TEXT::Matches(), SCH_FIELD::Matches(), SCH_SHEET_PIN::Matches(), GERBVIEW_SELECTION_TOOL::MeasureTool(), SCH_EDIT_FRAME::MirrorSheet(), PCB_EDIT_FRAME::OnExportIDF3(), LIB_EDIT_FRAME::OnOrient(), SCH_EDIT_FRAME::OnOrient(), DIALOG_LIB_EDIT_PIN::OnPaintShowPanel(), LIB_EDIT_FRAME::OnRotate(), SCH_EDIT_FRAME::OnRotate(), LIB_TEXT::Plot(), SCH_FIELD::Plot(), LIB_FIELD::Plot(), BOARD::ReplaceNetlist(), and SCH_EDIT_FRAME::RotateHierarchicalSheet().

61  {
62  return wxPoint( m_Pos.x + ( m_Size.x >> 1 ),
63  m_Pos.y + ( m_Size.y >> 1 ) );
64  }
wxSize m_Size
Definition: eda_rect.h:48
wxPoint m_Pos
Definition: eda_rect.h:47
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 539 of file base_struct.cpp.

References GetBottom(), GetLeft(), GetRight(), GetTop(), max, min, Normalize(), wxPoint::x, and wxPoint::y.

Referenced by RevertYAxis().

540 {
541  EDA_RECT me( *this );
542 
543  me.Normalize(); // ensure size is >= 0
544 
545  // Determine closest point to the circle centre within this rect
546  int nx = std::max( me.GetLeft(), std::min( aPoint.x, me.GetRight() ) );
547  int ny = std::max( me.GetTop(), std::min( aPoint.y, me.GetBottom() ) );
548 
549  return wxPoint( nx, ny );
550 }
#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
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 713 of file base_struct.cpp.

References GetEnd(), GetOrigin(), max, min, SetEnd(), SetOrigin(), wxPoint::x, and wxPoint::y.

Referenced by calcCommonArea(), DRAWSEGMENT::HitTest(), and operator BOX2I().

714 {
715  EDA_RECT r;
716 
717  if( Intersects( aRect ) )
718  {
719  wxPoint originA( std::min( GetOrigin().x, GetEnd().x ),
720  std::min( GetOrigin().y, GetEnd().y ) );
721  wxPoint originB( std::min( aRect.GetOrigin().x, aRect.GetEnd().x ),
722  std::min( aRect.GetOrigin().y, aRect.GetEnd().y ) );
723  wxPoint endA( std::max( GetOrigin().x, GetEnd().x ),
724  std::max( GetOrigin().y, GetEnd().y ) );
725  wxPoint endB( std::max( aRect.GetOrigin().x, aRect.GetEnd().x ),
726  std::max( aRect.GetOrigin().y, aRect.GetEnd().y ) );
727 
728  r.SetOrigin( wxPoint( std::max( originA.x, originB.x ), std::max( originA.y, originB.y ) ) );
729  r.SetEnd ( wxPoint( std::min( endA.x, endB.x ), std::min( endA.y, endB.y ) ) );
730  }
731 
732  return r;
733 }
const wxPoint GetOrigin() const
Definition: eda_rect.h:112
void SetOrigin(const wxPoint &pos)
Definition: eda_rect.h:124
void SetEnd(int x, int y)
Definition: eda_rect.h:134
const wxPoint GetEnd() const
Definition: eda_rect.h:114
bool Intersects(const EDA_RECT &aRect) const
Function Intersects tests for a common area between rectangles.
#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
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 353 of file base_struct.cpp.

References wxPoint::x, and wxPoint::y.

Referenced by AR_AUTOPLACER::AutoplaceModules(), Centre(), Contains(), EDA_DRAW_PANEL::GetGrid(), GRPutPixel(), PCB_TARGET::HitTest(), SCH_JUNCTION::HitTest(), SCH_NO_CONNECT::HitTest(), SCH_BUS_ENTRY_BASE::HitTest(), LIB_PIN::HitTest(), SCH_BITMAP::HitTest(), SCH_LINE::HitTest(), SCH_FIELD::HitTest(), SCH_SHEET_PIN::HitTest(), SCH_TEXT::HitTest(), DRAWSEGMENT::HitTest(), TRACK::HitTest(), DIMENSION::HitTest(), GERBER_DRAW_ITEM::HitTest(), WS_DRAW_ITEM_BITMAP::HitTest(), ZONE_CONTAINER::HitTest(), VIA::HitTest(), MODULE::HitTest(), SCH_SHEET::HitTest(), SCH_COMPONENT::HitTest(), D_PAD::HitTest(), MARKER_BASE::HitTestMarker(), LIB_RECTANGLE::Inside(), LIB_BEZIER::Inside(), LIB_POLYLINE::Inside(), LIB_ARC::Inside(), LIB_PIN::Inside(), Intersects(), MarkItemsInBloc(), AR_AUTOPLACER::nearestPad(), PCB_EDIT_FRAME::SpreadFootprints(), TEXTE_MODULE::TextHitTest(), and EDA_TEXT::TextHitTest().

354 {
355  wxPoint rel_pos = aPoint - m_Pos;
356  wxSize size = m_Size;
357 
358  if( size.x < 0 )
359  {
360  size.x = -size.x;
361  rel_pos.x += size.x;
362  }
363 
364  if( size.y < 0 )
365  {
366  size.y = -size.y;
367  rel_pos.y += size.y;
368  }
369 
370  return (rel_pos.x >= 0) && (rel_pos.y >= 0) && ( rel_pos.y <= size.y) && ( rel_pos.x <= size.x);
371 }
wxSize m_Size
Definition: eda_rect.h:48
wxPoint m_Pos
Definition: eda_rect.h:47
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 92 of file eda_rect.h.

References Contains().

Referenced by Contains().

92 { return Contains( wxPoint( x, y ) ); }
bool Contains(const wxPoint &aPoint) const
Function Contains.
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 374 of file base_struct.cpp.

References GetEnd(), and GetOrigin().

375 {
376  return Contains( aRect.GetOrigin() ) && Contains( aRect.GetEnd() );
377 }
const wxPoint GetOrigin() const
Definition: eda_rect.h:112
bool Contains(const wxPoint &aPoint) const
Function Contains.
const wxPoint GetEnd() const
Definition: eda_rect.h:114
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 553 of file base_struct.cpp.

References abs, GetBottom(), GetLeft(), GetRight(), GetTop(), max, Normalize(), wxPoint::x, and wxPoint::y.

Referenced by RevertYAxis().

554 {
555  EDA_RECT me( *this );
556 
557  me.Normalize(); // ensure size is >= 0
558 
559  int fx = std::max( std::abs( aPoint.x - me.GetLeft() ), std::abs( aPoint.x - me.GetRight() ) );
560  int fy = std::max( std::abs( aPoint.y - me.GetTop() ), std::abs( aPoint.y - me.GetBottom() ) );
561 
562  return wxPoint( fx, fy );
563 }
#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
double EDA_RECT::GetArea ( ) const

Function GetArea returns the area of the rectangle.

Returns
The area of the rectangle.

Definition at line 707 of file base_struct.cpp.

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

708 {
709  return (double) GetWidth() * (double) GetHeight();
710 }
int GetHeight() const
Definition: eda_rect.h:118
int GetWidth() const
Definition: eda_rect.h:117
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 736 of file base_struct.cpp.

References max, min, RotatePoint(), SetEnd(), SetOrigin(), wxPoint::x, and wxPoint::y.

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

737 {
738  wxPoint corners[4];
739 
740  // Build the corners list
741  corners[0] = GetOrigin();
742  corners[2] = GetEnd();
743  corners[1].x = corners[0].x;
744  corners[1].y = corners[2].y;
745  corners[3].x = corners[2].x;
746  corners[3].y = corners[0].y;
747 
748  // Rotate all corners, to find the bounding box
749  for( int ii = 0; ii < 4; ii ++ )
750  RotatePoint( &corners[ii], aRotCenter, aAngle );
751 
752  // Find the corners bounding box
753  wxPoint start = corners[0];
754  wxPoint end = corners[0];
755 
756  for( int ii = 1; ii < 4; ii ++ )
757  {
758  start.x = std::min( start.x, corners[ii].x);
759  start.y = std::min( start.y, corners[ii].y);
760  end.x = std::max( end.x, corners[ii].x);
761  end.y = std::max( end.y, corners[ii].y);
762  }
763 
764  EDA_RECT bbox;
765  bbox.SetOrigin( start );
766  bbox.SetEnd( end );
767 
768  return bbox;
769 }
const wxPoint GetOrigin() const
Definition: eda_rect.h:112
void SetOrigin(const wxPoint &pos)
Definition: eda_rect.h:124
void RotatePoint(int *pX, int *pY, double angle)
Definition: trigo.cpp:216
void SetEnd(int x, int y)
Definition: eda_rect.h:134
const wxPoint GetEnd() const
Definition: eda_rect.h:114
#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
const wxPoint EDA_RECT::GetCenter ( ) const
inline

Definition at line 115 of file eda_rect.h.

References wxPoint::x, and wxPoint::y.

Referenced by DIALOG_EXPORT_STEP::onExportButton().

115 { 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
int EDA_RECT::GetHeight ( ) const
inline

Definition at line 118 of file eda_rect.h.

Referenced by GERBER_JOBFILE_WRITER::addJSONGeneralSpecs(), AllAreModulesAndReturnSmallestIfSo(), FOOTPRINT_EDIT_FRAME::BestZoom(), LIB_VIEW_FRAME::BestZoom(), PCB_BASE_FRAME::BestZoom(), GERBVIEW_FRAME::BestZoom(), LIB_EDIT_FRAME::BestZoom(), BuildBoardPolygonOutlines(), EAGLE_PLUGIN::centerBoard(), ClipAndDrawPoly(), AR_MATRIX::ComputeMatrixSize(), DIALOG_EXPORT_SVG::CreateSVGFile(), CreateThermalReliefPadPolygon(), BLOCK_SELECTOR::Draw(), DrawAndSizingBlockOutlines(), DrawPageOnClipboard(), BOARD_NETLIST_UPDATER::estimateComponentInsertionPosition(), AUTOPLACER::field_box_placement(), AUTOPLACER::field_vert_placement(), fillRectList(), GENDRILL_WRITER_BASE::genDrillMapFile(), AR_AUTOPLACER::genPlacementRoutingMatrix(), AUTOPLACER::get_preferred_sides(), MODULE::GetArea(), PCB_BASE_FRAME::GetBoardBoundingBox(), LIB_VIEW_FRAME::GetDocumentExtents(), LIB_EDIT_FRAME::GetDocumentExtents(), BOARD::GetFootprint(), EDA_DRAW_PANEL::GetGrid(), SCH_SHEET::GetMinHeight(), D_PAD::HitTest(), CINFO3D_VISU::InitSettings(), Intersects(), SCH_EAGLE_PLUGIN::loadSchematic(), DSN::SPECCTRA_DB::makePADSTACK(), moveFootprintsInArea(), SCH_DRAW_PANEL::OnMouseEvent(), EDA_DRAW_PANEL::OnMouseEvent(), DIALOG_LIB_EDIT_PIN::OnPaintShowPanel(), EDA_DRAW_PANEL::OnScroll(), SELECTION_TOOL::pickSmallestComponent(), BOARD::ReplaceNetlist(), WORKSHEET_DATAITEM_TEXT::SetConstrainedTextSize(), and PCB_EDIT_FRAME::SpreadFootprints().

118 { return m_Size.y; }
wxSize m_Size
Definition: eda_rect.h:48
int EDA_RECT::GetLeft ( ) const
inline
const wxPoint EDA_RECT::GetPosition ( ) const
inline
int EDA_RECT::GetSizeMax ( ) const
inline

GetSizeMax.

Returns
the max size dimension

Definition at line 107 of file eda_rect.h.

Referenced by CINFO3D_VISU::AddShapeWithClearanceToContainer(), and CINFO3D_VISU::transformGraphicModuleEdgeToPolygonSet().

107 { return ( m_Size.x > m_Size.y )?m_Size.x:m_Size.y; }
wxSize m_Size
Definition: eda_rect.h:48
int EDA_RECT::GetTop ( ) const
inline
int EDA_RECT::GetWidth ( ) const
inline

Definition at line 117 of file eda_rect.h.

Referenced by GERBER_JOBFILE_WRITER::addJSONGeneralSpecs(), AllAreModulesAndReturnSmallestIfSo(), FOOTPRINT_EDIT_FRAME::BestZoom(), LIB_VIEW_FRAME::BestZoom(), PCB_BASE_FRAME::BestZoom(), GERBVIEW_FRAME::BestZoom(), LIB_EDIT_FRAME::BestZoom(), PCB_EDIT_FRAME::Block_SelectItems(), BuildBoardPolygonOutlines(), EAGLE_PLUGIN::centerBoard(), ClipAndDrawPoly(), AR_MATRIX::ComputeMatrixSize(), DIALOG_EXPORT_SVG::CreateSVGFile(), CreateThermalReliefPadPolygon(), BLOCK_SELECTOR::Draw(), DrawAndSizingBlockOutlines(), DrawPageOnClipboard(), BOARD_NETLIST_UPDATER::estimateComponentInsertionPosition(), AUTOPLACER::field_box_placement(), fillRectList(), GENDRILL_WRITER_BASE::genDrillMapFile(), AR_AUTOPLACER::genPlacementRoutingMatrix(), AUTOPLACER::get_preferred_sides(), MODULE::GetArea(), PCB_BASE_FRAME::GetBoardBoundingBox(), LIB_VIEW_FRAME::GetDocumentExtents(), LIB_EDIT_FRAME::GetDocumentExtents(), BOARD::GetFootprint(), EDA_DRAW_PANEL::GetGrid(), SCH_SHEET::GetMinWidth(), EDA_TEXT::GetTextBox(), D_PAD::HitTest(), CINFO3D_VISU::InitSettings(), Intersects(), SCH_EAGLE_PLUGIN::loadSchematic(), DSN::SPECCTRA_DB::makePADSTACK(), moveFootprintsInArea(), SCH_DRAW_PANEL::OnMouseEvent(), EDA_DRAW_PANEL::OnMouseEvent(), DIALOG_LIB_EDIT_PIN::OnPaintShowPanel(), EDA_DRAW_PANEL::OnScroll(), SELECTION_TOOL::pickSmallestComponent(), BOARD::ReplaceNetlist(), WORKSHEET_DATAITEM_TEXT::SetConstrainedTextSize(), PCB_EDIT_FRAME::SpreadFootprints(), and GERBER_DRAW_ITEM::ViewGetLOD().

117 { return m_Size.x; }
wxSize m_Size
Definition: eda_rect.h:48
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 608 of file base_struct.cpp.

Referenced by BuildBoardPolygonOutlines(), ZONE_FILLER::buildZoneFeatureHoleList(), FillNegativeKnockout(), AR_AUTOPLACER::genModuleOnRoutingMatrix(), SCH_JUNCTION::GetBoundingBox(), LIB_CIRCLE::GetBoundingBox(), SCH_NO_CONNECT::GetBoundingBox(), LIB_RECTANGLE::GetBoundingBox(), LIB_POLYLINE::GetBoundingBox(), LIB_BEZIER::GetBoundingBox(), SCH_BUS_ENTRY_BASE::GetBoundingBox(), LIB_ARC::GetBoundingBox(), LIB_PIN::GetBoundingBox(), BITMAP_BASE::GetBoundingBox(), DRAWSEGMENT::GetBoundingBox(), GERBER_DRAW_ITEM::GetBoundingBox(), SCH_SHEET::GetBoundingBox(), D_PAD::GetBoundingBox(), MODULE::GetFootprintRect(), EDA_DRAW_PANEL::GetGrid(), GRCSegm(), GRLineArray(), GRSFilledRect(), PCB_TARGET::HitTest(), SCH_JUNCTION::HitTest(), SCH_NO_CONNECT::HitTest(), SCH_BUS_ENTRY_BASE::HitTest(), LIB_PIN::HitTest(), SCH_BITMAP::HitTest(), SCH_LINE::HitTest(), SCH_FIELD::HitTest(), SCH_SHEET_PIN::HitTest(), SCH_TEXT::HitTest(), DRAWSEGMENT::HitTest(), TRACK::HitTest(), DIMENSION::HitTest(), ZONE_CONTAINER::HitTest(), VIA::HitTest(), MODULE::HitTest(), SCH_SHEET::HitTest(), SCH_COMPONENT::HitTest(), D_PAD::HitTest(), CINFO3D_VISU::InitSettings(), Intersects(), SCH_EDIT_FRAME::OnDragItem(), operator BOX2I(), SCH_SCREEN::SelectBlockItems(), PCB_EDIT_FRAME::SpreadFootprints(), AR_AUTOPLACER::testModuleOnBoard(), AR_AUTOPLACER::testRectangle(), TEXTE_MODULE::TextHitTest(), EDA_TEXT::TextHitTest(), EDA_TEXT::TransformBoundingBoxWithClearanceToPolygon(), MODULE::ViewBBox(), and WinClipAndDrawLine().

609 {
610  if( m_Size.x >= 0 )
611  {
612  if( m_Size.x < -2 * dx )
613  {
614  // Don't allow deflate to eat more width than we have,
615  m_Pos.x += m_Size.x / 2;
616  m_Size.x = 0;
617  }
618  else
619  {
620  // The inflate is valid.
621  m_Pos.x -= dx;
622  m_Size.x += 2 * dx;
623  }
624  }
625  else // size.x < 0:
626  {
627  if( m_Size.x > -2 * dx )
628  {
629  // Don't allow deflate to eat more width than we have,
630  m_Pos.x -= m_Size.x / 2;
631  m_Size.x = 0;
632  }
633  else
634  {
635  // The inflate is valid.
636  m_Pos.x += dx;
637  m_Size.x -= 2 * dx; // m_Size.x <0: inflate when dx > 0
638  }
639  }
640 
641  if( m_Size.y >= 0 )
642  {
643  if( m_Size.y < -2 * dy )
644  {
645  // Don't allow deflate to eat more height than we have,
646  m_Pos.y += m_Size.y / 2;
647  m_Size.y = 0;
648  }
649  else
650  {
651  // The inflate is valid.
652  m_Pos.y -= dy;
653  m_Size.y += 2 * dy;
654  }
655  }
656  else // size.y < 0:
657  {
658  if( m_Size.y > 2 * dy )
659  {
660  // Don't allow deflate to eat more height than we have,
661  m_Pos.y -= m_Size.y / 2;
662  m_Size.y = 0;
663  }
664  else
665  {
666  // The inflate is valid.
667  m_Pos.y += dy;
668  m_Size.y -= 2 * dy; // m_Size.y <0: inflate when dy > 0
669  }
670  }
671 
672  return *this;
673 }
wxSize m_Size
Definition: eda_rect.h:48
wxPoint m_Pos
Definition: eda_rect.h:47
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 601 of file base_struct.cpp.

602 {
603  Inflate( aDelta, aDelta );
604  return *this;
605 }
EDA_RECT & Inflate(wxCoord dx, wxCoord dy)
Function Inflate inflates the rectangle horizontally by dx and vertically by dy.
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 406 of file base_struct.cpp.

References m_Pos, m_Size, max, min, Normalize(), wxPoint::x, and wxPoint::y.

Referenced by ZONE_FILLER::buildZoneFeatureHoleList(), AUTOPLACER::filtered_colliders(), PCB_TARGET::HitTest(), SCH_JUNCTION::HitTest(), SCH_NO_CONNECT::HitTest(), SCH_BUS_ENTRY_BASE::HitTest(), SCH_BITMAP::HitTest(), WS_DRAW_ITEM_LINE::HitTest(), SCH_LINE::HitTest(), SCH_FIELD::HitTest(), SCH_TEXT::HitTest(), DRAWSEGMENT::HitTest(), TRACK::HitTest(), DIMENSION::HitTest(), WS_DRAW_ITEM_POLYGON::HitTest(), WS_DRAW_ITEM_RECT::HitTest(), ZONE_CONTAINER::HitTest(), WS_DRAW_ITEM_BITMAP::HitTest(), MODULE::HitTest(), SCH_SHEET::HitTest(), SCH_COMPONENT::HitTest(), D_PAD::HitTest(), LIB_TEXT::Inside(), LIB_FIELD::Inside(), RevertYAxis(), TEXTE_MODULE::TextHitTest(), and EDA_TEXT::TextHitTest().

407 {
408  // this logic taken from wxWidgets' geometry.cpp file:
409  bool rc;
410  EDA_RECT me(*this);
411  EDA_RECT rect(aRect);
412  me.Normalize(); // ensure size is >= 0
413  rect.Normalize(); // ensure size is >= 0
414 
415  // calculate the left common area coordinate:
416  int left = std::max( me.m_Pos.x, rect.m_Pos.x );
417  // calculate the right common area coordinate:
418  int right = std::min( me.m_Pos.x + me.m_Size.x, rect.m_Pos.x + rect.m_Size.x );
419  // calculate the upper common area coordinate:
420  int top = std::max( me.m_Pos.y, aRect.m_Pos.y );
421  // calculate the lower common area coordinate:
422  int bottom = std::min( me.m_Pos.y + me.m_Size.y, rect.m_Pos.y + rect.m_Size.y );
423 
424  // if a common area exists, it must have a positive (null accepted) size
425  if( left <= right && top <= bottom )
426  rc = true;
427  else
428  rc = false;
429 
430  return rc;
431 }
#define max(a, b)
Definition: auxiliary.h:86
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
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 434 of file base_struct.cpp.

References Centre(), Contains(), delta, GetHeight(), GetWidth(), i, Inflate(), RotatePoint(), and SetOrigin().

435 {
436  /* Most rectangles will be axis aligned.
437  * It is quicker to check for this case and pass the rect
438  * to the simpler intersection test
439  */
440 
441  // Prevent floating point comparison errors
442  static const double ROT_EPS = 0.000000001;
443 
444  static const double ROT_PARALLEL[] = { -3600, -1800, 0, 1800, 3600 };
445  static const double ROT_PERPENDICULAR[] = { -2700, -900, 0, 900, 2700 };
446 
447  NORMALIZE_ANGLE_POS<double>( aRot );
448 
449  // Test for non-rotated rectangle
450  for( int ii = 0; ii < 5; ii++ )
451  {
452  if( std::fabs( aRot - ROT_PARALLEL[ii] ) < ROT_EPS )
453  {
454  return Intersects( aRect );
455  }
456  }
457 
458  // Test for rectangle rotated by multiple of 90 degrees
459  for( int jj = 0; jj < 4; jj++ )
460  {
461  if( std::fabs( aRot - ROT_PERPENDICULAR[jj] ) < ROT_EPS )
462  {
463  EDA_RECT rotRect;
464 
465  // Rotate the supplied rect by 90 degrees
466  rotRect.SetOrigin( aRect.Centre() );
467  rotRect.Inflate( aRect.GetHeight(), aRect.GetWidth() );
468  return Intersects( rotRect );
469  }
470  }
471 
472  /* There is some non-orthogonal rotation.
473  * There are three cases to test:
474  * A) One point of this rect is inside the rotated rect
475  * B) One point of the rotated rect is inside this rect
476  * C) One of the sides of the rotated rect intersect this
477  */
478 
479  wxPoint corners[4];
480 
481  /* Test A : Any corners exist in rotated rect? */
482 
483  corners[0] = m_Pos;
484  corners[1] = m_Pos + wxPoint( m_Size.x, 0 );
485  corners[2] = m_Pos + wxPoint( m_Size.x, m_Size.y );
486  corners[3] = m_Pos + wxPoint( 0, m_Size.y );
487 
488  wxPoint rCentre = aRect.Centre();
489 
490  for( int i = 0; i < 4; i++ )
491  {
492  wxPoint delta = corners[i] - rCentre;
493  RotatePoint( &delta, -aRot );
494  delta += rCentre;
495 
496  if( aRect.Contains( delta ) )
497  {
498  return true;
499  }
500  }
501 
502  /* Test B : Any corners of rotated rect exist in this one? */
503  int w = aRect.GetWidth() / 2;
504  int h = aRect.GetHeight() / 2;
505 
506  // Construct corners around center of shape
507  corners[0] = wxPoint( -w, -h );
508  corners[1] = wxPoint( w, -h );
509  corners[2] = wxPoint( w, h );
510  corners[3] = wxPoint( -w, h );
511 
512  // Rotate and test each corner
513  for( int j=0; j<4; j++ )
514  {
515  RotatePoint( &corners[j], aRot );
516  corners[j] += rCentre;
517 
518  if( Contains( corners[j] ) )
519  {
520  return true;
521  }
522  }
523 
524  /* Test C : Any sides of rotated rect intersect this */
525 
526  if( Intersects( corners[0], corners[1] ) ||
527  Intersects( corners[1], corners[2] ) ||
528  Intersects( corners[2], corners[3] ) ||
529  Intersects( corners[3], corners[0] ) )
530  {
531  return true;
532  }
533 
534 
535  return false;
536 }
bool Contains(const wxPoint &aPoint) const
Function Contains.
int GetHeight() const
Definition: eda_rect.h:118
void SetOrigin(const wxPoint &pos)
Definition: eda_rect.h:124
void RotatePoint(int *pX, int *pY, double angle)
Definition: trigo.cpp:216
static const int delta[8][2]
Definition: solve.cpp:112
wxSize m_Size
Definition: eda_rect.h:48
wxPoint Centre() const
Definition: eda_rect.h:60
bool Intersects(const EDA_RECT &aRect) const
Function Intersects tests for a common area between rectangles.
size_t i
Definition: json11.cpp:597
Class EDA_RECT handles the component boundary box.
Definition: eda_rect.h:44
wxPoint m_Pos
Definition: eda_rect.h:47
int GetWidth() const
Definition: eda_rect.h:117
EDA_RECT & Inflate(wxCoord dx, wxCoord dy)
Function Inflate inflates the rectangle horizontally by dx and vertically by dy.
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 380 of file base_struct.cpp.

References SegmentIntersectsSegment(), wxPoint::x, and wxPoint::y.

381 {
382  wxPoint point2, point4;
383 
384  if( Contains( aPoint1 ) || Contains( aPoint2 ) )
385  return true;
386 
387  point2.x = GetEnd().x;
388  point2.y = GetOrigin().y;
389  point4.x = GetOrigin().x;
390  point4.y = GetEnd().y;
391 
392  //Only need to test 3 sides since a straight line cant enter and exit on same side
393  if( SegmentIntersectsSegment( aPoint1, aPoint2, GetOrigin() , point2 ) )
394  return true;
395 
396  if( SegmentIntersectsSegment( aPoint1, aPoint2, point2 , GetEnd() ) )
397  return true;
398 
399  if( SegmentIntersectsSegment( aPoint1, aPoint2, GetEnd() , point4 ) )
400  return true;
401 
402  return false;
403 }
const wxPoint GetOrigin() const
Definition: eda_rect.h:112
bool Contains(const wxPoint &aPoint) const
Function Contains.
bool SegmentIntersectsSegment(const wxPoint &a_p1_l1, const wxPoint &a_p2_l1, const wxPoint &a_p1_l2, const wxPoint &a_p2_l2)
Function SegmentIntersectsSegment.
Definition: trigo.cpp:58
const wxPoint GetEnd() const
Definition: eda_rect.h:114
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 566 of file base_struct.cpp.

References wxPoint::x, and wxPoint::y.

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

567 {
568  wxPoint closest = ClosestPointTo( aCenter );
569 
570  double dx = aCenter.x - closest.x;
571  double dy = aCenter.y - closest.y;
572 
573  double r = (double) aRadius;
574 
575  return ( dx * dx + dy * dy ) <= ( r * r );
576 }
const wxPoint ClosestPointTo(const wxPoint &aPoint) const
Return the point in this rect that is closest to the provided point.
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 579 of file base_struct.cpp.

References Normalize(), wxPoint::x, and wxPoint::y.

Referenced by DRAWSEGMENT::HitTest(), and RevertYAxis().

580 {
581  EDA_RECT me( *this );
582  me.Normalize(); // ensure size is >= 0
583 
584  // Test if the circle intersects at all
585  if( !IntersectsCircle( aCenter, aRadius + aWidth / 2 ) )
586  {
587  return false;
588  }
589 
590  wxPoint farpt = FarthestPointTo( aCenter );
591  // Farthest point must be further than the inside of the line
592  double fx = (double) farpt.x;
593  double fy = (double) farpt.y;
594 
595  double r = (double) aRadius - (double) aWidth / 2;
596 
597  return ( fx * fx + fy * fy ) > ( r * r );
598 }
bool IntersectsCircle(const wxPoint &aCenter, const int aRadius) const
Function IntersectsCircle tests for a common area between a circle and this rectangle.
Class EDA_RECT handles the component boundary box.
Definition: eda_rect.h:44
const wxPoint FarthestPointTo(const wxPoint &aPoint) const
Return the point in this rect that is farthest from the provided point.
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 676 of file base_struct.cpp.

References GetEnd(), m_Pos, max, min, Normalize(), wxPoint::x, and wxPoint::y.

Referenced by PCB_EDIT_FRAME::AppendBoardFile(), DRAWSEGMENT::computeArcBBox(), GBR_LAYOUT::ComputeBoundingBox(), BOARD::ComputeBoundingBox(), LIB_PART::GetBodyBoundingBox(), SELECTION::GetBoundingBox(), MODULE::GetBoundingBox(), DRAWSEGMENT::GetBoundingBox(), SCH_COMPONENT::GetBoundingBox(), D_PAD::GetBoundingBox(), MODULE::GetFootprintRect(), getSheetBbox(), LIB_PART::GetUnitBoundingBox(), CVPCB_SELECTION_TOOL::MeasureTool(), GERBVIEW_SELECTION_TOOL::MeasureTool(), operator BOX2I(), and MODULE::ViewBBox().

677 {
678  Normalize(); // ensure width and height >= 0
679  EDA_RECT rect = aRect;
680  rect.Normalize(); // ensure width and height >= 0
681  wxPoint end = GetEnd();
682  wxPoint rect_end = rect.GetEnd();
683 
684  // Change origin and size in order to contain the given rect
685  m_Pos.x = std::min( m_Pos.x, rect.m_Pos.x );
686  m_Pos.y = std::min( m_Pos.y, rect.m_Pos.y );
687  end.x = std::max( end.x, rect_end.x );
688  end.y = std::max( end.y, rect_end.y );
689  SetEnd( end );
690 }
void SetEnd(int x, int y)
Definition: eda_rect.h:134
const wxPoint GetEnd() const
Definition: eda_rect.h:114
void Normalize()
Function Normalize ensures that the height ant width are positive.
#define max(a, b)
Definition: auxiliary.h:86
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
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 693 of file base_struct.cpp.

References max, min, wxPoint::x, and wxPoint::y.

694 {
695  Normalize(); // ensure width and height >= 0
696 
697  wxPoint end = GetEnd();
698  // Change origin and size in order to contain the given rect
699  m_Pos.x = std::min( m_Pos.x, aPoint.x );
700  m_Pos.y = std::min( m_Pos.y, aPoint.y );
701  end.x = std::max( end.x, aPoint.x );
702  end.y = std::max( end.y, aPoint.y );
703  SetEnd( end );
704 }
void SetEnd(int x, int y)
Definition: eda_rect.h:134
const wxPoint GetEnd() const
Definition: eda_rect.h:114
void Normalize()
Function Normalize ensures that the height ant width are positive.
#define max(a, b)
Definition: auxiliary.h:86
wxPoint m_Pos
Definition: eda_rect.h:47
#define min(a, b)
Definition: auxiliary.h:85
void EDA_RECT::Offset ( int  dx,
int  dy 
)
inline

Definition at line 128 of file eda_rect.h.

References wxPoint::x, and wxPoint::y.

Referenced by SCH_COMPONENT::GetBodyBoundingBox().

128 { m_Pos.x += dx; m_Pos.y += dy; }
wxPoint m_Pos
Definition: eda_rect.h:47
void EDA_RECT::Offset ( const wxPoint offset)
inline

Definition at line 129 of file eda_rect.h.

129 { m_Pos += offset; }
wxPoint m_Pos
Definition: eda_rect.h:47
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 228 of file eda_rect.h.

References Common(), GetArea(), GetBoundingBoxRotated(), GetOrigin(), GetSize(), Inflate(), Merge(), and Normalize().

229  {
230  EDA_RECT rect( m_Pos, m_Size );
231  rect.Normalize();
232  return BOX2I( rect.GetOrigin(), rect.GetSize() );
233  }
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
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 216 of file eda_rect.h.

References m_Pos, m_Size, and Normalize().

217  {
218  EDA_RECT rect( m_Pos, m_Size );
219  rect.Normalize();
220  return wxRect( rect.m_Pos, rect.m_Size );
221  }
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
void EDA_RECT::SetEnd ( const wxPoint pos)
inline

Definition at line 135 of file eda_rect.h.

References wxPoint::x, and wxPoint::y.

136  {
137  m_Size.x = pos.x - m_Pos.x; m_Size.y = pos.y - m_Pos.y;
138  }
wxSize m_Size
Definition: eda_rect.h:48
wxPoint m_Pos
Definition: eda_rect.h:47
void EDA_RECT::SetHeight ( int  val)
inline
void EDA_RECT::SetOrigin ( int  x,
int  y 
)
inline

Definition at line 125 of file eda_rect.h.

References wxPoint::x, and wxPoint::y.

125 { m_Pos.x = x; m_Pos.y = y; }
wxPoint m_Pos
Definition: eda_rect.h:47
void EDA_RECT::SetSize ( int  w,
int  h 
)
inline

Definition at line 127 of file eda_rect.h.

127 { m_Size.x = w; m_Size.y = h; }
wxSize m_Size
Definition: eda_rect.h:48
void EDA_RECT::SetWidth ( int  val)
inline

Member Data Documentation

wxPoint EDA_RECT::m_Pos
private

Definition at line 47 of file eda_rect.h.

Referenced by GetOrigin(), GetPosition(), Intersects(), Merge(), and operator wxRect().

wxSize EDA_RECT::m_Size
private

Definition at line 48 of file eda_rect.h.

Referenced by GetSize(), Intersects(), and operator wxRect().


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