diff --git a/common/geometry/geometry_utils.cpp b/common/geometry/geometry_utils.cpp index a3c6296ec6..853d2be2d2 100644 --- a/common/geometry/geometry_utils.cpp +++ b/common/geometry/geometry_utils.cpp @@ -31,6 +31,24 @@ #include #include +static const double correction_factor[58] = +{ + 1.1547005383792515, 1.1099162641747424, 1.0823922002923940, 1.0641777724759121, + 1.0514622242382672, 1.0422171162264056, 1.0352761804100830, 1.0299278309497275, + 1.0257168632725540, 1.0223405948650293, 1.0195911582083184, 1.0173218375167883, + 1.0154266118857451, 1.0138272827109369, 1.0124651257880029, 1.0112953333155177, + 1.0102832265380361, 1.0094016211705981, 1.0086289605801528, 1.0079479708092973, + 1.0073446768656829, 1.0068076733095861, 1.0063275765801780, 1.0058966090203618, + 1.0055082795635164, 1.0051571362062028, 1.0048385723763114, 1.0045486741757732, + 1.0042840989156745, 1.0040419778191385, 1.0038198375433474, 1.0036155364690280, + 1.0034272126621453, 1.0032532411243213, 1.0030921984828256, 1.0029428336753463, + 1.0028040434931396, 1.0026748520830480, 1.0025543936921142, 1.0024418980811722, + 1.0023366781455456, 1.0022381193690537, 1.0021456708072995, 1.0020588373518127, + 1.0019771730711422, 1.0019002754608142, 1.0018277804630289, 1.0017593581404958, + 1.0016947089079804, 1.0016335602408475, 1.0015756637927993, 1.0015207928656586, + 1.0014687401828848, 1.0014193159258358, 1.0013723459979209, 1.0013276704868976, + 1.0012851422998732, 1.0012446259491854 +}; int GetArcToSegmentCount( int aRadius, int aErrorMax, double aArcAngleDegree ) { @@ -58,8 +76,11 @@ double GetCircletoPolyCorrectionFactor( int aSegCountforCircle ) * therfore, to move the middle of the segment to the circle (distance = radius) * the correctionFactor is 1 /cos( PI/aSegCountforCircle ) */ - double correctionFactor = 1.0 / cos( M_PI / aSegCountforCircle ); + if( aSegCountforCircle < 6 ) + aSegCountforCircle = 6; + if( 1 || aSegCountforCircle > 64 ) + return 1.0 / cos( M_PI / aSegCountforCircle ); - return correctionFactor; + return correction_factor[ aSegCountforCircle - 6 ]; } diff --git a/pcbnew/plot_board_layers.cpp b/pcbnew/plot_board_layers.cpp index 76f79dde60..41041b8f97 100644 --- a/pcbnew/plot_board_layers.cpp +++ b/pcbnew/plot_board_layers.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -790,7 +791,7 @@ void PlotSolderMaskLayer( BOARD *aBoard, PLOTTER* aPlotter, * due to the segment approx ( 1 /cos( PI/circleToSegmentsCount ) */ int circleToSegmentsCount = 32; - double correction = 1.0 / cos( M_PI / circleToSegmentsCount ); + double correction = GetCircletoPolyCorrectionFactor( circleToSegmentsCount ); // Plot pads for( MODULE* module = aBoard->m_Modules; module; module = module->Next() )