dimension x

dimension y

dimension z

dimension ω

x

y

z

ω

Dimensions in GeoGebra: Building a Tesseract

This tutorial lets you practice your animation skills, while showing the fundamentals of building simple models 
taking up more than 2 dimensions in GeoGebra's 2D-interface. It allows the user to walk through ''building'' 4-space
by moving objects of lower dimensions along orthogonal directions.

Create the origin O, the points I, J and vectors i = OI, j = OJ. With just these, we can pin any point on the screen!

Because we are working in a plane covered by the vectors i and j, we can construct the other two directions using 
them! Now go and create the points K and L as shown on the picture, and then the corresponding vectors k and l!

To allow for animation, we are going to need four sliders - one for each direction!

Now we're going to need a whole lot of points: the tesseract has, after all, 16 vertices!  Watch carefully how points are 
added. A simple rule will soon make itself apparrent!

That wasn't all that difficult, was it? Now it's time to really stretch your imagination: apply segments to connect the 
corresponding vertices! As this is probably the most tricky part in building this model, here's a hint: Connect only 
points that moved in one more direction (Example: The point that moved in the direction i + j with points that moved 
in the directions i and j, as well as points that moved in directions i + j + k, and i + j + l.)

There you go, a tesseract! You may now move around the dimensions manually, or set animation speeds for the 
dimension sliders (a different speed for each is great!), play the animation and watch the dimensions dance for you!

d_x = 1 (slider from 0 to 1, step 0.01)
O = Intersect(xAxis, yAxis)
I = Point(xAxis)
i = Vector(O, I)
J = Point(yAxis)
j = Vector(O, J)
K = Translate(O, Vector[1 / sqrt(8) * (-i - j)])
L = Translate(O, Vector[1 / sqrt(8) * (-i + j)])
k = Vector(O, K)
l = Vector(O, L)
Ox = Translate(O, Vector[d_x * i])
oox = Segment(O, Ox)
d_y = 1 (slider from 0 to 1, step 0.01)
d_z = 1 (slider from 0 to 1, step 0.01)
d_ω = 1 (slider from 0 to 1, step 0.01)
Oy = Translate(O, Vector[d_y * j])
Oz = Translate(O, Vector[d_z * k])
Oω = Translate(O, Vector[d_ω * l])
Oxy = Translate(O, Vector[d_x * i + d_y * j])
Oxz = Translate(O, Vector[d_x * i + d_z * k])
Oyz = Translate(O, Vector[d_y * j + d_z * k])
oxoxy = Segment(Ox, Oxy)
oyoxy = Segment(Oy, Oxy)
oxoxz = Segment(Ox, Oxz)
ozoxz = Segment(Oz, Oxz)
ozoyz = Segment(Oz, Oyz)
oyoyz = Segment(Oy, Oyz)
Oxω = Translate(O, Vector[d_x * i + d_ω * l])
Oyω = Translate(O, Vector[d_y * j + d_ω * l])
Ozω = Translate(O, Vector[d_z * k + d_ω * l])
Oxyz = Translate(O, Vector[d_x * i + d_y * j + d_z * k])
Oxyω = Translate(O, Vector[d_x * i + d_y * j + d_ω * l])
Oxzω = Translate(O, Vector[d_x * i + d_z * k + d_ω * l])
Oyzω = Translate(O, Vector[d_y * j + d_z * k + d_ω * l])
Oxyzω = Translate(O, Vector[d_x * i + d_y * j + d_z * k + d_ω * l])
ozozω = Segment(Oz, Ozω)
oωozω = Segment(Oω, Ozω)
oyoyω = Segment(Oy, Oyω)
oxoxω = Segment(Ox, Oxω)
oωoxω = Segment(Oω, Oxω)
oyzoxyz = Segment(Oyz, Oxyz)
oxzoxyz = Segment(Oxz, Oxyz)
oxyoxyz = Segment(Oxy, Oxyz)
oxyoxyω = Segment(Oxy, Oxyω)
oyωoxyω = Segment(Oyω, Oxyω)
oxωoxyω = Segment(Oxω, Oxyω)
oxzoxzω = Segment(Oxz, Oxzω)
oxωoxzω = Segment(Oxω, Oxzω)
ozωoxzω = Segment(Ozω, Oxzω)
oyωoyzω = Segment(Oyω, Oyzω)
oyzoyzω = Segment(Oyz, Oyzω)
ozωoyzω = Segment(Ozω, Oyzω)
oωoyω = Segment(Oω, Oyω)
oxyzoxyzω = Segment(Oxyz, Oxyzω)
oxyωoxyzω = Segment(Oxyω, Oxyzω)
oxzωoxyzω = Segment(Oxzω, Oxyzω)
oyzωoxyzω = Segment(Oyzω, Oxyzω)
ooz = Segment(O, Oz)
ooω = Segment(O, Oω)
ooy = Segment(O, Oy)
axis_x = Ray(O, I)
axis_y = Ray(O, J)
axis_z = Ray(O, K)
axis_ω = Ray(O, L)
process = 11 (slider from -1 to 11, step 1)