diff --git a/libs/kimath/src/convert_basic_shapes_to_polygon.cpp b/libs/kimath/src/convert_basic_shapes_to_polygon.cpp
index 07722f03a2..17c1d07a82 100644
--- a/libs/kimath/src/convert_basic_shapes_to_polygon.cpp
+++ b/libs/kimath/src/convert_basic_shapes_to_polygon.cpp
@@ -131,6 +131,9 @@ void TransformOvalToPolygon( SHAPE_POLY_SET& aBuffer, const VECTOR2I& aStart, co
     int numSegs = GetArcToSegmentCount( radius, aError, FULL_CIRCLE );
     numSegs = std::max( aMinSegCount, numSegs );
 
+    // Round up to 8 to make segment approximations align properly at 45-degrees
+    numSegs = ( numSegs + 7 ) / 8 * 8;
+
     EDA_ANGLE delta = ANGLE_360 / numSegs;
 
     if( aErrorLoc == ERROR_OUTSIDE )
@@ -168,7 +171,7 @@ void TransformOvalToPolygon( SHAPE_POLY_SET& aBuffer, const VECTOR2I& aStart, co
 
     // add right rounded end:
 
-    for( EDA_ANGLE angle = ANGLE_0; angle < ANGLE_180; angle += delta )
+    for( EDA_ANGLE angle = delta / 2; angle < ANGLE_180; angle += delta )
     {
         corner = VECTOR2I( 0, radius );
         RotatePoint( corner, angle );
@@ -181,7 +184,7 @@ void TransformOvalToPolygon( SHAPE_POLY_SET& aBuffer, const VECTOR2I& aStart, co
     polyshape.Append( corner.x, corner.y );
 
     // add left rounded end:
-    for( EDA_ANGLE angle = ANGLE_0; angle < ANGLE_180; angle += delta )
+    for( EDA_ANGLE angle = delta / 2; angle < ANGLE_180; angle += delta )
     {
         corner = VECTOR2I( 0, -radius );
         RotatePoint( corner, angle );