- a more comprehensive and interactive taxonomy of 3D polyhedra.
Built using the https://github.com/rm-hull/wireframes library.
(ns wireframes.demo | |
(:require | |
[enchilada :refer [canvas ctx value-of canvas-size]] | |
[wireframes.renderer.canvas :refer [draw-solid ->canvas]] | |
[wireframes.renderer.color :refer [wireframe solid]] | |
[wireframes.transform :refer [combine rotate scale translate degrees->radians]] | |
[wireframes.shapes.primitives :refer [transform-shape]] | |
[wireframes.shapes.curved-solids :refer [make-torus make-wineglass make-sphere make-isosphere | |
make-mobius-strip make-klein-bottle make-klein-bagel]] | |
[wireframes.shapes.platonic-solids :refer [cube tetrahedron icosahedron dodecahedron]] | |
[wireframes.shapes.elite :refer [cobra-mk3]] | |
[inkspot.color :refer [coerce]] | |
[big-bang.core :refer [big-bang]] | |
[monet.canvas :refer [get-context fill-rect fill-style]] | |
[jayq.core :refer [show]])) | |
(def width (first (canvas-size))) | |
(def height (second (canvas-size))) | |
(defn inflate [shape multiplier] | |
((transform-shape (scale multiplier)) shape)) | |
(def shape | |
(-> | |
(condp = (keyword (value-of :shape "torus")) | |
:torus (make-torus 1 3 30 30) | |
:wineglass (make-wineglass 20) | |
:sphere (make-sphere 3 30) | |
:isosphere (make-isosphere 3 2) | |
:mobius-strip (make-mobius-strip 50 10) | |
:klein-bottle (make-klein-bottle 6 2 2 40) | |
:klein-bagel (make-klein-bagel 2 40) | |
:cobra cobra-mk3 | |
:cube cube | |
:tetrahedron tetrahedron | |
:icosahedron icosahedron | |
:dodecahedron dodecahedron) | |
(inflate (js/parseFloat (value-of :scale 1))))) | |
(def style | |
(keyword (value-of :style :transparent))) | |
(def color | |
(coerce (value-of :color :white))) | |
(def color-fn | |
(condp = style | |
:transparent (wireframe color style) | |
:translucent (wireframe color style) | |
:opaque (wireframe color style) | |
:shaded (solid color))) | |
(defn render-shape | |
"Draws the shape at the given state of the world (the x,y,z rotation angles)" | |
[[x y z]] | |
(-> ctx | |
(fill-style "rgba(255,255,255,0.75") | |
(fill-rect { :x 0 :y 0 :w width :h height})) | |
((->canvas ctx) | |
(partial draw-solid | |
{:style style | |
:focal-length 3 | |
:color-fn color-fn | |
:shape shape | |
:transform (combine | |
(rotate :x (degrees->radians x)) | |
(rotate :y (degrees->radians y)) | |
(rotate :z (degrees->radians z)) | |
(translate 0 0 16))}) | |
[width height])) | |
(defn update-state | |
"Increment/decrement the rotation angles around the x,y and z axes" | |
[event [x y z]] | |
[(+ x 0.3) (- y 0.7) (+ z 0.5)]) | |
(-> | |
ctx | |
(fill-style :white) | |
(fill-rect {:x 0 :y 0 :w width :h height})) | |
(show canvas) | |
(big-bang | |
:initial-state [0 0 0] | |
:on-tick update-state | |
:to-draw render-shape) |
Built using the https://github.com/rm-hull/wireframes library.
(ns wireframes.shapes.elite | |
(:use [wireframes.transform :only [point]])) | |
(def cobra-mk3 | |
{:points (mapv (partial apply point) [ | |
[40 0.0 95] | |
[-40 0.0 95] | |
[00 32.5 30] | |
[-150 -3.8 -10] | |
[150 -3.8 -10] | |
[-110 20 -50] | |
[110 20 -50] | |
[160 -10 -50] | |
[-160 -10 -50] | |
[0 32.5 -50] | |
[-40 -30 -50] | |
[40 -30 -50] | |
[-45 10 -55] | |
[-10 15 -55] | |
[10 15 -55] | |
[45 10 -55] | |
[45 -15 -55] | |
[10 -20 -55] | |
[-10 -20 -55] | |
[-45 -15 -55] | |
[-2 -2 95] | |
[-2 -2 112.5] | |
[-100 -7.5 -55] | |
[-100 7.5 -55] | |
[-110 0 -55] | |
[100 7.5 -55] | |
[110 0 -55] | |
[100 -7.5 -55] | |
[2 -2 95] | |
[2 -2 112.5] | |
[2 2 95] | |
[2 2 112.5] | |
[-2 2 95] | |
[-2 2 112.5]]) | |
:polygons (mapv #(hash-map :vertices %) [ | |
[2 1 0] | |
[0 1 10 11] | |
[6 2 0] | |
[0 4 6] | |
[0 11 7 4] | |
[1 2 5] | |
[5 3 1] | |
[1 3 8 10] | |
[5 2 9] | |
[2 6 9] | |
[5 8 3] | |
[7 6 4] | |
[9 6 7 11 10 8 5] | |
[14 15 16 17] | |
[12 13 18 19] | |
[25 26 27] | |
[24 23 22] | |
[21 29 28 20] | |
[31 29 28 30] | |
[32 30 31 33] | |
[21 33 32 20] | |
[20 29 31 33]])}) | |
; Data points - attribution: http://karlstanley.net/examples/canvas/shape_simple.js |