Supershapes (Superformula)Written by Paul BourkeMarch 2002
Based upon equations by Johan Gielis
See also Superellipse and Supershape in 3D |
![]() |
The supershape equation is an extension of the both the equation of the sphere and ellipse
and even the superellipse given here. The general formula for the supershape is given below.

Where r and phi are polar coordinates (radius,angle). n1, n2, n3, and m are real numbers. a and b are real numbers excluding zero.
|
m = 0 This results in circles, namely r = 1 |
|
|
n1 = n2 = n3 = 1 Increasing m adds rotational symmetry to the shape. This is generally the case for other values of the n parameters. The curves are repeated in sections of the circle of angle 2pi/m, this is apparent in most of the following examples for integer values of m. |
m=1
m=2![]() m=3
m=4![]() m=5
m=6![]() |
|
n1 = n2 = n3 = 0.3 As the n's are kept equal but reduced the form becomes increasingly pinched. |
m=1
m=2![]() m=3
m=4![]() m=5
m=6![]() |
| If n1 is slightly larger than n2 and n3 then bloated forms result. The examples on the right have n1 = 40 and n2 = n3 = 10. |
m=1
m=2![]() m=3
m=4![]() m=5
m=6![]() |
| Polygonal shapes are achieved with very large values of n1 and large but equal values for n2 and n3. |
m=3
m=4![]() m=5
m=6![]() |
| Asymmetric forms can be created by using different values for the n's. The following example have n1 = 60, n2 = 55 and n3 = 30. |
m=3
m=4![]() m=5
m=6![]() |
| For non integral values of m the form is still closed for rational values. The following are example with n1 = n2 = n3 = 0.3. The angle phi needs to extend from 0 to 12 pi. |
m=1/6
m=7/6![]() m=13/6
m=19/6![]() |
| Smooth starfish shapes result from smaller values of n1 than the n2 and n3. The following examples have m=5 and n2 = n3 = 1.7. |
n1=0.50
n1=0.20![]() n1=0.10
n1=0.02![]() |
Other examples
Given a value of phi the following function evaluates the supershape function and calculates (x,y).
void Eval(double m,double n1,double n2,double n3,double phi,double *x,double *y)
{
double r;
double t1,t2;
double a=1,b=1;
t1 = cos(m * phi / 4) / a;
t1 = ABS(t1);
t1 = pow(t1,n2);
t2 = sin(m * phi / 4) / b;
t2 = ABS(t2);
t2 = pow(t2,n3);
r = pow(t1+t2,1/n1);
if (ABS(r) == 0) {
*x = 0;
*y = 0;
} else {
r = 1 / r;
*x = r * cos(phi);
*y = r * sin(phi);
}
}
So it might be called as follows
for (i=0;i<=NP;i++) {
phi = i * TWOPI / NP;
Eval(m,n1,n2,n3,phi,&x,&y);
--- do something with the point x,y ---
}