Better calculations in TransformRoundChamferedRectToPolygon().
the old calculations was creating a slightly too small shape for rounded corners. Now the polygon is outside the perfect shape (as required to create a shape with clearance) Fixes #4805 https://gitlab.com/kicad/code/kicad/issues/4805
This commit is contained in:
parent
6eca886292
commit
82da739786
|
@ -243,7 +243,35 @@ void TransformRoundChamferedRectToPolygon( SHAPE_POLY_SET& aCornerBuffer, const
|
||||||
// These are small radius corners (of which there may be many), so peg the segs-per-circle
|
// These are small radius corners (of which there may be many), so peg the segs-per-circle
|
||||||
// to no more than 16.
|
// to no more than 16.
|
||||||
int numSegs = std::max( GetArcToSegmentCount( aCornerRadius, aError, 360.0 ), 16 );
|
int numSegs = std::max( GetArcToSegmentCount( aCornerRadius, aError, 360.0 ), 16 );
|
||||||
outline.Inflate( aCornerRadius, numSegs );
|
|
||||||
|
// To build the polygonal shape outside the actual shape, we use a bigger
|
||||||
|
// radius to build rounded corners.
|
||||||
|
// However, the size of the shape is too large.
|
||||||
|
// so, we also clamp the polygonal shape with the bounding box
|
||||||
|
// of the initial shape.
|
||||||
|
|
||||||
|
double correction = GetCircletoPolyCorrectionFactor( numSegs );
|
||||||
|
int radius = aCornerRadius * correction; // make segments outside the circles
|
||||||
|
outline.Inflate( radius, numSegs );
|
||||||
|
|
||||||
|
if( correction > 1.0 )
|
||||||
|
{
|
||||||
|
// Refinement: clamp the inflated polygonal shape by the rectangular shape
|
||||||
|
// containing the rounded polygon
|
||||||
|
SHAPE_POLY_SET bbox; // the rectangular shape
|
||||||
|
bbox.NewOutline();
|
||||||
|
|
||||||
|
for( const wxPoint& corner : corners )
|
||||||
|
bbox.Append( corner );
|
||||||
|
|
||||||
|
// Just build the rectangular bbox
|
||||||
|
bbox.Inflate( aCornerRadius, 1, SHAPE_POLY_SET::CORNER_STRATEGY::ALLOW_ACUTE_CORNERS );
|
||||||
|
|
||||||
|
// Now, clamp the shape
|
||||||
|
outline.BooleanIntersection( bbox, SHAPE_POLY_SET::PM_STRICTLY_SIMPLE );
|
||||||
|
// Note the final polygon is a simple, convex polygon with no hole
|
||||||
|
// due to the shape of initial polygons
|
||||||
|
}
|
||||||
|
|
||||||
if( aChamferCorners == RECT_NO_CHAMFER ) // no chamfer
|
if( aChamferCorners == RECT_NO_CHAMFER ) // no chamfer
|
||||||
{
|
{
|
||||||
|
|
|
@ -576,6 +576,9 @@ void D_PAD::TransformShapeWithClearanceToPolygon( SHAPE_POLY_SET& aCornerBuffer,
|
||||||
double correction = GetCircletoPolyCorrectionFactor( numSegs );
|
double correction = GetCircletoPolyCorrectionFactor( numSegs );
|
||||||
int clearance = KiROUND( aClearanceValue * correction );
|
int clearance = KiROUND( aClearanceValue * correction );
|
||||||
outline.Inflate( clearance, numSegs );
|
outline.Inflate( clearance, numSegs );
|
||||||
|
// TODO: clamp the inflated polygon, because it is slightly too big:
|
||||||
|
// it was inflated by a value slightly too big to keep rounded corners
|
||||||
|
// ouside the pad area.
|
||||||
}
|
}
|
||||||
|
|
||||||
aCornerBuffer.Append( outline );
|
aCornerBuffer.Append( outline );
|
||||||
|
|
Loading…
Reference in New Issue