PNS mitering: construct arcs from start, end, angle.

Previously, arc endpoint and expected miter endpoint could differ,
causing very small loops later on.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/16360
This commit is contained in:
Alex Shvartzkop 2023-12-17 05:47:07 +03:00
parent 3b26f96fe4
commit c5ac2337e4
1 changed files with 10 additions and 6 deletions

View File

@ -255,6 +255,8 @@ SHAPE_LINE_CHAIN MEANDER_SHAPE::makeMiterShape( const VECTOR2D& aP, const VECTOR
VECTOR2D dir_u( aDir ); VECTOR2D dir_u( aDir );
VECTOR2D dir_v( aDir.Perpendicular() ); VECTOR2D dir_v( aDir.Perpendicular() );
VECTOR2D endPoint = aP + dir_u + dir_v * ( aSide ? -1.0 : 1.0 );
VECTOR2D p = aP; VECTOR2D p = aP;
lc.Append( ( int ) p.x, ( int ) p.y ); lc.Append( ( int ) p.x, ( int ) p.y );
@ -263,9 +265,11 @@ SHAPE_LINE_CHAIN MEANDER_SHAPE::makeMiterShape( const VECTOR2D& aP, const VECTOR
{ {
case MEANDER_STYLE_ROUND: case MEANDER_STYLE_ROUND:
{ {
VECTOR2D center = aP + dir_v * ( aSide ? -1.0 : 1.0 ); VECTOR2I arcEnd( (int) endPoint.x, (int) endPoint.y );
lc.Append( SHAPE_ARC( center, aP, ( aSide ? -ANGLE_90 : ANGLE_90 ) ) ); SHAPE_ARC arc;
arc.ConstructFromStartEndAngle( aP, arcEnd, ( aSide ? -ANGLE_90 : ANGLE_90 ) );
lc.Append( arc );
break; break;
} }
@ -284,6 +288,9 @@ SHAPE_LINE_CHAIN MEANDER_SHAPE::makeMiterShape( const VECTOR2D& aP, const VECTOR
lc.Append( ( int ) p.x, ( int ) p.y ); lc.Append( ( int ) p.x, ( int ) p.y );
p = aP + dir_u + (dir_v + dir_cv) * ( aSide ? -1.0 : 1.0 ); p = aP + dir_u + (dir_v + dir_cv) * ( aSide ? -1.0 : 1.0 );
lc.Append( ( int ) p.x, ( int ) p.y ); lc.Append( ( int ) p.x, ( int ) p.y );
p = endPoint;
lc.Append( (int) p.x, (int) p.y );
break; break;
} }
@ -291,9 +298,6 @@ SHAPE_LINE_CHAIN MEANDER_SHAPE::makeMiterShape( const VECTOR2D& aP, const VECTOR
break; break;
} }
p = aP + dir_u + dir_v * ( aSide ? -1.0 : 1.0 );
lc.Append( ( int ) p.x, ( int ) p.y );
return lc; return lc;
} }