## superellipsoid.cc – Construction of a superellipsoid

This code is a variation on the single Voronoi cell example. It applies plane cuts in a similar manner, but weights them in order to create a superellipsoid of the form x4+y4+z4=r4.

The code applies 5000 random plane cuts, and outputs the results in POV-Ray and Gnuplot formats. The POV-Ray header file “superellipsoid.pov” can be used to generate the image above.

## Code listing

``` 1: // Superellipsoid example code
2: //
3: // Author   : Chris H. Rycroft (LBL / UC Berkeley)
4: // Email    : chr@alum.mit.edu
5: // Date     : August 30th 2011
6:
7: #include "voro++.hh"
8: using namespace voro;
9:
10: // This function returns a random floating point number between 0 and 1
11: double rnd() {return double(rand())/RAND_MAX;}
12:
13: int main() {
14:         double x,y,z,rsq,r;
15:         voronoicell v;
16:
17:         // Initialize the Voronoi cell to be a cube of side length 2, centered
18:         // on the origin
19:         v.init(-1,1,-1,1,-1,1);
20:
21:         // Cut the cell by 5000 random planes that are scaled to create a
22:         // superellipsoid
23:         for(int i=0;i<5000;i++) {
24:                 x=2*rnd()-1;
25:                 y=2*rnd()-1;
26:                 z=2*rnd()-1;
27:                 rsq=x*x*x*x+y*y*y*y+z*z*z*z;
28:                 if(rsq>0.01&&rsq<1) {
29:                         r=1/sqrt(sqrt(rsq));
30:                         x*=r;y*=r;z*=r;
31:                         v.plane(x*x*x,y*y*y,z*z*z,x*x*x*x+y*y*y*y+z*z*z*z);
32:                 }
33:         }
34:
35:         // Output the Voronoi cell to a file, in the gnuplot format
36:         v.draw_gnuplot(0,0,0,"superellipsoid.gnu");
37:
38:         // Output the Voronoi cell to a file in POV-Ray formats
39:         v.draw_pov(0,0,0,"superellipsoid_v.pov");
40:         v.draw_pov_mesh(0,0,0,"superellipsoid_m.pov");
41: }
```