Fix minor issue in TransformCircleToPolygon() when aError is set to a large value.
pcb_painter.cpp: add (but not activate) compil option to show the conversion of SHAPE_ARC::ConvertToPolyline as segments, for debug purposes.
This commit is contained in:
parent
9a865b1989
commit
fa49b54f93
|
@ -55,7 +55,10 @@ void TransformCircleToPolygon( SHAPE_LINE_CHAIN& aCornerBuffer, wxPoint aCenter,
|
||||||
int radius = aRadius;
|
int radius = aRadius;
|
||||||
|
|
||||||
if( aErrorLoc == ERROR_OUTSIDE )
|
if( aErrorLoc == ERROR_OUTSIDE )
|
||||||
radius += GetCircleToPolyCorrection( aError );
|
{
|
||||||
|
int actual_error = GetCircleToSegmentError( radius, numSegs );
|
||||||
|
radius += GetCircleToPolyCorrection( actual_error );
|
||||||
|
}
|
||||||
|
|
||||||
for( int angle = 0; angle < 3600; angle += delta )
|
for( int angle = 0; angle < 3600; angle += delta )
|
||||||
{
|
{
|
||||||
|
|
|
@ -66,12 +66,14 @@ int GetArcToSegmentCount( int aRadius, int aErrorMax, double aArcAngleDegree )
|
||||||
|
|
||||||
int GetCircleToSegmentError( int aRadius, int aSegCount )
|
int GetCircleToSegmentError( int aRadius, int aSegCount )
|
||||||
{
|
{
|
||||||
// avoid divide-by-zero, and the minimal seg count used here = 2
|
// This is similar to the "inverse" of GetArcToSegmentCount()
|
||||||
// (giving error = aRadius)
|
|
||||||
aSegCount = std::max( 2, aSegCount );
|
// The minimal seg count is 2, giving error = aRadius
|
||||||
|
if( aSegCount <= 2 )
|
||||||
|
return aRadius;
|
||||||
|
|
||||||
double alpha = M_PI / aSegCount;
|
double alpha = M_PI / aSegCount;
|
||||||
double error = aRadius * ( 1.0 - cos( alpha) );
|
int error = KiROUND( aRadius * ( 1.0 - cos( alpha) ) );
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
|
@ -713,9 +713,28 @@ void PCB_PAINTER::draw( const PCB_ARC* aArc, int aLayer )
|
||||||
m_gal->SetLineWidth( m_pcbSettings.m_outlineWidth );
|
m_gal->SetLineWidth( m_pcbSettings.m_outlineWidth );
|
||||||
m_gal->SetIsFill( false );
|
m_gal->SetIsFill( false );
|
||||||
m_gal->SetIsStroke( true );
|
m_gal->SetIsStroke( true );
|
||||||
m_gal->SetStrokeColor( color );
|
m_gal->SetStrokeColor( COLOR4D( 0, 0, 1.0, 1.0 ) );
|
||||||
m_gal->DrawPolygon( cornerBuffer );
|
m_gal->DrawPolygon( cornerBuffer );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Debug only: enable this code only to test the SHAPE_ARC::ConvertToPolyline function
|
||||||
|
// and display the polyline created by it.
|
||||||
|
#if 0
|
||||||
|
int error_value2 = aArc->GetBoard()->GetDesignSettings().m_MaxError;
|
||||||
|
SHAPE_ARC arc( aArc->GetCenter(), aArc->GetStart(),
|
||||||
|
aArc->GetAngle() / 10.0, aArc->GetWidth() );
|
||||||
|
SHAPE_LINE_CHAIN arcSpine = arc.ConvertToPolyline( error_value2 );
|
||||||
|
m_gal->SetLineWidth( m_pcbSettings.m_outlineWidth );
|
||||||
|
m_gal->SetIsFill( false );
|
||||||
|
m_gal->SetIsStroke( true );
|
||||||
|
m_gal->SetStrokeColor( COLOR4D( 0.3, 0.2, 0.5, 1.0 ) );
|
||||||
|
|
||||||
|
for( int idx = 1; idx < arcSpine.PointCount(); idx++ )
|
||||||
|
{
|
||||||
|
m_gal->DrawSegment( arcSpine.CPoint( idx-1 ), arcSpine.CPoint( idx ),
|
||||||
|
aArc->GetWidth() );
|
||||||
|
};
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue