The basic geometry of this image was created with the following Python script (much of which was copied from the one used for Gray configuration.svg). The transparency effects were added afterwards, using Adobe Illustrator.
from pyx import canvas,path,color
from math import sqrt,tan,asin
pov = (-22.7,7.1,9.3)
x,y,z = 2,1,0
radius = 0.12
scale = 10.0
g = 2.0
h = 2.5
vertexColor = [color.rgb.red]
edgeColor = [color.rgb.black]
cubeColor = [color.rgb.blue]
def distance(p,q):
return sqrt(sum([(p[i]-q[i])**2 for i in (x,y,z)]))
def perspective(loc):
dz = loc[z]-pov[z]
return (loc[x]-pov[x])*scale/dz, (loc[y]-pov[y])*scale/dz
def vertex(p):
lx,ly = perspective(p)
prad = scale*1.1*tan(asin(radius/(distance(p,pov))))
c.fill(path.circle(lx,ly,prad),vertexColor)
def edge(p,q):
lx1,ly1 = perspective(p)
lx2,ly2 = perspective(q)
c.stroke(path.line(lx1,ly1,lx2,ly2),edgeColor)
def cube(p,q):
lx1,ly1 = perspective(p)
lx2,ly2 = perspective(q)
c.stroke(path.line(lx1,ly1,lx2,ly2),cubeColor)
c = canvas.canvas()
def transform(point,spin,flip,mirror,turn):
x,y,z = point
if mirror:
x,y,z = y,x,z
if turn:
x,y,z = -x,-y,z
if flip:
x,y,z = -y,x,-z
for i in range(spin):
x,y,z = y,z,x
return x,y,z
points = set()
lines = set()
for s in (0,1,2):
for f in (0,1):
points.add(transform((0,0,g),s,f,0,0))
for m in (0,1):
for t in (0,1):
points.add(transform((g,g/h,g),s,f,m,t))
points.add(transform((g*h,g,g),s,f,m,t))
lines.add((transform((g*h,g,g),s,f,m,0),
transform((-g*h,-g,g),s,f,m,0)))
for a in (-2,2):
for b in (-2,2):
cube((a,b,-2),(a,b,2))
cube((a,-2,b),(a,2,b))
cube((-2,a,b),(2,a,b))
for p,q in lines:
edge(p,q)
for p in points:
vertex(p)
c.writePDFfile("Double_six")