I'm trying to reach an algorithm to determine if a given a general B-spline/Bezier surface (could be rational) is a surface of revolution around the Z axis.
I tried to solve it analytically and derive the curve in order to get the curvature, but I don't think this is right approach - since I'm looking for an algorithmical solution.
I have found ways to solve this problem by starting from an implicit Cartesian function but that is not always the case for every existing B-spline.
If anyone has any ideas or directions it would be appreciated greatly.
If there are no self-intersections you can use subdivision to determine whether a point $P$ is on the surface and if so the patch and parameter values which correspond. This gives two approaches based on comparing a rotated version of the surface to the unrotated version.
Given the patch and parameter values you can then use the algebraic definition of the patch to determine the derivatives. Since each patch is locally polynomial it suffices to test one representative point per patch to high enough derivatives. For this approach, I would rotate by half a rotation to keep the arithmetic exact.
If the derivatives seem too complex or numerically unstable you can instead use a probabilistic approach: rotate the surface by a random amount around the purported axis and simply test one point per patch to see whether it's on the unrotated surface. The probability of a false positive from one rotation is almost negligible: if it passes three or four rotations then you can be extremely confident.