[eye candy]


N-dimensional polytope visualization

by cross-section and projection

Peek is a program to interactively explore arbitrary dimension polytopes through the use of cross-sections and projections.

[perspective hypercube] [non-perspective hypercube]

Projections have already been extensively used for this purpose. For instance, those who know what a hypercube is have probably seen the projective views that are so common, such as the two shown here.

Fewer people know, however, that the hypercube also exists as a series of 3-dimensional cross-sections:

[hypercube slice series, part 1]
[hypercube slice series, part 2]
[hypercube slice series, part 3]
[hypercube slice series, part 4]
[hypercube slice series, part 5]

Visualizing higher dimensional objects is, like many scientific visualization tasks, a problem of reducing the dimension of the data. Projections do this by "squashing" the object into a lower dimensional space. But besides a change of coordinate information, the object is essentially unchanged- it has the same number of vertices, edges, faces, etc, and they are all joined together in the same way. Cross-sections, on the other hand, reduce dimension by intersecting the polytope with a lower dimensional space to produce a totally new object. As the hypercube cross-section series above demonstrates, the cross-sections provide interesting geometric information that is not evident in a projective view. For instance, you can see that there is a way to cut a hypercube through the center to get an octahedron. This is the higher dimensional analog of cutting a cube through the center to get a hexagon. So while projections are a very common tool for viewing higher dimensional geometry, I think cross-sections are more challenging and more interesting. Peek can do both. And, if you can provide the necessary object description file, it can work with polytopes of any dimension, because all of the functions are independent of dimension.

But so far I've used Peek mainly to look at four-dimensional objects. [600-cell slice 1] I think its unfortunate that the only four-dimensional object that most people have ever heard of is the hypercube. [600-cell slice 2] Because while in three dimensions there are 5 regular convex solids (tetrahedron, cube, octahedron, dodecahedron, icosahedron), in four dimensions there are 6, and the hypercube is really only one of the simplest ones. There is, for instance, an object called the 600-cell: a hypersolid bounded by 600 tetrahedral "faces". Using Peek, you can drag this object into and out of three-space and watch the resulting cross-sections grow and change. To demonstrate this, here is a sequence of cross-sections of the 600-cell, cutting at different positions along a diameter extending between two antipodal vertices. (similar to the hypercube cross-sections above). Peek also provides an interface to all the possible rotations in N-space. Here as another sequence of cross-sections of the 600-cell which makes use of the rotations possible in four dimensions.

Although some claim otherwise, I do not think that humans can ever grasp higher dimensional geometry in the same instinctive way we know the geometry of three dimensions. Rather, I think the most we can get is some dim glimmer of an idea of what higher dimensional objects are like, and the best way to do this is with interactive projections and cross-sections. Hence the name, "Peek".

[pregnant with expactations] This project started as an independent study for Bruce Land last year, and since then I've been working on it off and on. Recent work has been spurred by two developments: I wrote a program to generate the object file for the 600-cell, and Jon Blocksom ported Peek to OpenGL, which allowed me to produce the nice color images seen here.

Shortly after the OpenGL port, I decided that the whole thing needed to be re-written, so that it has the form of a library with a well-defined API. The reason that I didn't do this from the beginning is that this was was my first non-trivial programming project, and I had no appreciation for the concept of an API back when I started it. So not only do I not have a stable version 1 available here, I don't have a working version 2.

Meanwhile, you can bore yourself with the dreadfully outdated version of this page. The sections describing the data structure and algorithms are still pertinent, but I've recently learned that my "part/image" data structure is a complete reinvention of the wheel as far as being a way of representing directed graphs. This doesn't detract from its usefuleness, it just means my terminology is unnecessarily bizarre. Please don't bother downloading the code, as better code is coming eventually, and I'd be really surprised if the thing works at all. Or if you're just dying to try it out now, mail me and we'll arrange something.