latest newsbuy art
listen; there's a hell of a good universe next door: let's go.e.e. cummingsgo theremore quotes
very clickable
music + math
Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
WELCOME TO THE 5TH DIMENSION | This isn't meant to be understood — it's meant to be enjoyed.
Love music and science? Explore my collaboration with Max Cooper where we tell the story of infinities and animate the digits of π. Both tracks appear on Max's Yearning for the Infinite album.
Another collaboration with Max!

Max Cooper's Ascent — Making of the Music video

Enter the 5th dimension

Ascent answers the question: if you were living in a 5-dimensional room and projected digits of `\pi` onto its walls, what would you see?

1 · What am I watching?

The scene takes place on a 5-dimensional stage, which is projected onto two dimensions (without perspective). Over time, cubes appear on the stage. Throughout the video, both the camera and each cube can rotate independently.

For some cubes, area maps of the digits of `\pi` or its approximations (e.g. 22/7) are projected onto some of the faces of the cube.

2 · How was the video made?

The video was created with a custom animation system that I wrote specifically for Ascent.

The animation is structured around a series of keyframes. Each keyframe (there are about 170 keyframes) is defined using a custom scripting language with which I can add elements to the scene, apply a rotation, zoom and scale, project area maps, and so on.

The keyframes were created manually and the motion was designed to match the dynamics and movement of the music. There is no automated synchronization.

For example, the first 8 seconds of the video is created from these keyframe definitions.

# parameter definitions
...
param = fs 24
# angle in units of 2π (–17.6 deg)
param = astepa2 d-0.048978
...
# add a cube with size 0 and edge fade 1
frame = 1.a; cube_add(c0,0,1)
# rotate the scene in yw plane by 'astepa2' amount (defined elsewhere)
frame = 1.a0; a yw astepa2
# previous keyframe parameters will be interpolated over 
# 2fs = 48 frames (2 seconds at 24 fps) to values of the next keyframe
# i.e. cube c0 edge fade in xy plane will linearly decrease from 1 to 0
frame = 1.a1; n 2fs; c c0 f [xy] 0
# cube c0 x size grows to 0.05
frame = 1.a2; n 2fs; c c0 s [x]  0.05  
# cube c0 x size grows to 0.10
frame = 1.a3; n 2fs; c c0 s [x]  0.10  
# cube c0 x size grows to 0.15
frame = 1.a4; n 2fs; c c0 s [x]  0.15  
...

Here are the first four keyframes — there are 2fs = 48 interpolated frames between each of these keyframes.

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #1 0:00:00 | 1/48 1.a0–1.a1
1.a0
a yw astepa2
1.a1
n 2fs
c c0 f [xy] 0

view
x
y
z
w
v
zoom
1
1
1
1
1
y
343
C0
x
y
z
w
v
Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #49 0:02:00 | 1/48 1.a1–1.a2
1.a1
n 2fs
c c0 f [xy] 0
1.a2
n 2fs
c c0 s [x] 0.05

view
x
y
z
w
v
zoom
1
1
1
1
1
y
343
C0
x
y
z
w
v
edge
1.00
1.00
0.00
0.00
0.00
Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #97 0:04:00 | 1/48 1.a2–1.a3
1.a2
n 2fs
c c0 s [x] 0.05
1.a3
n 2fs
c c0 s [x] 0.10

view
x
y
z
w
v
zoom
1
1
1
1
1
y
343
C0
x
y
z
w
v
size
0.05
edge
1.00
1.00
0.00
0.00
0.00
Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #145 0:06:00 | 1.a3–1.a4
1.a3
n 2fs
c c0 s [x] 0.10
1.a4
n 2fs
c c0 s [x] 0.15

view
x
y
z
w
v
zoom
1
1
1
1
1
y
343
C0
x
y
z
w
v
size
0.10
edge
1.00
1.00
0.00
0.00
0.00

For all the keyframes, see the keyframe section.

3 · The 5-dimensional cube

The 5-cube (`n=5`) has `2^5=32` vertices (0-cubes, corners), `2^4 \times 5 = 80` edges (1-cubes, lines), `2^3 \times 10 = 80` faces (2-cubes, squares), `2^2 \times 10 = 40` cubic cells (3-cubes) and `2^1 \times 5 = 10` tesseract cells (4-cubes).

In general, the number of `m`-cubes in an `n`-cube is $$E_{m,n} = 2^{n-m} \binom{n}m $$

4 · How to interpret a frame

Here's a sample frame from the video — this is frame 830/8520.

It shows a pair of three dimensional cubes, each with lines growing from their vertex towards the other cube.

But what you're actually seeing is a single 5 dimensional cube, but with some dimensions collapsed and edges along other dimensions not fully drawn.

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #830 0:34:13 | 38/48 1.d1( 37/ 47)1.d2
1.d1
n 2fs
a xw astepb4
c c0 f [w] 0.9
c c0 s [w] 0.715
c c0 s [xyz] 0.15
rots
rxy2
!ryz2
1.d2
n 2fs
a xw astepb4
c c0 f [w] 0.8
c c0 s [w] 0.615
c c0 s [xyz] 0.15
rots
rxy2
!ryz2

view
x
y
z
w
v
zoom
1
1
1
1
1
x
276
4
341
3
y
325
345
3
C0
x
y
z
w
v
size
0.15
0.15
0.15
0.64
edge
1.00
1.00
1.00
0.18
0.00

4.1 · How to interpret angles

The view table shows the camera zoom and angle (in degrees). In 2-dimensional space there is one direction of rotation — in the `xy` plane (axis of rotation is `z`). In 3-dimensional space, there are three directions of rotation — in the `xy`, `yz` and `xz` planes. Once we reach 5 dimensions there are 10 directions of rotation (`xy`, `yz`, `xw`, `xv`, `yz`, `yw`, `yv`, `zw, `zv, `wv`).

In this frame, 7 of these angles are non-zero. It's essentially impossible to look at these angles and be able to predict how the rotated cube will look. To explore rotations in 4-dimensional space, check out Bartosz Chechanowski's excellent article on Tesseract building and rotation.

Each cube has its own angles. In this frame, the cube's angles are all zero, meaning that the rotation in the scene is due entirely to the rotation of the camera. Once more cubes are introduced, each can rotate independently to make the animation more dynamic.

4.2 · How to interpret cube size and edge length

There is one 5-dimensional cube in this scene (C0) and its size, edge length and rotation is presented in another table.

The cube has 5 size values, which correspond how far the cube extends into each of the dimensions. If the size `s_d` is zero then dimension `d` is collapsed. For example, if `s_w = s_v = 0` and `s_x = s_y = s_z = 1` then we just have a regular 3-cube.

In this frame, the cube has grown quite a bit in the 4th dimension `s_w = 0.64` but not as much in the first three dimensions `s_x = s_y = s_z = 0.15`. The fifth dimension is collapsed `s_v = 0`.

The cube's edge values `e_d` indicate how much of the edge along that dimension is drawn. If `e_d = 1` then the edge spans the full distance between vertices. For fractional values, the edge will extend only partially from the corner along the distance.

In this frame, the edges in the first three dimensions are fully drawn but along `w` the edge value is `e_w = 0.18` — the middle 82% of the edge is not drawn.

The combination of size and edge values can highlight lower-dimensional components of the cube — for example, by not drawing edges along certain dimension.

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #1050 0:43:17 | 18/48 1.d6( 17/ 47)1.d7
1.d6
n 2fs
a xw astepb4
c c0 f [w] 0.2
c c0 s [w] 0.215
rots
rxy2
!ryz2
1.d7
n 2fs
a xw astepb4
c c0 f [w] 0.0
c c0 s [w] 0.150
rots
rxy2
!ryz2

