torstai 18. kesäkuuta 2015

Neulekuvion koodaaminen Racket:illä (hih)

#Dime2015 - kurssin FB-ryhmässä keskusteltiin neulekuvioiden tekemisestä Excelillä ja menin sanomaan, että voisikan niitä myös koodata. Päätin todistaa väitteeni ja etsin netistä kivan neulekuvion (kuvassa kuvio B).

Tutkin kuviota tovin ja totesin, että sehän on kivan symmetrinen, tarvitsi vain tehdä yksi elementti ja kiertää sitä eri asentoihin. Tässä on kuvion peruselementti:


Tämän sain aikaan laittamalla erikokoisia ja värisiä neliöitä ja kolmioita vierekkäin ja allekkain. Lopullinen kuvio on tässä:


Ja tässä Racket-koodi, jolla kuvio syntyi:

(require 2htdp/image)
(define COLOR1 "black")
(define COLOR2 "white")
(define COLOR3 "blue")
(define SIVU 10)

(define (perus-pala väri)
  (rectangle SIVU SIVU "solid" väri))

(define (leveä-pala väri)
  (rectangle SIVU (/ SIVU 2) "solid" väri))

(define (korkea-pala väri)
  (rectangle (/ SIVU 2) SIVU "solid" väri))

(define (kolmio-pala väri)
  (flip-vertical (right-triangle SIVU SIVU "solid" väri)))

(define (kulma-kolmio-pala väri)
  (flip-vertical (right-triangle (/ SIVU 2) (/ SIVU 2) "solid" väri)))

(define (kulma-pala väri)
  (rectangle (/ SIVU 2) (/ SIVU 2) "solid" COLOR1))
 
(define V (perus-pala COLOR2))
(define M (perus-pala COLOR1))
(define S (perus-pala COLOR3))
(define PV (korkea-pala COLOR2))
(define PM (korkea-pala COLOR1))
(define PPV (korkea-pala COLOR2))
(define PPM (korkea-pala COLOR1))
(define PVV (leveä-pala COLOR2))
(define PVM (leveä-pala COLOR1))
(define NV (kulma-pala COLOR2))
(define NM (kulma-pala COLOR2))
(define MK (kolmio-pala COLOR1))
(define NMK (kulma-kolmio-pala COLOR1))

(define R1 (beside NM PVM PVV PVV PVV PVV PVV PVV PVM PVM PVM PVV PVV PVM NMK))
(define R2 (beside PM V S S S S S V V M V V M MK))
(define R3 (beside PV S V S S S S S V V V M MK))
(define R4 (beside PV S S V S S S S V V M MK))
(define R5 (beside PV S S S V S S V V M MK))
(define R6 (beside PV S S S S V V V M MK))
(define R7 (beside PV S S S S V V M MK))
(define R8 (beside PV V S S V V M MK))
(define R9 (beside PM V V V V M MK))
(define R10 (beside PM M V V M MK))
(define R11 (beside PM V V M MK))
(define R12 (beside PV V M MK))
(define R13 (beside PV M MK))
(define R14 (beside PM MK))
(define R15 NMK)

(define osa1 (above/align "left" R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15))
(define osa2 (overlay (rotate 180 osa1) osa1))
(define osa3 (beside osa2 (rotate 90 osa2)))
(define osa4 (above osa3 (flip-vertical osa3)))
(define kuvio (beside osa4 osa4 osa4 osa4))

Ei kommentteja:

Lähetä kommentti