3D Hilbert Curve
restart;
with(plots):
Arithmetic Representation of a 3D Hilbert Curve
The 3D Hilbert curve defined here was presented by Sagan (cmp. his SFC book, p. 28).
See also (Bader, 2013), Figure 8.2 (left curves).
Definition of the operators H0 to H7 :
H[0] := (x,y,z) -> ( x/2, z/2, y/2);
H[1] := (x,y,z) -> ( z/2, y/2+1/2, x/2);
H[2] := (x,y,z) -> ( x/2+1/2, y/2+1/2, z/2);
H[3] := (x,y,z) -> ( z/2+1/2,-x/2+1/2,-y/2+1/2);
H[4] := (x,y,z) -> (-z/2+1, -x/2+1/2, y/2+1/2);
H[5] := (x,y,z) -> ( x/2+1/2, y/2+1/2, z/2+1/2);
H[6] := (x,y,z) -> (-z/2+1/2, y/2+1/2,-x/2+1);
H[7] := (x,y,z) -> ( x/2, -z/2+1/2,-y/2+1);
Zio2JUkieEc2IkkieUdGJUkiekdGJUYlNiRJKW9wZXJhdG9yR0YlSSZhcnJvd0dGJUYlNiUsJComIyIiIiIiI0YvRiRGL0YvLCQqJkYuRi9GJ0YvRi8sJComRi5GL0YmRi9GL0YlRiVGJQ==
Zio2JUkieEc2IkkieUdGJUkiekdGJUYlNiRJKW9wZXJhdG9yR0YlSSZhcnJvd0dGJUYlNiUsJComIyIiIiIiI0YvRidGL0YvLCYqJkYuRi9GJkYvRi9GLkYvLCQqJkYuRi9GJEYvRi9GJUYlRiU=
Zio2JUkieEc2IkkieUdGJUkiekdGJUYlNiRJKW9wZXJhdG9yR0YlSSZhcnJvd0dGJUYlNiUsJiomIyIiIiIiI0YvRiRGL0YvRi5GLywmKiZGLkYvRiZGL0YvRi5GLywkKiZGLkYvRidGL0YvRiVGJUYl
Zio2JUkieEc2IkkieUdGJUkiekdGJUYlNiRJKW9wZXJhdG9yR0YlSSZhcnJvd0dGJUYlNiUsJiomIyIiIiIiI0YvRidGL0YvRi5GLywmKiZGLkYvRiRGLyEiIkYuRi8sJiomRi5GL0YmRi9GM0YuRi9GJUYlRiU=
Zio2JUkieEc2IkkieUdGJUkiekdGJUYlNiRJKW9wZXJhdG9yR0YlSSZhcnJvd0dGJUYlNiUsJiomIyIiIiIiI0YvRidGLyEiIkYvRi8sJiomRi5GL0YkRi9GMUYuRi8sJiomRi5GL0YmRi9GL0YuRi9GJUYlRiU=
Zio2JUkieEc2IkkieUdGJUkiekdGJUYlNiRJKW9wZXJhdG9yR0YlSSZhcnJvd0dGJUYlNiUsJiomIyIiIiIiI0YvRiRGL0YvRi5GLywmKiZGLkYvRiZGL0YvRi5GLywmKiZGLkYvRidGL0YvRi5GL0YlRiVGJQ==
Zio2JUkieEc2IkkieUdGJUkiekdGJUYlNiRJKW9wZXJhdG9yR0YlSSZhcnJvd0dGJUYlNiUsJiomIyIiIiIiI0YvRidGLyEiIkYuRi8sJiomRi5GL0YmRi9GL0YuRi8sJiomRi5GL0YkRi9GMUYvRi9GJUYlRiU=
Zio2JUkieEc2IkkieUdGJUkiekdGJUYlNiRJKW9wZXJhdG9yR0YlSSZhcnJvd0dGJUYlNiUsJComIyIiIiIiI0YvRiRGL0YvLCYqJkYuRi9GJ0YvISIiRi5GLywmKiZGLkYvRiZGL0YzRi9GL0YlRiVGJQ==
Standard algorithm to compute the Hilbert mapping from this arithmetisation:
hilbert3D := proc(t::numeric, depth::integer)
# t: parameter of the Hilbert mapping
# depth: number of considered octal digits of t
global H;
local q,r;
if depth = 0 then return (0,0,0) end if;
q := floor(8*t); # extract first octal digit
r := 8*t-q; # and compute remainder
# recursive call to rotated/translated Hilbert pattern:
return H[q]( hilbert3D(r,depth-1) );
end proc:
hilbert3D(1/2,5);
NiUiIiIjRiMiIiNGJA==
hilbert3D(1/8,9);
NiUiIiEjIiIiIiIjRiM=
hilbert3D(1/3,5);
NiUjIiNKIiNLRiMjIiImIiM7
hilbert3D(0.99999,10);
NiUjIiNGIiVDNSMiIipGJSMiJCwmIiQ3Jg==
Plotting the approximating polygons of the curve
corners := pointplot3d([[0,0,0],[0,0,1],[0,1,0],[1,0,0]]):
iter := 1:
curve :=
spacecurve( [ seq( [hilbert3D(i/8^iter,8)], i=0..8^iter-1), [0,0,1] ],
axes=BOXED, scaling=CONSTRAINED, thickness=3):
display3d(corners,curve);
LSUnUExPVDNERzYsLSUnUE9JTlRTRzYmNyUkIiIhISIiJCIiISEiIiQiIiEhIiI3JSQiIiEhIiIkIiIhISIiJCIjNSEiIjclJCIiISEiIiQiIzUhIiIkIiIhISIiNyUkIiM1ISIiJCIiISEiIiQiIiEhIiItJSdDVVJWRVNHNiQ3KzclJCIiISEiIiQiIiEhIiIkIiIhISIiNyUkIiIhISIiJCIiJiEiIiQiIiEhIiI3JSQiIiYhIiIkIiImISIiJCIiISEiIjclJCIiJiEiIiQiIiYhIiIkIiImISIiNyUkIiM1ISIiJCIiJiEiIiQiIiYhIiI3JSQiIiYhIiIkIiImISIiJCIiJiEiIjclJCIiJiEiIiQiIiYhIiIkIiM1ISIiNyUkIiIhISIiJCIiJiEiIiQiIzUhIiI3JSQiIiEhIiIkIiIhISIiJCIjNSEiIi0lKlRISUNLTkVTU0c2IyIiJC0mJSZfQVhJU0c2IyIiIjYmLSUmQ09MT1JHNiYlJFJHQkckIiIhISIiJCIiISEiIiQiIiEhIiItJSpMSU5FU1RZTEVHNiMiIiEtJSpUSElDS05FU1NHNiMiIiEtJS1UUkFOU1BBUkVOQ1lHNiMkIiIhISIiLSYlJl9BWElTRzYjIiIjNiYtJSZDT0xPUkc2JiUkUkdCRyQiIiEhIiIkIiIhISIiJCIiISEiIi0lKkxJTkVTVFlMRUc2IyIiIS0lKlRISUNLTkVTU0c2IyIiIS0lLVRSQU5TUEFSRU5DWUc2IyQiIiEhIiItJiUmX0FYSVNHNiMiIiQ2Ji0lJkNPTE9SRzYmJSRSR0JHJCIiISEiIiQiIiEhIiIkIiIhISIiLSUqTElORVNUWUxFRzYjIiIhLSUqVEhJQ0tORVNTRzYjIiIhLSUtVFJBTlNQQVJFTkNZRzYjJCIiISEiIi0lK0xJR0hUTU9ERUxHNiNRKExJR0hUXzM2Ii0lK1BST0pFQ1RJT05HNiwkIikoKioqKipcISIpJCEpeDFycSEiKSQiKSgqKioqKlwhIikkIikoKioqKipcISIpJCIpeDFycSEiKSQiKSgqKioqKlwhIikkISl4MXJxISIpJCIiISEiIiQiKXgxcnEhIikkIiM1ISIiLSUqQVhFU1NUWUxFRzYjJSRCT1hHLSUoU0NBTElOR0c2IyUsQ09OU1RSQUlORURHLSUlUk9PVEc2Jy0lKUJPVU5EU19YRzYjJCIkKyIhIiItJSlCT1VORFNfWUc2IyQiJCsiISIiLSUtQk9VTkRTX1dJRFRIRzYjJCIlK1IhIiItJS5CT1VORFNfSEVJR0hURzYjJCIlK0ghIiItJSlDSElMRFJFTkc2Ig==
Plotting the iterations of the curve
Note that the center of the cube, (1/2, 1/2, 1/2), is not an image of 1/2, but an image of 3/8, for example.
iter := 1;
curve :=
spacecurve( [ seq( [hilbert3D((i+3/8)/8^iter,8)], i=0..8^iter-1) ],
scaling=CONSTRAINED, axes=BOXED, thickness=4):
display3d(corners,curve);
IiIi
LSUnUExPVDNERzYsLSUnUE9JTlRTRzYmNyUkIiIhISIiJCIiISEiIiQiIiEhIiI3JSQiIiEhIiIkIiIhISIiJCIjNSEiIjclJCIiISEiIiQiIzUhIiIkIiIhISIiNyUkIiM1ISIiJCIiISEiIiQiIiEhIiItJSdDVVJWRVNHNiQ3KjclJCIjRCEiIyQiI0QhIiMkIiNEISIjNyUkIiNEISIjJCIjdiEiIyQiI0QhIiM3JSQiI3YhIiMkIiN2ISIjJCIjRCEiIzclJCIjdiEiIyQiI0QhIiMkIiNEISIjNyUkIiN2ISIjJCIjRCEiIyQiI3YhIiM3JSQiI3YhIiMkIiN2ISIjJCIjdiEiIzclJCIjRCEiIyQiI3YhIiMkIiN2ISIjNyUkIiNEISIjJCIjRCEiIyQiI3YhIiMtJSpUSElDS05FU1NHNiMiIiUtJiUmX0FYSVNHNiMiIiI2Ji0lJkNPTE9SRzYmJSRSR0JHJCIiISEiIiQiIiEhIiIkIiIhISIiLSUqTElORVNUWUxFRzYjIiIhLSUqVEhJQ0tORVNTRzYjIiIhLSUtVFJBTlNQQVJFTkNZRzYjJCIiISEiIi0mJSZfQVhJU0c2IyIiIzYmLSUmQ09MT1JHNiYlJFJHQkckIiIhISIiJCIiISEiIiQiIiEhIiItJSpMSU5FU1RZTEVHNiMiIiEtJSpUSElDS05FU1NHNiMiIiEtJS1UUkFOU1BBUkVOQ1lHNiMkIiIhISIiLSYlJl9BWElTRzYjIiIkNiYtJSZDT0xPUkc2JiUkUkdCRyQiIiEhIiIkIiIhISIiJCIiISEiIi0lKkxJTkVTVFlMRUc2IyIiIS0lKlRISUNLTkVTU0c2IyIiIS0lLVRSQU5TUEFSRU5DWUc2IyQiIiEhIiItJStMSUdIVE1PREVMRzYjUShMSUdIVF8zNiItJStQUk9KRUNUSU9ORzYsJCIpKCoqKioqXCEiKSQhKXgxcnEhIikkIikoKioqKipcISIpJCIpKCoqKioqXCEiKSQiKXgxcnEhIikkIikoKioqKipcISIpJCEpeDFycSEiKSQiIiEhIiIkIil4MXJxISIpJCIjNSEiIi0lKkFYRVNTVFlMRUc2IyUkQk9YRy0lKFNDQUxJTkdHNiMlLENPTlNUUkFJTkVERy0lJVJPT1RHNictJSlCT1VORFNfWEc2IyQiJCsiISIiLSUpQk9VTkRTX1lHNiMkIiQrIiEiIi0lLUJPVU5EU19XSURUSEc2IyQiJStSISIiLSUuQk9VTkRTX0hFSUdIVEc2IyQiJStIISIiLSUpQ0hJTERSRU5HNiI=
iter := 2;curve :=
spacecurve( [ seq( [hilbert3D((i+3/8)/8^iter,8)], i=0..8^iter-1) ],
scaling=CONSTRAINED, axes=BOXED, thickness=4):
display3d(corners,curve);
IiIj
LSUnUExPVDNERzYsLSUnUE9JTlRTRzYmNyUkIiIhISIiJCIiISEiIiQiIiEhIiI3JSQiIiEhIiIkIiIhISIiJCIjNSEiIjclJCIiISEiIiQiIzUhIiIkIiIhISIiNyUkIiM1ISIiJCIiISEiIiQiIiEhIiItJSdDVVJWRVNHNiQ3XG83JSQiJEQiISIkJCIkRCIhIiQkIiREIiEiJDclJCIkRCIhIiQkIiREIiEiJCQiJHYkISIkNyUkIiR2JCEiJCQiJEQiISIkJCIkdiQhIiQ3JSQiJHYkISIkJCIkRCIhIiQkIiREIiEiJDclJCIkdiQhIiQkIiR2JCEiJCQiJEQiISIkNyUkIiR2JCEiJCQiJHYkISIkJCIkdiQhIiQ3JSQiJEQiISIkJCIkdiQhIiQkIiR2JCEiJDclJCIkRCIhIiQkIiR2JCEiJCQiJEQiISIkNyUkIiREIiEiJCQiJEQnISIkJCIkRCIhIiQ3JSQiJEQiISIkJCIkdikhIiQkIiREIiEiJDclJCIkRCIhIiQkIiR2KSEiJCQiJHYkISIkNyUkIiREIiEiJCQiJEQnISIkJCIkdiQhIiQ3JSQiJHYkISIkJCIkRCchIiQkIiR2JCEiJDclJCIkdiQhIiQkIiR2KSEiJCQiJHYkISIkNyUkIiR2JCEiJCQiJHYpISIkJCIkRCIhIiQ3JSQiJHYkISIkJCIkRCchIiQkIiREIiEiJDclJCIkRCchIiQkIiREJyEiJCQiJEQiISIkNyUkIiREJyEiJCQiJHYpISIkJCIkRCIhIiQ3JSQiJHYpISIkJCIkdikhIiQkIiREIiEiJDclJCIkdikhIiQkIiREJyEiJCQiJEQiISIkNyUkIiR2KSEiJCQiJEQnISIkJCIkdiQhIiQ3JSQiJHYpISIkJCIkdikhIiQkIiR2JCEiJDclJCIkRCchIiQkIiR2KSEiJCQiJHYkISIkNyUkIiREJyEiJCQiJEQnISIkJCIkdiQhIiQ3JSQiJEQnISIkJCIkdiQhIiQkIiR2JCEiJDclJCIkRCchIiQkIiR2JCEiJCQiJEQiISIkNyUkIiREJyEiJCQiJEQiISIkJCIkRCIhIiQ3JSQiJEQnISIkJCIkRCIhIiQkIiR2JCEiJDclJCIkdikhIiQkIiREIiEiJCQiJHYkISIkNyUkIiR2KSEiJCQiJEQiISIkJCIkRCIhIiQ3JSQiJHYpISIkJCIkdiQhIiQkIiREIiEiJDclJCIkdikhIiQkIiR2JCEiJCQiJHYkISIkNyUkIiR2KSEiJCQiJHYkISIkJCIkRCchIiQ3JSQiJHYpISIkJCIkdiQhIiQkIiR2KSEiJDclJCIkdikhIiQkIiREIiEiJCQiJHYpISIkNyUkIiR2KSEiJCQiJEQiISIkJCIkRCchIiQ3JSQiJEQnISIkJCIkRCIhIiQkIiREJyEiJDclJCIkRCchIiQkIiREIiEiJCQiJHYpISIkNyUkIiREJyEiJCQiJHYkISIkJCIkdikhIiQ3JSQiJEQnISIkJCIkdiQhIiQkIiREJyEiJDclJCIkRCchIiQkIiREJyEiJCQiJEQnISIkNyUkIiREJyEiJCQiJHYpISIkJCIkRCchIiQ3JSQiJHYpISIkJCIkdikhIiQkIiREJyEiJDclJCIkdikhIiQkIiREJyEiJCQiJEQnISIkNyUkIiR2KSEiJCQiJEQnISIkJCIkdikhIiQ3JSQiJHYpISIkJCIkdikhIiQkIiR2KSEiJDclJCIkRCchIiQkIiR2KSEiJCQiJHYpISIkNyUkIiREJyEiJCQiJEQnISIkJCIkdikhIiQ3JSQiJHYkISIkJCIkRCchIiQkIiR2KSEiJDclJCIkdiQhIiQkIiR2KSEiJCQiJHYpISIkNyUkIiR2JCEiJCQiJHYpISIkJCIkRCchIiQ3JSQiJHYkISIkJCIkRCchIiQkIiREJyEiJDclJCIkRCIhIiQkIiREJyEiJCQiJEQnISIkNyUkIiREIiEiJCQiJHYpISIkJCIkRCchIiQ3JSQiJEQiISIkJCIkdikhIiQkIiR2KSEiJDclJCIkRCIhIiQkIiREJyEiJCQiJHYpISIkNyUkIiREIiEiJCQiJHYkISIkJCIkdikhIiQ3JSQiJEQiISIkJCIkdiQhIiQkIiREJyEiJDclJCIkdiQhIiQkIiR2JCEiJCQiJEQnISIkNyUkIiR2JCEiJCQiJHYkISIkJCIkdikhIiQ3JSQiJHYkISIkJCIkRCIhIiQkIiR2KSEiJDclJCIkdiQhIiQkIiREIiEiJCQiJEQnISIkNyUkIiREIiEiJCQiJEQiISIkJCIkRCchIiQ3JSQiJEQiISIkJCIkRCIhIiQkIiR2KSEiJC0lKlRISUNLTkVTU0c2IyIiJS0mJSZfQVhJU0c2IyIiIjYmLSUmQ09MT1JHNiYlJFJHQkckIiIhISIiJCIiISEiIiQiIiEhIiItJSpMSU5FU1RZTEVHNiMiIiEtJSpUSElDS05FU1NHNiMiIiEtJS1UUkFOU1BBUkVOQ1lHNiMkIiIhISIiLSYlJl9BWElTRzYjIiIjNiYtJSZDT0xPUkc2JiUkUkdCRyQiIiEhIiIkIiIhISIiJCIiISEiIi0lKkxJTkVTVFlMRUc2IyIiIS0lKlRISUNLTkVTU0c2IyIiIS0lLVRSQU5TUEFSRU5DWUc2IyQiIiEhIiItJiUmX0FYSVNHNiMiIiQ2Ji0lJkNPTE9SRzYmJSRSR0JHJCIiISEiIiQiIiEhIiIkIiIhISIiLSUqTElORVNUWUxFRzYjIiIhLSUqVEhJQ0tORVNTRzYjIiIhLSUtVFJBTlNQQVJFTkNZRzYjJCIiISEiIi0lK0xJR0hUTU9ERUxHNiNRKExJR0hUXzM2Ii0lK1BST0pFQ1RJT05HNiwkIikoKioqKipcISIpJCEpeDFycSEiKSQiKSgqKioqKlwhIikkIikoKioqKipcISIpJCIpeDFycSEiKSQiKSgqKioqKlwhIikkISl4MXJxISIpJCIiISEiIiQiKXgxcnEhIikkIiM1ISIiLSUqQVhFU1NUWUxFRzYjJSRCT1hHLSUoU0NBTElOR0c2IyUsQ09OU1RSQUlORURHLSUlUk9PVEc2Jy0lKUJPVU5EU19YRzYjJCIkKyIhIiItJSlCT1VORFNfWUc2IyQiJCsiISIiLSUtQk9VTkRTX1dJRFRIRzYjJCIlK1IhIiItJS5CT1VORFNfSEVJR0hURzYjJCIlK0ghIiItJSlDSElMRFJFTkc2Ig==