view
x
y
z
w
v
zoom
1
1
1
1
1
x
173
17
289
11
y
325
351
11
C0
x
y
z
w
v
size
0.15
0.15
0.15
0.19
edge
1.00
1.00
1.00
0.87
0.00

By the time we get to frame 1050, the edges along the `w` dimension are almost completely drawn (`e_w = 0.87`). But also the size of the cube along `w` has shrunk from `s_w = 0.64` to 0.19, which is very close to the size of the cube in the other dimensions (`s_{xyz} = 0.15`). This has the effect of bringing the 3-cube cells closer together.

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #1400 0:58:07 | 8/48 1.e6( 7/ 47)1.e7
1.e6
n 2fs
c c0 f [v] 0.80
c c0 s [xyzwv] 0.250
rots
rxy2
ryz2
1.e7
n 2fs
c c0 f [v] 0.70
c c0 s [xyzwv] 0.275
rots
rxy2
ryz2

view
x
y
z
w
v
zoom
1.30
1.30
1.30
1.30
1.30
x
357
39
293
25
y
199
2
24
C0
x
y
z
w
v
size
0.25
0.25
0.25
0.25
0.25
edge
1.00
1.00
1.00
1.00
0.21

Shortly after, the cube's `v` dimension has grown (now the size along all dimensions is the same, `s_{xyzwv} = 0.25`) and edges are starting to form along the `v` dimension (`e_v` = 0.21).

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #1726 1:11:21 | 46/48 1.f3( 45/ 47)1.f4
1.f3
n 2fs
c c0 f [v] 0.10
rots
rxy2
ryz2
1.f4
n 2fs
c c0 f [v] 0.00
rots
rxy2
ryz2

view
x
y
z
w
v
zoom
1.30
1.30
1.30
1.30
1.30
x
204
57
302
36
y
79
11
35
C0
x
y
z
w
v
size
0.33
0.33
0.33
0.33
0.33
edge
1.00
1.00
1.00
1.00
1.00

And, finally at frame 1726, we have our first complete (`s_{xyzwv} = e_{xyzwv} = 1`) 5-dimensional cube.

You now have everything that you need to interpret the full video. So, let's gets started on the walkthrough.

5 · Video Walkthrough

The walkthrough takes you through interesting landmarks in the video. It shows the frame, the keyframe before and after the frame (the frame is interpolated between these) and the parameters (size, edge, rotation, etc) of each object in the frame.

For a full list of keyframes, see the keyframe section.

5.1 · Dimensions grow

Initially the scene is blank — we have one cube but its size in all dimensions is zero.

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #1 0:00:00 | 1/8520 1/48 1.a0( 0/ 47)1.a1
1.a0
a yw astepa2
1.a1
n 2fs
c c0 f [xy] 0

view
x
y
z
w
v
zoom
1
1
1
1
1
y
343
C0
x
y
z
w
v

Slowly, the cube's size in the `x` dimension grows, now at `s_x = 0.14`. Edge values are `e_x = e_y = 1` meaning that the edge is completely drawn between vertices. The edge appears to grow because it's the cube that is growing (`s_x` is increasing).

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #180 0:07:11 | 36/48 1.a3( 35/ 47)1.a4
1.a3
n 2fs
c c0 s [x] 0.10
1.a4
n 2fs
c c0 s [x] 0.15

view
x
y
z
w
v
zoom
1
1
1
1
1
y
343
C0
x
y
z
w
v
size
0.14
edge
1.00
1.00
0.00
0.00
0.00

The cube has grown to `s_x = 0.15` and is now growing in the `y` dimension (`s_y = 0.07`). Simultaneously, the scene is rotating in the `xy` plane. Note that there is an initial non-zero `yw` plane angle — this sets us up for an interesting point of view for when we start seeing the `w` dimension.

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #300 0:12:11 | 36/72 1.a5( 35/ 71)1.a6
1.a5
n 3fs
c c0 s [y] 0.05
rxy3
1.a6
n 3fs
c c0 s [y] 0.10
rxy3

view
x
y
z
w
v
zoom
1
1
1
1
1
x
338
y
343
C0
x
y
z
w
v
size
0.15
0.07
edge
1.00
1.00
0.00
0.00
0.00

Next, the `z` diemension grows and we're finally starting to see a 3-cube form. We perceive two 2-cubes (squares) splitting up, with edges forming between them (`e_z = 0.85`). Of course, what's actually happening is that the 3-cube's `z` dimension is growing.

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #600 0:24:23 | 24/48 1.b4( 23/ 47)1.b5
1.b4
n 2fs
c c0 f [z] 0.20
c c0 s [xy] 0.15
c c0 s [z] 0.130
ryz6
1.b5
n 2fs
c c0 f [z] 0.10
c c0 s [xy] 0.15
c c0 s [z] 0.140
ryz6

view
x
y
z
w
v
zoom
1
1
1
1
1
x
315
y
334
343
C0
x
y
z
w
v
size
0.15
0.15
0.13
edge
1.00
1.00
0.85
0.00
0.00

Around frame 675 is the first time we get a hint of higher dimensions. By now, the cube has grown equally in the first three dimensions (`s_{xyz} = 0.15`) and edges along these dimensions are fully formed (`e_{xyz} = 1`).

The cube now appears to be splitting into two copies because its `w` dimension is growing (`s_w = 0.12`). But, because no edges are drawn along this dimension (`e_w = 0`), the cubes don't appear to be connected in any way. Thus, we still really don't know how many dimensions this scene has — the effect is the same as if we were looking at a 3-dimensional scene in which a 3-cube splits into two.

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #675 0:28:02 | 3/24 1.b6( 2/ 23)1.c1
1.b6
n 2fs
c c0 f [z] 0.00
c c0 s [xy] 0.15
c c0 s [z] 0.150
ryz6
1.c1
n 1fs
c c0 s [w] 0.815
c c0 s [xyz] 0.15

view
x
y
z
w
v
zoom
1
1
1
1
1
x
315
y
325
343
C0
x
y
z
w
v
size
0.15
0.15
0.15
0.12
edge
1.00
1.00
1.00
0.00
0.00

At frame 730, it looks like we have a pretty symmetric stacking of two 3-cubes but we're actually looking at a 4-cube without `w` edges and rotated in the `xy`, `yz` and `yw` planes to achieve this effect.

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #730 0:30:09 | 34/48 1.c1( 33/ 47)1.c2
1.c1
n 1fs
c c0 s [w] 0.815
c c0 s [xyz] 0.15
1.c2
n 2fs

view
x
y
z
w
v
zoom
1
1
1
1
1
x
315
y
325
343
C0
x
y
z
w
v
size
0.15
0.15
0.15
0.81
edge
1.00
1.00
1.00
0.00
0.00

The scene now starts to rotate in a more complex fashion and edges along the `w` dimension begin to grow (`e_w = 0.07`) as this dimension starts to shrink (`e_w=0.74`) to the same size as (`e_{xyz} = 0.15`).

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #780 0:32:11 | 36/48 1.c2( 35/ 47)1.d1
1.c2
n 2fs
1.d1
n 2fs
a xw astepb4
c c0 f [w] 0.9
c c0 s [w] 0.715
c c0 s [xyz] 0.15
rots
rxy2
!ryz2

view
x
y
z
w
v
zoom
1
1
1
1
1
x
299
1
352
1
y
325
344
1
C0
x
y
z
w
v
size
0.15
0.15
0.15
0.74
edge
1.00
1.00
1.00
0.07
0.00

