This post is about how one can map a sphere to a “rounded”, “smoothed” or as I prefer to call it a “beveled” cube. We will as a bonus also see how to make a inverted cube, in a very simple way using MATLAB.

The reason for doing this is I wanted to create an ordinary cube for an assignment in a visualization course. By doing this simple mapping I’m about to describe, we can actually get a very nice looking smoothed cube if we use a sphere.

In MATLAB we have the function **Sphere(n)** which creates coordinates for a sphere, given a resolution **n**, so I figured if I could map a sphere into a cube, hmm…. The reason was, I didn’t want to manually enter the coordinates for the cube, that’s too much work. I have done that in OpenGL before, I have had enough of that (hehe). Additionally if I could get a **beveled** cube, that would be even better.

The sphere is created using:

[x, y, z] = sphere(n); h = surf(x, y, z)

We can then later modify the data using **set** in the following way:

ex = 2^(-5*i/50); set(h, 'xdata', abs(x).^ex.*sign(x)/2,... 'ydata', abs(y).^ex.*sign(y)/2,... 'zdata', abs(z).^ex.*sign(z)/2)

In the animation below, I used \(i\in[-15,50] \). The **sign **is telling the mapping which direction of which axis the coordinates are to be stretched. In the x axis direction, we get two directions \(\pm\)1, in y we get two and in z we get two. **abs** is balancing the stretching, if we don’t have the abs, we would not get a nice mapping.

Consider x=linspace(0,1,500); plot(x, x.^20)

Since \(x\in[0,1]\) the mapping will stay in\([0,1]\), the same goes for my mapping and this was my first idea. By simply changing the exponent, we would get different shapes of the sphere. I had to take care of the directions using **sign** and **abs** otherwise I would get a folded sphere.

The variable that controls the shape is i:

Inverted i = -15

Octahedron i = -10

Sphere i = 0

Beveled Cube i = 50

The animation shown below is stepping through these values of i with increment 1. The animation is wide, so the sphere unfortunately looks like an ellipsoid.

If we continue to increase **i**, choose **n** to be low enough, we get an ordinary cube. Anyway, comment if you like it ;-)