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

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:

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.
I think its unfortunate that the only four-dimensional object that
most people have ever heard of is the hypercube.
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**".

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.