void Path::simplify( float32 threshold ) { bool keepflags[size()]; memset( &keepflags[0], 0, sizeof(keepflags) ); keepflags[0] = keepflags[size()-1] = true; simplifySub( 0, size()-1, threshold, &keepflags[0] ); int k=0; for ( int i=0; i<size(); i++ ) { if ( keepflags[i] ) { at(k++) = at(i); } } resize(k); // remove duplicate points (shouldn't be any) std::vector<Vec2> result; Vec2 old = at(0); result.push_back(old); for (int i=1; i<size(); i++) { Vec2 cur = at(i); if (old != cur) { result.push_back(cur); } old = cur; } std::swap(*this, result); }
void Path::simplifySub( int first, int last, float32 threshold, bool* keepflags ) { float32 furthestDist = threshold; int furthestIndex = 0; if ( last - first > 1 ) { Segment s( at(first), at(last) ); for ( int i=first+1; i<last; i++ ) { float32 d = s.distanceTo( at(i) ); if ( d > furthestDist ) { furthestDist = d; furthestIndex = i; } } if ( furthestIndex != 0 ) { keepflags[furthestIndex] = true; simplifySub( first, furthestIndex, threshold, keepflags ); simplifySub( furthestIndex, last, threshold, keepflags ); } } }
void Path::simplify( float32 threshold ) { bool keepflags[size()]; memset( &keepflags[0], 0, sizeof(keepflags) ); keepflags[0] = keepflags[size()-1] = true; simplifySub( 0, size()-1, threshold, &keepflags[0] ); int k=0; for ( unsigned i=0; i<size(); i++ ) { if ( keepflags[i] ) { at(k++) = at(i); } } trim( size() - k ); // remove duplicate points (shouldn't be any) for ( int i=size()-1; i>0; i-- ) { if ( at(i) == at(i-1) ) { erase( i ); } } }