123
123
EDA_RECT D_PAD::GetBoundingBox() const
127
// radius of pad area, enclosed in minimum sized circle
128
int radius = boundingRadius();
130
area.SetOrigin( m_Pos );
131
area.Inflate( radius );
126
wxPoint quadrant1, quadrant2, quadrant3, quadrant4;
132
area.SetOrigin( m_Pos );
133
area.Inflate( m_Size.x / 2 );
137
//Use the maximal two most distant points and track their rotation
138
// (utilise symmetry to avoid four points)
139
quadrant1.x = m_Size.x/2;
142
quadrant2.y = m_Size.y/2;
144
RotatePoint( &quadrant1, m_Orient );
145
RotatePoint( &quadrant2, m_Orient );
146
dx = std::max( std::abs( quadrant1.x ) , std::abs( quadrant2.x ) );
147
dy = std::max( std::abs( quadrant1.y ) , std::abs( quadrant2.y ) );
148
area.SetOrigin( m_Pos.x-dx, m_Pos.y-dy );
149
area.SetSize( 2*dx, 2*dy );
154
//Use two corners and track their rotation
155
// (utilise symmetry to avoid four points)
156
quadrant1.x = m_Size.x/2;
157
quadrant1.y = m_Size.y/2;
158
quadrant2.x = -m_Size.x/2;
159
quadrant2.y = m_Size.y/2;
161
RotatePoint( &quadrant1, m_Orient );
162
RotatePoint( &quadrant2, m_Orient );
163
dx = std::max( std::abs( quadrant1.x ) , std::abs( quadrant2.x ) );
164
dy = std::max( std::abs( quadrant1.y ) , std::abs( quadrant2.y ) );
165
area.SetOrigin( m_Pos.x-dx, m_Pos.y-dy );
166
area.SetSize( 2*dx, 2*dy );
170
//Use the four corners and track their rotation
171
// (Trapezoids will not be symmetric)
172
quadrant1.x = (m_Size.x + m_DeltaSize.y)/2;
173
quadrant1.y = (m_Size.y - m_DeltaSize.x)/2;
174
quadrant2.x = -(m_Size.x + m_DeltaSize.y)/2;
175
quadrant2.y = (m_Size.y + m_DeltaSize.x)/2;
176
quadrant3.x = -(m_Size.x - m_DeltaSize.y)/2;
177
quadrant3.y = -(m_Size.y + m_DeltaSize.x)/2;
178
quadrant4.x = (m_Size.x - m_DeltaSize.y)/2;
179
quadrant4.y = -(m_Size.y - m_DeltaSize.x)/2;
181
RotatePoint( &quadrant1, m_Orient );
182
RotatePoint( &quadrant2, m_Orient );
183
RotatePoint( &quadrant3, m_Orient );
184
RotatePoint( &quadrant4, m_Orient );
186
x = std::min( quadrant1.x, std::min( quadrant2.x, std::min( quadrant3.x, quadrant4.x) ) );
187
y = std::min( quadrant1.y, std::min( quadrant2.y, std::min( quadrant3.y, quadrant4.y) ) );
188
dx = std::max( quadrant1.x, std::max( quadrant2.x, std::max( quadrant3.x, quadrant4.x) ) );
189
dy = std::max( quadrant1.y, std::max( quadrant2.y, std::max( quadrant3.y, quadrant4.y) ) );
190
area.SetOrigin( m_Pos.x+x, m_Pos.y+y );
191
area.SetSize( dx-x, dy-y );