Fixes to Clipper fixes.

Clipper was only broken when rounding down, not when rounding up.
This commit is contained in:
Jeff Young 2020-11-04 15:25:44 +00:00
parent 8c782506b9
commit a730478d5d
1 changed files with 11 additions and 5 deletions

View File

@ -5444,11 +5444,12 @@ void ClipperOffset::DoRound( int j, int k )
{
double a = std::atan2( m_sinA,
m_normals[k].X * m_normals[j].X + m_normals[k].Y * m_normals[j].Y );
int steps = std::max( (int) Round( m_StepsPerRad * std::fabs( a ) ), 1 );
double steps = m_StepsPerRad * std::fabs( a );
int takenSteps = std::max((int) std::floor( steps ), 1 );
double X = m_normals[k].X, Y = m_normals[k].Y, X2;
for( int i = 0; i < steps; ++i )
for( int i = 0; i < takenSteps; ++i )
{
m_destPoly.push_back( IntPoint(
Round( m_srcPoly[j].X + X * m_delta ),
@ -5458,9 +5459,14 @@ void ClipperOffset::DoRound( int j, int k )
Y = X2 * m_sin + Y * m_cos;
}
m_destPoly.push_back( IntPoint(
Round( m_srcPoly[j].X + X * m_delta ),
Round( m_srcPoly[j].Y + Y * m_delta ) ) );
// A 10% error on chord length won't make much error difference, and it keeps us
// from generating geometrically noisy solutions.
if( steps > takenSteps + 0.1 )
{
m_destPoly.push_back( IntPoint(
Round( m_srcPoly[j].X + X * m_delta ),
Round( m_srcPoly[j].Y + Y * m_delta ) ) );
}
m_destPoly.push_back( IntPoint(
Round( m_srcPoly[j].X + m_normals[j].X * m_delta ),