Este blog post é a continuação do post O puzzle de uma manta de retalhos: Parte 1.
De acordo com o plano delineado na Parte 1, agora restava atribuir uma cor a cada número utilizado na secção anterior.
O plano era utilizar um rolo do Robert Kaufman (mais sobre o rolo na Parte 1), e no site do produtor é possível ver fotos dos tecidos que vêm no conjunto. Obtive os valores RGB de cada cor, tirando um screenshot do site e utilizando o color pick do Gimp. Agora faltava dizer ao Racket quais as cores que queria utilizar.
Compilei a minha lista de cores:
(define c1 (make-color 246 246 248))
(define c2 (make-color 245 243 231))
(define c3 (make-color 246 246 236))
Fiz o mesmo para as 38 cores.
A colecção de cores que ia utilizar era esta:
Finalmente podia começar a pensar em triângulos. Com Racket pintar um triângulo é tão simples como:
;; draw a equilateral triangle, length 40, and paint it with color red
(triangle 40 "solid" "red")
Faltava apenas desenhar os triângulos e atribuir a cada triângulo a cor que estava presente no mesmo índice da matriz que obtivemos na Parte 1. Ao mesmo tempo, ia rodar cada triângulo 180°, triângulo sim triângulo não, e rodar os triângulos na carreira seguinte na ordem oposta.
;; list of colors defined by me
(define rangeofcolors (vector c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 c16
c17 c18 c19 c20 c21 c22 c23 c24 c25 c26 c27 c28 c29 c30 c31 c32 c33 c34 c35 c36 c37
c38))
;; draw equilateral triangle, length 40, color x
(define (givecolor x)
(triangle 40 "solid" x))
;; draw and rotate 180° equilateral triangle, length 40, color z
(define (givecolor180 z)
(rotate 180 (triangle 40 "solid" z)))
;; get a matrix of 26 rows from Part 1
(define quilt (paint_n_rows 26))
;; paint triangles, but rotate them on [odd rows and even index of quilt]
;; and on [even rows and odd index of quilt]
(define (colorit anyquilt j i)
(if (odd? j)
(if (odd? i)
(givecolor (vector-ref rangeofcolors (vector-ref (list-ref anyquilt j) i)))
;;else
(givecolor180 (vector-ref rangeofcolors (vector-ref (list-ref anyquilt j) i))))
;;else
(if (odd? i)
(givecolor180 (vector-ref rangeofcolors (vector-ref (list-ref anyquilt j) i)))
;;else
(givecolor (vector-ref rangeofcolors (vector-ref (list-ref anyquilt j) i))))))
;; save image (copied straight from stackoverflow ;))
(define (save-pict the-pict name kind)
(define bm (pict->bitmap the-pict))
(send bm save-file name kind))
;; bringing it all together
(define (print-all-pretty)
;;
(let ([result (for/fold ([rows (blank)]) ([j (length quilt)])
;; draw a new picture with each row of triangles
(vc-append
(for/fold ([row2 (blank)]) ([i (vector-length (list-ref quilt j))])
;; draw a new picture of row of each triangle in the specified color
;; and remove white space between triangles
(hc-append -20 (colorit quilt j i) row2))
rows
))])
(begin
(print result)
;; crop image to remove half a triangle on the side edge and save it
(save-pict (crop 20 0 880 1040 (pict->bitmap result)) "triangles.png" 'png)
)))
O resultado final:
Adoro. Assim que vi o resultado final comprei o tecido.
Sinto que devo escrever alguma coisa em relação à minha experiência com Racket, mas uma vez que não tenho experiência nenhuma em programação, não dá para fazer comparações e a minha opinião não tem grande significado. Mas aqui vai: a sintaxe não foi difícil de compreender, mas às vezes perdia-me no meio de tantos parênteses. A documentação é bastante detalhada e se no futuro precisar de fazer algo do género, certamente que voltarei a fazê-lo com Racket. (O meu marido apaixonou-se pela linguagem.)
Em relação à manta de retalhos, vou ter de alterar o número máximo de triângulos e o número de cores porque, depois de receber o tecido no correio, percebi que tinha feito dois erros: primeiro, cada tira de tecido permite cortar apenas 27 triângulos (por causa das orlas do tecido); segundo, o rolo tem 4 cores extra para além das que são mostradas no site do produtor. Mas são alterações simples, nada dramático.
Conto com continuar a escrever actualizações, mas desta vez apenas em relação à manta, o que vai mais de encontro ao tema deste blog.
Já comecei a cortar os triângulos e consigo perceber que este projecto vai estar aqui para durar.
Este processo foi engraçado e espero que ajude alguém no futuro.