A spline produces a FUNCTION, SINGLE VALUED. That is, for any x, it is assumed there is a single y. Is that the case for you? NO.
In that case, you need to convert this to a problem that is so. Or you need to use a tool designed to handle non-single valued relationships, so general curvilinear arcs in the plane.
[theta,R] = cart2pol(x,y);
We need to be careful, and use unwrap here. It will resolve jumps in polar angle as the curve wraps around. Otherwise, spline will get confused.
The simple solution, since your function already lives nicely in a non-translated polar coordinate frame around the origin, is to do as I did above, now just use an interpolant. Spline will suffice, or we could be even more lazy and use interp1.
r_of_theta = spline(theta,R);
th_interp = linspace(min(theta),max(theta),100);
[x_interp, y_interp] = pol2cart(th_interp,fnval(r_of_theta,th_interp));
plot(x,y,'ro',x_interp,y_interp,'b-')
Remember to use unwrap!
This works nicely enough, at least for this simple problem. For more complicated problems, you may want to try my interparc code, as found on the file exchange. It could handle more complicated problems, even ones where the curve crosses itself. Find it here:
xyint = interparc(100,x,y);
plot(x,y,'ro',xyint(:,1),xyint(:,2),'b-')
It produced a subtly different curve shape, because the spline it uses is a subtly different spline model. But the nice thing about interparc is it does not ask you to do anything special like understand a conversion to polar coordinates, or to understand why unwrap was necessary in my first fit.