I came across a thread Smoothing a 2-D figure. The answers make reference to this paper Chaikin's algorithm for curves
For a given polygon with vertices as P0, P1, ...P(N-1), the corner cutting algorithm will generate 2 new vertices for each line segment defined by P(i) and P(i+1) as
Q(i) = (3/4)P(i) + (1/4)P(i+1)
R(i) = (1/4)P(i) + (3/4)P(i+1)
So, your new polygon will have 2N vertices. You can then apply the corner cutting on the new polygon again and repeatedly until the desired resolution is reached. The result will be a polygon with many vertices but they will look smooth when displayed. It can be proved that the resulting curve produced from this corner cutting approach will converge into a quadratic B-spline curve. The advantage of this approach is that the resulting curve will never over-shoot.
Apply corner cutting once
Apply corner cutting one more time
Also, another example you could view Corner Cutting the Cube which is a variant of Chaikin's corner-cutting algorithm.
It is similar in spirit to a number of subdivision schemes for producing smooth surfaces from an original set of control vertices, including the Doo-Sabin algorithm and the Catmull-Clark(?) algorithm, which pick distances and weights so as to produce B-spline surfaces, and the Loop scheme, which is the grandfather of much of today's work on subdivision surfaces in graphics.
It's an interesting variant because it's singular in some sense: normally corner cutting algorithms cut off a little section 'w' at either end of each edge in the original model (w = 1/4 in the original chaikin algorithm), leaving some of the original edge. This variant results in the original edge vanishing.
To implement either option you might want to look into TP4 : Subdivision curves
goes over how to implement three subdivision schemes for closed curves: Chaikin, corner cutting and four-point.Subdivision curves