File:Double six.svg

Summary

Description
English: Schläfli's double six configuration — twelve lines with five intersection points per line and two lines per intersection point, intersecting in the pattern of a crown graph — inscribed on a cube, following an illustration by Hilbert and Cohn-Vossen in Geometry and the Imagination.
Date
Source Own work
Author David Eppstein
Other versions
SVG development
InfoField

Source code

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")

Licensing

Public domain I, the copyright holder of this work, release this work into the public domain. This applies worldwide.
In some countries this may not be legally possible; if so:
I grant anyone the right to use this work for any purpose, without any conditions, unless such conditions are required by law.
Category:Self-published work#Double%20six.svgCategory:PD-self#Double%20six.svg Category:Crown graph 6 Category:Files by User:David Eppstein from en.wikipedia Category:Projective geometry
Category:Crown graph 6 Category:Files by User:David Eppstein from en.wikipedia Category:PD-self Category:Projective geometry Category:SVG created also with Adobe Illustrator Category:Self-published work Category:Valid SVG created with Python:Trigonometry