mathr / blog / #

Polyhedra

Polyhedra

More fun with Fluxus - I've been learning how to use (build-polygons), where you define the vertices that make up the faces (and the normals to the faces which control lighting). I had a heck of a time getting the tetrahedron working, I found that (recalc-normals) didn't work in a way that was suitable. The function (hint-normal) shows the normals as red lines, so you can check they are pointing in the right directions, very helpful. Once I got used to it, making an octahedron was much easier.

(define (pow a b) (exp (* (log a) b)))

(define (build-octahedron)
  (let ((ob (build-polygons 24 2))
        (L (pow (/ 1 3) (/ 1 3)) )
        (-L (- 0 (pow (/ 1 3) (/ 1 3))))
       )

    (grab ob)

    (pdata-set "p"  0 (vector  1  0  0))
    (pdata-set "p"  1 (vector  0  1  0))
    (pdata-set "p"  2 (vector  0  0  1))

    (pdata-set "p"  3 (vector  1  0  0))
    (pdata-set "p"  4 (vector  0  0  1))
    (pdata-set "p"  5 (vector  0 -1  0))

    (pdata-set "p"  6 (vector  1  0  0))
    (pdata-set "p"  7 (vector  0 -1  0))
    (pdata-set "p"  8 (vector  0  0 -1))

    (pdata-set "p"  9 (vector  1  0  0))
    (pdata-set "p" 10 (vector  0  0 -1))
    (pdata-set "p" 11 (vector  0  1  0))

    (pdata-set "p" 12 (vector -1  0  0))
    (pdata-set "p" 13 (vector  0  0  1))
    (pdata-set "p" 14 (vector  0  1  0))

    (pdata-set "p" 15 (vector -1  0  0))
    (pdata-set "p" 16 (vector  0 -1  0))
    (pdata-set "p" 17 (vector  0  0  1))

    (pdata-set "p" 18 (vector -1  0  0))
    (pdata-set "p" 19 (vector  0  0 -1))
    (pdata-set "p" 20 (vector  0 -1  0))

    (pdata-set "p" 21 (vector -1  0  0))
    (pdata-set "p" 22 (vector  0  1  0))
    (pdata-set "p" 23 (vector  0  0 -1))


    (pdata-set "n"  0 (vector  L  L  L))
    (pdata-set "n"  1 (vector  L  L  L))
    (pdata-set "n"  2 (vector  L  L  L))

    (pdata-set "n"  3 (vector  L -L  L))
    (pdata-set "n"  4 (vector  L -L  L))
    (pdata-set "n"  5 (vector  L -L  L))

    (pdata-set "n"  6 (vector  L -L -L))
    (pdata-set "n"  7 (vector  L -L -L))
    (pdata-set "n"  8 (vector  L -L -L))

    (pdata-set "n"  9 (vector  L  L -L))
    (pdata-set "n" 10 (vector  L  L -L))
    (pdata-set "n" 11 (vector  L  L -L))

    (pdata-set "n" 12 (vector -L  L  L))
    (pdata-set "n" 13 (vector -L  L  L))
    (pdata-set "n" 14 (vector -L  L  L))

    (pdata-set "n" 15 (vector -L -L  L))
    (pdata-set "n" 16 (vector -L -L  L))
    (pdata-set "n" 17 (vector -L -L  L))

    (pdata-set "n" 18 (vector -L -L -L))
    (pdata-set "n" 19 (vector -L -L -L))
    (pdata-set "n" 20 (vector -L -L -L))

    (pdata-set "n" 21 (vector -L  L -L))
    (pdata-set "n" 22 (vector -L  L -L))
    (pdata-set "n" 23 (vector -L  L -L))

    (finalise)

    (ungrab)

    ob

  )
)