toxi::geom::Polygon2D * toxi::geom::Polygon2D::smooth( const float & amount, const float & baseWeight ) { Vec2D centroid = getCentroid(); int num = vertices.size(); std::vector<Vec2D> filtered; for (int i = 0, j = num - 1, k = 1; i < num; i++) { Vec2D a = vertices.at(i); Vec2D dir = vertices.at(j).sub( a ).addSelf( vertices.at(k).sub( a )) .addSelf(a.sub( centroid).scaleSelf(baseWeight)); filtered.push_back(a.add(dir.scaleSelf(amount))); j++; if (j == num) { j = 0; } k++; if (k == num) { k = 0; } } vertices.clear(); for( auto it = filtered.begin(); it != filtered.end(); ++it ) { vertices.push_back( *it ); } return this; }