This process continues and by frame 1500, the cube's size in all dimenions is the same (`e_{xyzwv} = 0.31`) and only the edges along `v` still need to grow to completion (right now, they're about 50% extended).

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #1500 1:02:11 | 12/48 1.e8( 11/ 47)1.e9
1.e8
n 2fs
c c0 f [v] 0.50
c c0 s [xyzwv] 0.300
rots
rxy2
ryz2
1.e9
n 2fs
c c0 f [v] 0.40
c c0 s [xyzwv] 0.325
rots
rxy2
ryz2

view
x
y
z
w
v
zoom
1.30
1.30
1.30
1.30
1.30
x
310
45
295
28
y
163
4
28
C0
x
y
z
w
v
size
0.31
0.31
0.31
0.31
0.31
edge
1.00
1.00
1.00
1.00
0.52

By now, the entire scene has zoomed in a little bit — the camera zoom has increased from 1 to 1.3.

5.2 · Edges grow

Finally, more interesting things begin to happen. Four new cubes are introduced (C1, C2, C3, C4). Initially, these have the same size in each dimension as our original cube C0, but their `e_{xyzwv} = 0`, so no edges are drawn.

Then, the edges for C1 start to grow. Initially, only in the `xy` plane (`e_{xy} = 0.36)`. These edges are drawn with a thicker line and a difference blend, so what you're seeing (in the black and white version) is something that looks like a tube growing from the vertices.

The purpose of this scene is to draw attention to the faces in the `xy` plane.

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #1825 1:16:00 | 1/48 2.b( 0/ 47)2.c
2.b
n 2fs
c c1 f [xy] s2f
rotthis2
2.c
n 2fs
c c1 f [xy] s2f
rotthis2

view
x
y
z
w
v
zoom
1.30
1.30
1.30
1.30
1.30
x
158
57
305
36
y
43
11
36
C0
x
y
z
w
v
size
0.33
0.33
0.33
0.33
0.33
edge
1.00
1.00
1.00
1.00
1.00
C1
x
y
z
w
v
size
0.33
0.33
0.33
0.33
0.33
edge
0.36
0.36
0.00
0.00
0.00
C2
x
y
z
w
v
size
0.33
0.33
0.33
0.33
0.33
C3
x
y
z
w
v
size
0.33
0.33
0.33
0.33
0.33
C4
x
y
z
w
v
size
0.33
0.33
0.33
0.33
0.33

As the edges in C1 continue to grow, the edges in C2 in the `xz` plane start to grow (`e_{xz} = 0.46`).

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #2100 1:27:11 | 36/48 2.g( 35/ 47)2.h
2.g
n 2fs
c c1 f [xy] s2f
c c2 f [xz] s2f
rotthis2
2.h
n 2fs
c c1 f [xy] s2f
c c2 f [xz] s2f
rotthis2

view
x
y
z
w
v
zoom
1.30
1.30
1.30
1.30
1.30
x
29
57
311
36
y
302
11
41
C0
x
y
z
w
v
size
0.33
0.33
0.33
0.33
0.33
edge
1.00
1.00
1.00
1.00
1.00
C1
x
y
z
w
v
size
0.33
0.33
0.33
0.33
0.33
edge
0.82
0.82
0.00
0.00
0.00
C2
x
y
z
w
v
size
0.33
0.33
0.33
0.33
0.33
edge
0.46
0.00
0.46
0.00
0.00
C3
x
y
z
w
v
size
0.33
0.33
0.33
0.33
0.33
C4
x
y
z
w
v
size
0.33
0.33
0.33
0.33
0.33

Finally, each of the C1–C4 cubes has grown its edges fully: C1 in `xy`, C2 in `xz`, C3 in `xw` and C4 in `xv`.

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #2592 1:47:23 | 48/48 2.q( 47/ 47)2.r
2.q
n 2fs
c c1 f [xy] s2f
c c2 f [xz] s2f
c c3 f [xw] s2f
c c4 f [xv] s2f
rotthis2
2.r
n 2fs
c c1 f [xy] 0
c c2 f [xz] 0
c c3 f [xw] 0
c c4 f [xv] 0
rotthis2

view
x
y
z
w
v
zoom
1.30
1.30
1.30
1.30
1.30
x
158
57
324
36
y
121
11
49
C0
x
y
z
w
v
size
0.33
0.33
0.33
0.33
0.33
edge
1.00
1.00
1.00
1.00
1.00
C1
x
y
z
w
v
size
0.33
0.33
0.33
0.33
0.33
edge
1.00
1.00
0.00
0.00
0.00
C2
x
y
z
w
v
size
0.33
0.33
0.33
0.33
0.33
edge
1.00
0.00
1.00
0.00
0.00
C3
x
y
z
w
v
size
0.33
0.33
0.33
0.33
0.33
edge
1.00
0.00
0.00
1.00
0.00
C4
x
y
z
w
v
size
0.33
0.33
0.33
0.33
0.33
edge
1.00
0.00
0.00
0.00
1.00

5.3 · Edges split

Now, something funky starts to happen. It looks like the faces from the original C0 cube are coming off. Yes they are.

This is achieved by increasing the size of the cubes C1–C4, which, if you remember, only had edges drawn within one plane (e.g. `xy`).

In this frame, cube C1 has grown from `s_{xyzwv} = 0.33` to 0.38. This is the cube that has `xy` edges (`e_x = e_y = 1`).

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #2700 1:52:11 | 12/48 3.b( 11/ 47)3.c
3.b
n 2fs
c c1 s . s3s
rotthis2
3.c
n 2fs
c c1 s . s3s
c c2 s . s3s
rotthis2

view
x
y
z
w
v
zoom
1.30
1.30
1.30
1.30
1.30
x
108
57
327
36
y
82
11
51
C0
x
y
z
w
v
size
0.33
0.33
0.33
0.33
0.33
edge
1.00
1.00
1.00
1.00
1.00
C1
x
y
z
w
v
size
0.38
0.38
0.38
0.38
0.38
edge
1.00
1.00
0.00
0.00
0.00
C2
x
y
z
w
v
size
0.33
0.33
0.33
0.33
0.33
edge
1.00
0.00
1.00
0.00
0.00
C3
x
y
z
w
v
size
0.33
0.33
0.33
0.33
0.33
edge
1.00
0.00
0.00
1.00
0.00
C4
x
y
z
w
v
size
0.33
0.33
0.33
0.33
0.33
edge
1.00
0.00
0.00
0.00
1.00

Now, quite a bit is happening but it can all be understood in terms of what you've already seen.

First, the C1–C4 cubes have grown (each to a different extent) beyond the size of C0 (which makes their faces look like they've separated). For example, C1 has `s = 0.54` whereas C4 grew less at `s = 0.39`.

The other effect is that the edges for C0 are now shrinking towards the cube's vertices — this achieved by lowering the edge size to `e = 0.55`.

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #3000 2:04:23 | 24/48 3.h( 23/ 47)3.i
3.h
n 2fs
c c0 f . s3f
c c[1-4] s . s3s
rotthis2
3.i
n 2fs
c c0 f . s3f
c c[1-4] s . s3s
rotthis2
rep 2

view
x
y
z
w
v
zoom
1.30
1.30
1.30
1.30
1.30
x
327
57
335
36
y
332
11
55
C0
x
y
z
w
v
size
0.33
0.33
0.33
0.33
0.33
edge
0.55
0.55
0.55
0.55
0.55
C1
x
y
z
w
v
size
0.54
0.54
0.54
0.54
0.54
edge
1.00
1.00
0.00
0.00
0.00
C2
x
y
z
w
v
size
0.49
0.49
0.49
0.49
0.49
edge
1.00
0.00
1.00
0.00
0.00
C3
x
y
z
w
v
size
0.44
0.44
0.44
0.44
0.44
edge
1.00
0.00
0.00
1.00
0.00
C4
x
y
z
w
v
size
0.39
0.39
0.39
0.39
0.39
edge
1.00
0.00
0.00
0.00
1.00

5.4 · Area maps of `\pi` on faces

Ready for more? Yes you are.

The edges of C0 have shrunk back to the cube's vertices (`e = 0.18`) so we only see 18% of the total edge length (i.e. there is a 82% gap in the middle of the edge). You'll also notice that the edges of C1 are starting to shrink (`e = 0.94`), which you can see as a small gap forming in one set of the thicker squares (e.g. first face from the right of the frame).

You're also seeing little specks form everywhere. These are the beginnings of the area maps of the digits of `\pi` (or its approximations), projected onto the faces of a cube.

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #3275 2:16:10 | 11/48 4.a( 10/ 47)4.a
4.a
n 2fs
c c0 f . 0.90
c c1 f [xy] s4f
c c[0-1] s . p2
map_fade(c1,.,p1)
rotthis3
size . s4u

view
x
y
z
w
v
zoom
1.32
1.32
1.32
1.32
1.32
x
198
57
344
36
y
231
11
60
C0
x
y
z
w
v
size
0.34
0.34
0.34
0.34
0.34
edge
0.18
0.18
0.18
0.18
0.18
C1
x
y
z
w
v
size
0.59
0.59
0.59
0.59
0.59
edge
0.94
0.94
0.00
0.00
0.00
maps
22a × 80
`e` = 0.01 `z` = 1.00
C2
x
y
z
w
v
size
0.53
0.53
0.53
0.53
0.53
edge
1.00
0.00
1.00
0.00
0.00
maps
22b × 80
`e` = 0.00 `z` = 1.00
C3
x
y
z
w
v
size
0.48
0.48
0.48
0.48
0.48
edge
1.00
0.00
0.00
1.00
0.00
maps
22b × 80
`e` = 0.00 `z` = 1.00
C4
x
y
z
w
v
size
0.43
0.43
0.43
0.43
0.43
edge
1.00
0.00
0.00
0.00
1.00
maps
22b × 80
`e` = 0.00 `z` = 1.00

In this frame, I've assigned maps to each of the 80 faces of cubes C1–C4. That's 300 maps. The map name reflects the digit and the levels of the map. For example, map 22a is a 2-level map of the `22/7` approximation and 22b is a 3-level version of it.

map = 10a 10/3 2
map = 10b 10/3 3
map = 10c 10/3 4
map = 22a 22/7 2
map = 22b 22/7 3
map = 22c 22/7 4
map = 179a 179/57 2
map = 179b 179/57 3
map = 179c 179/57 4
map = 245a 245/78 2
map = 245b 245/78 3
map = 245c 245/78 4
map = 355a 355/113 2
map = 355b 355/113 3
map = 355c 355/113 4
map = pia pi 2
map = pib pi 3
map = pic pi 4

The scene keeps zooming in — now the zoom is `z = 2`. Cube C0 keeps growing `s = 0.67` and its edges continue to fade to the corners `e = 0.1`. Cubes C1–C4 keep growing and the edges of the maps on their faces are also growing. For example, cube's C1 and C2 maps have `e=0.10`.

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #3600 2:29:23 | 48/48 4.f( 47/ 47)4.g
4.f
n 2fs
a xv 0.10
a xw 0.90
a xz 0.16
c c2 f [xz] s4f
c c[0-2] s . p2
cube c[1-2] a [xy][yzwvu] astep-fast
map_fade(c2,.,p1)
rotthis3
size . s4u
4.g
n 2fs
a yv 0.15
a yw 0.03
c c3 f [xw] s4f
c c[0-3] s . p2
cube c[1-2] a [xy][yzwvu] astep-fast
map_fade(c3,.,p1)
rotthis3
size . s4u

view
x
y
z
w
v
zoom
2
2
2
2
2
x
46
57
54
36
y
111
11
104
C0
x
y
z
w
v
size
0.67
0.67
0.67
0.67
0.67
edge
0.10
0.10
0.10
0.10
0.10
C1
x
y
z
w
v
size
0.92
0.92
0.92
0.92
0.92
edge
0.10
0.10
0.00
0.00
0.00
x
6
5
5
5
y
5
5
6
maps
22a × 80
`e` = 0.10 `z` = 1.00
C2
x
y
z
w
v
size
0.72
0.72
0.72
0.72
0.72
edge
0.10
0.00
0.10
0.00
0.00
x
5
4
3
5
y
4
4
4
maps
22b × 80
`e` = 0.10 `z` = 1.00
C3
x
y
z
w
v
size
0.52
0.52
0.52
0.52
0.52
edge
0.70
0.00
0.00
0.70
0.00
maps
22b × 80
`e` = 0.04 `z` = 1.00
C4
x
y
z
w
v
size
0.43
0.43
0.43
0.43
0.43
edge
1.00
0.00
0.00
0.00
1.00
maps
22b × 80
`e` = 0.00 `z` = 1.00

The scene continues to zoom (`z=2.59`) and the edges of all cubes have faded to corners (`e = 0.1`). The map edges are around 20% complete.

Because the scene zoomed in quite a bit now, you don't see all the corners of any given cube. Periodically, corners fly by and then quickly pass out of view.

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #3885 2:41:20 | 45/48 4.l( 44/ 47)4.m
4.l
n 2fs
c c4 f [xv] s4f
cube c[1-4] a [xy][yzwvu] astep-fast
map_fade(c[1-4],.,p1)
rotthis3
size . s4u
4.m
n 2fs
cube c[1-4] a [xy][yzwvu] astep-fast
map_fade(c[1-4],.,p1)
rotthis3
size . s4u

view
x
y
z
w
v
zoom
2.59
2.59
2.59
2.59
2.59
x
272
57
119
36
y
6
11
138
C0
x
y
z
w
v
size
0.78
0.78
0.78
0.78
0.78
edge
0.10
0.10
0.10
0.10
0.10
C1
x
y
z
w
v
size
1.03
1.03
1.03
1.03
1.03
edge
0.10
0.10
0.00
0.00
0.00
x
15
14
13
15
y
14
14
14
maps
22a × 80
`e` = 0.22 `z` = 1.00
C2
x
y
z
w
v
size
0.83
0.83
0.83
0.83
0.83
edge
0.10
0.00
0.10
0.00
0.00
x
14
12
12
15
y
13
13
12
maps
22b × 80
`e` = 0.22 `z` = 1.00
C3
x
y
z
w
v
size
0.63
0.63
0.63
0.63
0.63
edge
0.10
0.00
0.00
0.10
0.00
x
9
7
8
9
y
8
8
9
maps
22b × 80
`e` = 0.19 `z` = 1.00
C4
x
y
z
w
v
size
0.43
0.43
0.43
0.43
0.43
edge
0.10
0.00
0.00
0.00
0.10
x
4
4
4
4
y
4
4
4
maps
22b × 80
`e` = 0.16 `z` = 1.00

5.5 · More cubes appear

At this point, four more cubes are introduced into the scene: C5–C8. These cubes are different from the cubes we've already seen in that instead of shown as edges, they are shown as filled faces. Faces may be incompletely drawn (i.e. not the full face but only as square patches near their vertices.

The faces of cubes C5 and C6 are partially drawn (`e=0.16` and `e=0.09`, respectively). Faces for cubes C7 and C8 are not yet drawn (`e=0`).

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #4000 2:46:15 | 16/48 5.b( 15/ 47)5.c
5.b
n 2fs
c c[1-4] a [xy][yzwvu] astep-vfast
c c[5-5] f . s5cf
map_fade(c[1-4],.,s5f)
rotthis3
5.c
n 2fs
c c[1-5] a [xy][yzwvu] astep-vfast
c c[5-6] f . s5cf
map_fade(c[1-4],.,s5f)
rotthis3
rep 5

view
x
y
z
w
v
zoom
2.60
2.60
2.60
2.60
2.60
x
219
57
147
36
y
324
11
149
C0
x
y
z
w
v
size
0.78
0.78
0.78
0.78
0.78
edge
0.10
0.10
0.10
0.10
0.10
C1
x
y
z
w
v
size
1.03
1.03
1.03
1.03
1.03
edge
0.10
0.10
0.00
0.00
0.00
x
21
20
20
20
y
20
20
21
maps
22a × 80
`e` = 0.20 `z` = 1.00
C2
x
y
z
w
v
size
0.83
0.83
0.83
0.83
0.83
edge
0.10
0.00
0.10
0.00
0.00
x
21
17
18
21
y
19
19
19
maps
22b × 80
`e` = 0.20 `z` = 1.00
C3
x
y
z
w
v
size
0.63
0.63
0.63
0.63
0.63
edge
0.10
0.00
0.00
0.10
0.00
x
15
13
15
15
y
14
14
15
maps
22b × 80
`e` = 0.17 `z` = 1.00
C4
x
y
z
w
v
size
0.43
0.43
0.43
0.43
0.43
edge
0.10
0.00
0.00
0.00
0.10
x
10
10
11
10
y
10
10
9
maps
22b × 80
`e` = 0.14 `z` = 1.00
C5
x
y
z
w
v
size
1.03
1.03
1.03
1.03
1.03
edge
0.09
0.09
0.09
0.09
0.09
x
15
15
14
16
y
15
15
15
C6
x
y
z
w
v
size
0.83
0.83
0.83
0.83
0.83
edge
0.01
0.01
0.01
0.01
0.01
x
14
12
12
15
y
13
13
12
C7
x
y
z
w
v
size
0.63
0.63
0.63
0.63
0.63
x
9
8
8
9
y
8
8
10
C8
x
y
z
w
v
size
0.43
0.43
0.43
0.43
0.43
x
4
4
4
5
y
4
5
4

By now, the faces for each cube C5–C8 are being drawn (`e>0`). From this angle, the corners of these cubes are at the periphery of the viewport. At the same time, the projected area maps on cubes C1–C4 start to fade away (maps' `e` is decreasing).

Notice that each of the cubes C1–C8 has its own rotation, in addition to the rotation of the camera.

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #4700 3:15:19 | 44/48 5.d( 43/ 47)5.e
5.d
n 2fs
c c[1-6] a [xy][yzwvu] astep-vfast
c c[5-7] f . s5cf
map_fade(c[1-4],.,s5f)
rotthis3
rep 9
5.e
n 2fs
c c[1-7] a [xy][yzwvu] astep-vfast
c c[5-8] f . s5cf
map_fade(c[1-4],.,s5f)
rotthis3
rep 4

view
x
y
z
w
v
zoom
2.60
2.60
2.60
2.60
2.60
x
250
57
304
36
y
67
11
250
C0
x
y
z
w
v
size
0.78
0.78
0.78
0.78
0.78
edge
0.10
0.10
0.10
0.10
0.10
C1
x
y
z
w
v
size
1.03
1.03
1.03
1.03
1.03
edge
0.10
0.10
0.00
0.00
0.00
x
58
58
56
59
y
57
57
60
maps
22a × 80
`e` = 0.07 `z` = 1.00
C2
x
y
z
w
v
size
0.83
0.83
0.83
0.83
0.83
edge
0.10
0.00
0.10
0.00
0.00
x
57
55
59
58
y
56
57
58
maps
22b × 80
`e` = 0.07 `z` = 1.00
C3
x
y
z
w
v
size
0.63
0.63
0.63
0.63
0.63
edge
0.10
0.00
0.00
0.10
0.00
x
53
51
53
52
y
52
52
54
maps
22b × 80
`e` = 0.04 `z` = 1.00
C4
x
y
z
w
v
size
0.43
0.43
0.43
0.43
0.43
edge
0.10
0.00
0.00
0.00
0.10
x
48
46
49
48
y
47
47
47
maps
22b × 80
`e` = 0.01 `z` = 1.00
C5
x
y
z
w
v
size
1.03
1.03
1.03
1.03
1.03
edge
0.50
0.50
0.50
0.50
0.50
x
53
52
52
54
y
53
53
53
C6
x
y
z
w
v
size
0.83
0.83
0.83
0.83
0.83
edge
0.46
0.46
0.46
0.46
0.46
x
39
38
39
42
y
39
39
39
C7
x
y
z
w
v
size
0.63
0.63
0.63
0.63
0.63
edge
0.33
0.33
0.33
0.33
0.33
x
11
10
11
11
y
10
11
12
C8
x
y
z
w
v
size
0.43
0.43
0.43
0.43
0.43
edge
0.04
0.04
0.04
0.04
0.04
x
4
4
4
5
y
4
5
4

Cube faces continue to grow and as they do so, there's more of a chance that the viewport is filled with them. The area maps are almost entirely gone.

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #5000 3:28:07 | 8/48 5.f( 7/ 47)5.f
5.f
n 2fs
c c[1-8] a [xy][yzwvu] astep-vfast
c c[5-8] f . s5cs
rotthis3
rep 5

view
x
y
z
w
v
zoom
2.60
2.60
2.60
2.60
2.60
x
110
57
11
36
y
317
11
290
C0
x
y
z
w
v
size
0.78
0.78
0.78
0.78
0.78
edge
0.10
0.10
0.10
0.10
0.10
C1
x
y
z
w
v
size
1.03
1.03
1.03
1.03
1.03
edge
0.10
0.10
0.00
0.00
0.00
x
73
74
73
75
y
74
73
76
maps
22a × 80
`e` = 0.04 `z` = 1.00
C2
x
y
z
w
v
size
0.83
0.83
0.83
0.83
0.83
edge
0.10
0.00
0.10
0.00
0.00
x
74
70
75
75
y
72
74
74
maps
22b × 80
`e` = 0.04 `z` = 1.00
C3
x
y
z
w
v
size
0.63
0.63
0.63
0.63
0.63
edge
0.10
0.00
0.00
0.10
0.00
x
68
66
69
68
y
68
68
71
maps
22b × 80
`e` = 0.01 `z` = 1.00
C4
x
y
z
w
v
size
0.43
0.43
0.43
0.43
0.43
edge
0.10
0.00
0.00
0.00
0.10
x
63
62
64
64
y
62
64
62
maps
22b × 80
`e` = 0.00 `z` = 1.00
C5
x
y
z
w
v
size
1.03
1.03
1.03
1.03
1.03
edge
0.59
0.59
0.59
0.59
0.59
x
68
67
68
70
y
69
70
68
C6
x
y
z
w
v
size
0.83
0.83
0.83
0.83
0.83
edge
0.55
0.55
0.55
0.55
0.55
x
55
54
56
58
y
56
57
55
C7
x
y
z
w
v
size
0.63
0.63
0.63
0.63
0.63
edge
0.45
0.45
0.45
0.45
0.45
x
28
27
27
27
y
27
26
29
C8
x
y
z
w
v
size
0.43
0.43
0.43
0.43
0.43
edge
0.20
0.20
0.20
0.20
0.20
x
12
13
14
12
y
13
12
13

5.6 · It's full of colors

The Ascent video released as a black-and-white version, which is the source of the frames you've seen in this walkthrough.

There are two more versions of the video — one using the viridis (yellow, green, blue, purple) color scheme and the other using plasma (yellow, orange, red, pruple, violet).

The color encodes the z-distance (into the screen) to the element.

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #5000 3:28:07 | 5.f–5.f (viridis)
Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #5000 3:28:07 | 5.f–5.f (plasma)

5.7 · Reprieve

At around 4 minutes into the video, the entire scene appears to reset. This is achieved by slowly resetting the scene angle to a specific point of view — don't ask me how long it took to find it.

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #5680 3:56:15 | 6.a–6.b
Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #5695 3:57:06 | 6.a–6.b
Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #5710 3:57:21 | 6.a–6.b
Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #5725 3:58:12 | 6.b–6.c
Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #5740 3:59:03 | 6.b–6.c
Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #5755 3:59:18 | 6.b–6.c
s

The angles of all cubes are either zero or 180 and the scene is rotated so that what we see is a pretty minimal projection.

You'll notice that 5 new cubes Ca—Cd have been introduced. These have maps for 22/7 and 179/57, which are starting to grow. The elements for these maps are drawn as filled rectangles instead of just outlines.

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #5755 3:59:18 | 43/48 6.b( 42/ 47)6.c
6.b
n 14fs
a xv refxv
a xw refxw
a xy refxy
a xz refxz
a yv refyv
a yw refyw
a yz refyz
c c[0-9a-d] a . 0
map_fade(c[a-d],.,ps6)
6.c
n 2fs
a xw d0.01
cube c[0-8] fade . ps15
cube_rot(.,[xy][yzwvu],astep-vvslow)
f . . map . fade ps15
rot6vvs
size . ps20

view
x
y
z
w
v
zoom
2.64
2.64
2.64
2.64
2.64
x
315
134
93
89
y
181
C0
x
y
z
w
v
size
0.78
0.78
0.78
0.78
0.78
edge
0.04
0.05
0.05
0.04
0.05
C1
x
y
z
w
v
size
1.03
1.03
1.03
1.03
1.03
edge
0.05
0.04
0.03
0.03
0.03
x
180
180
180
180
y
180
180
180
maps
22a × 80
`e` = 0.04 `z` = 1.00
C2
x
y
z
w
v
size
0.83
0.83
0.83
0.83
0.83
edge
0.05
0.03
0.03
0.04
0.04
x
180
180
180
180
y
180
180
180
maps
22b × 80
`e` = 0.04 `z` = 1.00
C3
x
y
z
w
v
size
0.63
0.63
0.63
0.63
0.63
edge
0.05
0.04
0.04
0.04
0.04
x
180
y
180
maps
22b × 80
`e` = 0.01 `z` = 1.00
C4
x
y
z
w
v
size
0.43
0.43
0.43
0.43
0.43
edge
0.04
0.02
0.04
0.03
0.05
maps
22b × 80
`e` = 0.00 `z` = 1.00
C5
x
y
z
w
v
size
1.03
1.03
1.03
1.03
1.03
edge
0.10
0.11
0.11
0.11
0.09
x
180
y
180
180
C6
x
y
z
w
v
size
0.83
0.83
0.83
0.83
0.83
edge
0.10
0.09
0.11
0.10
0.10
C7
x
y
z
w
v
size
0.63
0.63
0.63
0.63
0.63
edge
0.08
0.09
0.09
0.08
0.09
C8
x
y
z
w
v
size
0.43
0.43
0.43
0.43
0.43
edge
0.06
0.07
0.07
0.07
0.06
Ca
x
y
z
w
v
size
1.03
1.03
1.03
1.03
1.03
x
180
180
180
180
y
180
180
180
maps
179a,22a × 80
`e` = 0.01 `z` = 1.00
Cb
x
y
z
w
v
size
0.83
0.83
0.83
0.83
0.83
x
180
180
180
180
y
180
180
180
maps
22b,179b × 80
`e` = 0.01 `z` = 1.00
Cc
x
y
z
w
v
size
0.63
0.63
0.63
0.63
0.63
x
180
y
180
maps
179b,22b × 80
`e` = 0.01 `z` = 1.00
Cd
x
y
z
w
v
size
0.43
0.43
0.43
0.43
0.43
maps
179c,22b × 80
`e` = 0.01 `z` = 1.00

5.8 · Towards the climax

The scene starts to unravel and the rectangles of the area maps start to look like falling snow.

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #6050 4:12:01 | 6.i–6.j
Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #6100 4:14:03 | 6.j–6.k
Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #6150 4:16:05 | 6.k–6.l
Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #6200 4:18:07 | 6.l–6.m
Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #6250 4:20:09 | 6.m–6.n
Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #6300 4:22:11 | 6.n–6.o

This part of the video looks particularly warm and inviting when rendered in color.

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #6450 4:28:17 | 6.q–6.r (viridis)
Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #6450 4:28:17 | 6.q–6.r (plasma)

The last 4 cubes are introduced: Ce–Ch. These have area maps of the digits of `\pi`, which are also drawn as filled rectangles. Notice that when a cube's edge parameter is zero `e = 0` the cube itself isn't drawn but area map projections on its faces can appear if the maps' `e>0`.

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #6500 4:30:19 | 20/48 7.a( 19/ 47)7.a
7.a
n 2fs
cube c[0-2] fade . p5
cube_rot(.,[xy][yzwvu],astep-med)
face c[0-9a-e] . map . fade p5
rot6f
rep 2

view
x
y
z
w
v
zoom
2.80
2.80
2.80
2.80
2.80
x
295
134
284
89
y
346
162
C0
x
y
z
w
v
size
0.78
0.78
0.78
0.78
0.78
edge
0.09
0.11
0.10
0.09
0.12
x
29
27
28
27
y
28
29
29
C1
x
y
z
w
v
size
1.03
1.03
1.03
1.03
1.03
edge
0.09
0.08
0.10
0.09
0.11
x
209
207
207
207
y
208
208
209
maps
22a × 80
`e` = 0.06 `z` = 1.00
C2
x
y
z
w
v
size
0.83
0.83
0.83
0.83
0.83
edge
0.09
0.10
0.09
0.11
0.11
x
207
207
208
206
y
207
208
206
maps
22b × 80
`e` = 0.06 `z` = 1.00
C3
x
y
z
w
v
size
0.63
0.63
0.63
0.63
0.63
edge
0.07
0.07
0.05
0.09
0.09
x
27
28
208
26
y
28
29
210
maps
22b × 80
`e` = 0.03 `z` = 1.00
C4
x
y
z
w
v
size
0.43
0.43
0.43
0.43
0.43
edge
0.08
0.06
0.10
0.08
0.08
x
26
26
26
25
y
29
28
28
maps
22b × 80
`e` = 0.02 `z` = 1.00
C5
x
y
z
w
v
size
1.03
1.03
1.03
1.03
1.03
edge
0.08
0.08
0.05
0.09
0.09
x
27
28
28
208
y
206
207
27
C6
x
y
z
w
v
size
0.83
0.83
0.83
0.83
0.83
edge
0.09
0.07
0.07
0.09
0.10
x
27
27
27
27
y
28
28
27
C7
x
y
z
w
v
size
0.63
0.63
0.63
0.63
0.63
edge
0.08
0.05
0.08
0.10
0.08
x
27
27
29
28
y
28
28
27
C8
x
y
z
w
v
size
0.43
0.43
0.43
0.43
0.43
edge
0.06
0.05
0.06
0.05
0.05
x
28
29
28
27
y
28
28
29
Ca
x
y
z
w
v
size
1.03
1.03
1.03
1.03
1.03
x
206
207
209
207
y
207
208
209
maps
179a,22a × 80
`e` = 0.03 `z` = 1.00
Cb
x
y
z
w
v
size
0.83
0.83
0.83
0.83
0.83
x
208
208
207
208
y
208
208
208
maps
179b,22b × 80
`e` = 0.03 `z` = 1.00
Cc
x
y
z
w
v
size
0.63
0.63
0.63
0.63
0.63
x
28
27
207
29
y
28
28
208
maps
179b,22b × 80
`e` = 0.03 `z` = 1.00
Cd
x
y
z
w
v
size
0.43
0.43
0.43
0.43
0.43
x
29
26
28
28
y
27
26
30
maps
22b,179c × 80
`e` = 0.03 `z` = 1.00
Ce
x
y
z
w
v
size
1.10
1.10
1.10
1.10
1.10
x
64
71
79
62
y
36
48
75
z
52
20
w
18
maps
pia × 80
`e` = 0.02 `z` = 1.00
Cf
x
y
z
w
v
size
1.20
1.20
1.20
1.20
1.20
x
82
5
82
39
y
56
82
72
z
66
86
w
52
maps
pib × 80
`e` = 0.00 `z` = 1.00
Cg
x
y
z
w
v
size
1.35
1.35
1.35
1.35
1.35
x
14
82
41
51
y
27
18
17
z
63
82
w
70
maps
pib × 80
`e` = 0.00 `z` = 1.00
Ch
x
y
z
w
v
size
1.50
1.50
1.50
1.50
1.50
x
47
12
23
7
y
59
30
20
z
17
15
w
35
maps
pic × 80
`e` = 0.00 `z` = 1.00

5.9 · Climax

For the climax, everything that's been seen so far is turned back on: edges grow, cube faces are filled and all map edges and filled rectangles grow. All the elements are rendered with difference blend (i.e. black on black gives white, white on white gives black) and the scene turns to noise.

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #6500 4:30:19 | 7.a–7.a
Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #6550 4:32:21 | 7.a–7.a
Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #6600 4:34:23 | 7.a–7.b
Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #6650 4:37:01 | 7.b–7.b
Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #6700 4:39:03 | 7.b–7.c
Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #6750 4:41:05 | 7.c–7.c

The noise builds and you get brief glimpses of thousands of edges and faces stacking into vague patterns. If you look at the cube parameters for this frame 7440, you'll notice that everything is “on”: Cubes C0–C8 have a non-zero size and non-zero edge and the remaining cubes have map edges in the interval `e = [0.18,0.41]`.

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #7440 5:09:23 | 48/48 7.j( 47/ 47)7.j
7.j
n 2fs
cube_rot(.,[xy][yzwvu],astep-med)
rot6vf
rep 2

view
x
y
z
w
v
zoom
2.79
2.79
2.79
2.79
2.79
x
295
134
289
89
y
204
11
C0
x
y
z
w
v
size
0.78
0.78
0.78
0.78
0.78
edge
0.45
0.46
0.45
0.44
0.46
x
44
42
43
42
y
43
44
44
C1
x
y
z
w
v
size
1.03
1.03
1.03
1.03
1.03
edge
0.44
0.44
0.45
0.45
0.45
x
224
222
221
224
y
223
223
223
maps
22a × 80
`e` = 0.43 `z` = 1.00
C2
x
y
z
w
v
size
0.83
0.83
0.83
0.83
0.83
edge
0.45
0.45
0.44
0.45
0.46
x
223
223
222
221
y
223
223
222
maps
22b × 80
`e` = 0.43 `z` = 1.00
C3
x
y
z
w
v
size
0.63
0.63
0.63
0.63
0.63
edge
0.38
0.38
0.37
0.40
0.39
x
42
44
224
41
y
42
46
225
maps
22b × 80
`e` = 0.41 `z` = 1.00
C4
x
y
z
w
v
size
0.43
0.43
0.43
0.43
0.43
edge
0.39
0.37
0.40
0.39
0.39
x
41
41
41
40
y
44
42
43
maps
22b × 80
`e` = 0.40 `z` = 1.00
C5
x
y
z
w
v
size
1.03
1.03
1.03
1.03
1.03
edge
0.33
0.32
0.30
0.33
0.33
x
42
43
42
222
y
223
223
42
C6
x
y
z
w
v
size
0.83
0.83
0.83
0.83
0.83
edge
0.33
0.32
0.32
0.33
0.34
x
41
42
43
43
y
42
44
43
C7
x
y
z
w
v
size
0.63
0.63
0.63
0.63
0.63
edge
0.25
0.23
0.25
0.27
0.25
x
44
42
46
43
y
43
43
42
C8
x
y
z
w
v
size
0.43
0.43
0.43
0.43
0.43
edge
0.23
0.23
0.23
0.23
0.23
x
43
43
42
43
y
44
43
44
Ca
x
y
z
w
v
size
1.03
1.03
1.03
1.03
1.03
x
222
222
224
222
y
222
222
223
maps
22a,179a × 80
`e` = 0.41 `z` = 1.00
Cb
x
y
z
w
v
size
0.83
0.83
0.83
0.83
0.83
x
222
224
224
223
y
223
223
223
maps
22b,179b × 80
`e` = 0.41 `z` = 1.00
Cc
x
y
z
w
v
size
0.63
0.63
0.63
0.63
0.63
x
44
41
223
44
y
41
44
224
maps
179b,22b × 80
`e` = 0.41 `z` = 1.00
Cd
x
y
z
w
v
size
0.43
0.43
0.43
0.43
0.43
x
43
42
42
41
y
42
41
46
maps
22b,179c × 80
`e` = 0.41 `z` = 1.00
Ce
x
y
z
w
v
size
1.10
1.10
1.10
1.10
1.10
x
80
87
94
77
y
51
63
89
z
52
20
w
18
maps
pia × 80
`e` = 0.40 `z` = 1.00
Cf
x
y
z
w
v
size
1.20
1.20
1.20
1.20
1.20
x
97
21
96
53
y
71
97
87
z
66
86
w
52
maps
pib × 80
`e` = 0.34 `z` = 1.00
Cg
x
y
z
w
v
size
1.35
1.35
1.35
1.35
1.35
x
29
98
55
66
y
43
34
32
z
63
82
w
70
maps
pib × 80
`e` = 0.27 `z` = 1.00
Ch
x
y
z
w
v
size
1.50
1.50
1.50
1.50
1.50
x
62
27
37
22
y
73
45
36
z
17
15
w
35
maps
pic × 80
`e` = 0.18 `z` = 1.00

5.10 · Back to zero

By about 5:20, it's time to wrap the show up. This is done by slowly zooming the camera out and shrinking the edges of all cubes and maps.

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #7800 5:24:23 | 8.c–8.c
Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #7850 5:27:01 | 8.c–8.c
Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #7900 5:29:03 | 8.c–8.c
Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #7950 5:31:05 | 8.c–9.a
Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #8000 5:33:07 | 9.a–9.a
Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #8050 5:35:09 | 9.a–9.a
Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #8100 5:37:11 | 9.a–9.a
Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #8150 5:39:13 | 9.a–9.a

In the color versions of the video, the zoomout gives you a chance to see more details.

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #7950 5:31:05 | 30/48 8.c( 29/ 47)9.a (viridis)
Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
▲ MAX COOPER'S ASCENT #7950 5:31:05 | 30/48 8.c( 29/ 47)9.a (plasma)

In this frame, one of the last where anything is visible, the zoom is `z=0.25` and cube edges are `e<0.03` and the maps have disappeared (`e=0`). Thus, what you're seeing is just the `3 \times 32 = 96` tiny vertices of cubes C0, C1 and C2.

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
&#9650; MAX COOPER'S ASCENT #8150 5:39:13 | 38/48 9.a( 37/ 47)9.a
9.a
n 2fs
cube . f . q50
cube_rot(.,[xy][ywvu],astep-med)
map_fade(.,.,q50)
rot6s
size . q30
rep 6

view
x
y
z
w
v
zoom
0.25
0.25
0.25
0.25
0.25
x
295
134
9
89
y
250
60
C0
x
y
z
w
v
size
0.78
0.78
0.78
0.78
0.78
edge
0.02
0.03
0.03
0.02
0.03
x
58
50
55
55
y
51
59
58
C1
x
y
z
w
v
size
1.03
1.03
1.03
1.03
1.03
edge
0.02
0.01
0.02
0.02
0.03
x
236
230
235
237
y
231
236
236
maps
22a × 80
`e` = 0.00 `z` = 1.00
C2
x
y
z
w
v
size
0.83
0.83
0.83
0.83
0.83
edge
0.02
0.02
0.02
0.03
0.03
x
235
230
236
234
y
231
237
235
maps
22b × 80
`e` = 0.00 `z` = 1.00
C3
x
y
z
w
v
size
0.63
0.63
0.63
0.63
0.63
x
55
53
237
54
y
51
58
239
maps
22b × 80
`e` = 0.00 `z` = 1.00
C4
x
y
z
w
v
size
0.43
0.43
0.43
0.43
0.43
x
53
50
54
53
y
51
55
56
maps
22b × 80
`e` = 0.00 `z` = 1.00
C5
x
y
z
w
v
size
1.03
1.03
1.03
1.03
1.03
x
56
51
55
234
y
230
236
55
C6
x
y
z
w
v
size
0.83
0.83
0.83
0.83
0.83
x
54
50
56
56
y
50
56
55
C7
x
y
z
w
v
size
0.63
0.63
0.63
0.63
0.63
x
56
50
58
55
y
50
57
56
C8
x
y
z
w
v
size
0.43
0.43
0.43
0.43
0.43
x
56
51
57
57
y
51
56
58
Ca
x
y
z
w
v
size
1.03
1.03
1.03
1.03
1.03
x
236
230
237
234
y
229
235
236
maps
22a,179a × 80
`e` = 0.00 `z` = 1.00
Cb
x
y
z
w
v
size
0.83
0.83
0.83
0.83
0.83
x
235
233
238
236
y
231
235
236
maps
179b,22b × 80
`e` = 0.00 `z` = 1.00
Cc
x
y
z
w
v
size
0.63
0.63
0.63
0.63
0.63
x
56
50
235
57
y
49
57
236
maps
179b,22b × 80
`e` = 0.00 `z` = 1.00
Cd
x
y
z
w
v
size
0.43
0.43
0.43
0.43
0.43
x
56
50
54
53
y
50
53
58
maps
179c,22b × 80
`e` = 0.00 `z` = 1.00
Ce
x
y
z
w
v
size
0.66
0.66
0.66
0.66
0.66
x
91
95
106
90
y
59
75
103
z
52
20
w
18
maps
pia × 80
`e` = 0.00 `z` = 1.00
Cf
x
y
z
w
v
size
0.72
0.72
0.72
0.72
0.72
x
110
28
109
66
y
78
110
100
z
66
86
w
52
maps
pib × 80
`e` = 0.00 `z` = 1.00
Cg
x
y
z
w
v
size
0.81
0.81
0.81
0.81
0.81
x
42
106
69
79
y
51
47
45
z
63
82
w
70
maps
pib × 80
`e` = 0.00 `z` = 1.00
Ch
x
y
z
w
v
size
0.90
0.90
0.90
0.90
0.90
x
74
35
50
35
y
81
59
49
z
17
15
w
35
maps
pic × 80
`e` = 0.00 `z` = 1.00

A second later, everything is gone.

news + thoughts

Regression modeling of time-to-event data with censoring

Mon 21-11-2022

If you sit on the sofa for your entire life, you’re running a higher risk of getting heart disease and cancer. —Alex Honnold, American rock climber

In a follow-up to our Survival analysis — time-to-event data and censoring article, we look at how regression can be used to account for additional risk factors in survival analysis.

We explore accelerated failure time regression (AFTR) and the Cox Proportional Hazards model (Cox PH).

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
Nature Methods Points of Significance column: Regression modeling of time-to-event data with censoring. (read)

Dey, T., Lipsitz, S.R., Cooper, Z., Trinh, Q., Krzywinski, M & Altman, N. (2022) Points of significance: Regression modeling of time-to-event data with censoring. Nature Methods 19.

Music video for Max Cooper's Ascent

Tue 25-10-2022

My 5-dimensional animation sets the visual stage for Max Cooper's Ascent from the album Unspoken Words. I have previously collaborated with Max on telling a story about infinity for his Yearning for the Infinite album.

I provide a walkthrough the video, describe the animation system I created to generate the frames, and show you all the keyframes

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
Frame 4897 from the music video of Max Cooper's Asent.

The video recently premiered on YouTube.

Renders of the full scene are available as NFTs.

Gene Cultures exhibit — art at the MIT Museum

Tue 25-10-2022

I am more than my genome and my genome is more than me.

The MIT Museum reopened at its new location on 2nd October 2022. The new Gene Cultures exhibit featured my visualization of the human genome, which walks through the size and organization of the genome and some of the important structures.

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
My art at the MIT Museum Gene Cultures exhibit tells shows the scale and structure of the human genome. Pay no attention to the pink chicken.

Annals of Oncology cover

Wed 14-09-2022

My cover design on the 1 September 2022 Annals of Oncology issue shows 570 individual cases of difficult-to-treat cancers. Each case shows the number and type of actionable genomic alterations that were detected and the length of therapies that resulted from the analysis.

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
An organic arrangement of 570 individual cases of difficult-to-treat cancers showing genomic changes and therapies. Apperas on Annals of Oncology cover (volume 33, issue 9, 1 September 2022).

Pleasance E et al. Whole-genome and transcriptome analysis enhances precision cancer treatment options (2022) Annals of Oncology 33:939–949.

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
My Annals of Oncology 570 cancer cohort cover (volume 33, issue 9, 1 September 2022). (more)

Browse my gallery of cover designs.

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
A catalogue of my journal and magazine cover designs. (more)

Survival analysis—time-to-event data and censoring

Fri 05-08-2022

Love's the only engine of survival. —L. Cohen

We begin a series on survival analysis in the context of its two key complications: skew (which calls for the use of probability distributions, such as the Weibull, that can accomodate skew) and censoring (required because we almost always fail to observe the event in question for all subjects).

We discuss right, left and interval censoring and how mishandling censoring can lead to bias and loss of sensitivity in tests that probe for differences in survival times.

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
Nature Methods Points of Significance column: Survival analysis—time-to-event data and censoring. (read)

Dey, T., Lipsitz, S.R., Cooper, Z., Trinh, Q., Krzywinski, M & Altman, N. (2022) Points of significance: Survival analysis—time-to-event data and censoring. Nature Methods 19:906–908.

3,117,275,501 Bases, 0 Gaps

Sun 21-08-2022

See How Scientists Put Together the Complete Human Genome.

My graphic in Scientific American's Graphic Science section in the August 2022 issue shows the full history of the human genome assembly — from its humble shotgun beginnings to the gapless telomere-to-telomere assembly.

Read about the process and methods behind the creation of the graphic.

Martin Krzywinski @MKrzywinski mkweb.bcgsc.ca
3,117,275,501 Bases, 0 Gaps. Text by Clara Moskowitz (Senior Editor), art direction by Jen Christiansen (Senior Graphics Editor), source: UCSC Genome Browser.

See all my Scientific American Graphic Science visualizations.


© 1999–2022 Martin Krzywinski | contact | Canada's Michael Smith Genome Sciences CentreBC Cancer Research CenterBC CancerPHSA