DRAW - 2D transforms




DRAW  rotate

Exemplo de uma rotação de 30º centrada em 0x0:

Da Documentação oficial do Red (com eventuais pequenas mudanças):

Sintaxe

rotate <ângulo> <centro> [<commands>]
rotate 'pen <ângulo> rotate 'fill-pen <ângulo>

<ângulo> :  ângulo em graus (integer! float!).
<centro> : (opcional) centro de rotação (pair!).
<commands> : (opcional) Comandos do dialeto Draw.

Descrição

Define a rotação no sentido horário em um determinado ponto, em graus. Se o centro opcional não for fornecido, a rotação é sobre a origem do atual sistema de coordenadas do usuário. Números negativos podem ser usados ​​para rotação no sentido anti-horário. Quando um bloco é fornecido como último argumento, a rotação será aplicada apenas aos comandos nesse bloco.

Quando as palavras-chave 'pen' ou 'fill-pen' são usadas, a rotação é aplicada respectivamente à caneta atual ou à caneta de preenchimento atual.


Red [needs: view]

view [

       base draw [

           pen red

               box 20x20 50x40 ; retângulo horizontal

               rotate 30 40x40 ; Rotação de 30 graus centrada em 40x40

               pen yellow

               box 20x20 50x40 ; mesmo comando, outro retângulo

               ]

]




DRAW  scale

Exemplo de um scale de 1.2 em ambos os eixos, x e y:

Da Documentação oficial do Red (com eventuais pequenas mudanças):

Sintaxe

scale <scale-x> <scale-y> [<commands>]
scale 'pen <scale-x> <scale-y>
scale 'fill-pen <scale-x> <scale-y>

<scale-x> : escala em X (number!).
<scale-y> : escala em Y (number!).
<commands> : (opcional) Comandos do dialeto Draw.

Descrição

Define os valores da escala. Os valores dados são multiplicadores; use valores maiores que um para aumentar a escala; use valores menores que um para diminuí-lo. Quando um bloco é fornecido como último argumento, o scaling será aplicado apenas aos comandos desse bloco.

Quando as palavras-chave 'pen' ou 'fill-pen' são usadas, a escala será aplicada, respectivamente, à caneta atual ou à caneta de preenchimento atual.

Red [needs: view]

view [

       base draw [

           pen red

               box 20x20 50x40 ; horizontal rectangle

               scale 1.3 1.3 ;30% bigger in both x and y

               pen yellow

               box 20x20 50x40 ; same command, different box

               ]

]




DRAW  translate

Exemplo de uma translação nos eixos x e y:

A translação leva todo o sistema de coordenadas para a nova posição.

Da Documentação oficial do Red (com eventuais pequenas mudanças):

Sintaxe

translate <offset> [<commands>]
translate 'pen <offset>
translate 'fill-pen <offset>

<offset> : quantidades de translação (pair!).
<commands> : (opcional) Comandos do dialeto Draw.

Descrição

Define a origem para os comandos de desenho. Vários comandos de conversão terão um efeito cumulativo. Quando um bloco é fornecido como último argumento, a translação será aplicada apenas aos comandos desse bloco.

Quando as palavras-chave 'pen' ou 'fill-pen' são usadas, a translação é aplicada respectivamente à caneta atual ou à caneta de preenchimento atual.


Red [needs: view]

view [

       base draw [

           pen red

               box 20x20 50x40 ; horizontal rectângulo

               translate 25x25

               pen yellow

               box 20x20 50x40 ; same command, different box

               ]

]




DRAW  skew

Um sistema de coordenadas skewed é quando os eixos não são ortogonais.

O comando skew inclina os eixos x e/ou y um dado número de graus.

Da Documentação oficial do Red (com eventuais pequenas mudanças):

Sintaxe

skew <skew-x> <skew-y> [<commands>] skew 'pen <skew-x> <skew-y>
skew 'fill-pen <skew-x> <skew-y>

<skew-x> : inclinação do eixo X em graus (integer! float!).
<skew-y> : (opcional) inclinação do eixo Y em graus (integer! float!).
<commands> : (opcional) Comandos do dialeto Draw.

Description

Define um sistema de coordenadas inclinado do original pelo número de graus fornecido. Se <skew-y> não for fornecido, será considerado zero. Quando um bloco é fornecido como último argumento, a inclinação será aplicada somente aos comandos nesse bloco.


Quando as palavras-chave 'pen' ou 'fill-pen' são usadas, a inclinação é aplicada respectivamente à caneta atual ou à caneta de preenchimento atual.



Red [needs: view]

view [

       base draw [

               pen yellow                ; só desenha duas flechas

           line 30x30 30x60 25x55

               line 30x60 35x55

               line 30x30 60x30 55x35

               line 60x30 55x25

               pen black                ; só desenha uma grade

               box 0x0 80x80

               line 0x20 80x20 0x20 0x40 80x40 80x60 0x60

               line 20x0 20x80 20x0 40x0 40x80 60x80 60x0

               text 45x5 "X"        

               text 10x40 "Y"

       ]


       base draw [

               skew 20 0 ;inclina o eixo x 20 graus

               pen yellow

           line 30x30 30x60 25x55

               line 30x60 35x55

               line 30x30 60x30 55x35

               line 60x30 55x25

               pen black

               box 0x0 80x80

               line 0x20 80x20 0x20 0x40 80x40 80x60 0x60

               line 20x0 20x80 20x0 40x0 40x80 60x80 60x0

               text 45x5 "X" ;the text does not follow skew!

               text 10x40 "Y"

       ]

       base draw [

               skew 0 20 ; inclina o eixo y 20 graus

               pen yellow

           line 30x30 30x60 25x55

               line 30x60 35x55

               line 30x30 60x30 55x35

               line 60x30 55x25

               pen black

               box 0x0 80x80

               line 0x20 80x20 0x20 0x40 80x40 80x60 0x60

               line 20x0 20x80 20x0 40x0 40x80 60x80 60x0

               text 45x5 "X"

               text 10x40 "Y"

       ]

       base draw [

               skew 20 20 ; inclina os dois eixos 20 graus

               pen yellow

           line 30x30 30x60 25x55

               line 30x60 35x55

               line 30x30 60x30 55x35

               line 60x30 55x25

               pen black

               box 0x0 80x80

               line 0x20 80x20 0x20 0x40 80x40 80x60 0x60

               line 20x0 20x80 20x0 40x0 40x80 60x80 60x0

               text 45x5 "X"

               text 10x40 "Y"

       ]

]





DRAW  transform


Executa a translação, rotação e escala em um único comando. A transformação abaixo usa 0x0 como ponto de ancoragem (ponto de referência), gira 20º, escala para 1,5 em ambos os eixos e translada 20 unidades nos eixos x e y:


Red [needs: view]

view [

       base 120x120 draw [

           pen red

               box 20x20 50x40 ; retângulo horizontal

               transform 0x0 20 1.5 1.5 20x20

               pen yellow

               box 20x20 50x40 ; mesmo comando, outro retângulo

               ]

]




Se um bloco for fornecido como último argumento, essas transformações serão aplicadas apenas aos comandos nesse bloco.

Red [needs: view]

view [

       base 120x120 draw [

           pen red

               box 20x20 50x40 ; primeiro retângulo, vermelho

               transform 0x0 20 1.5 1.5 20x20 [

                       pen yellow

                       box 20x20 50x40 ; segundo retângulo, amarelo

               ]

               pen blue

               box 25x25 55x45 ; terceiro retângulo, azul

               ]

]




Da Documentação oficial do Red (com eventuais pequenas mudanças):

Sintaxe

transform <centro> <ângulo> <scale-x> <scale-y> <translation> [<commands>]
transform 'pen <centro> <ângulo> <scale-x> <scale-y> <translation>
transform 'fill-pen <centro> <ângulo> <scale-x> <scale-y> <translation>

<centro> : (opcional) centro de rotação (pair!).
<ângulo> : ângulo de rotação em graus (integer! float!).
<scale-x> : escala em X (number!).
<scale-y> : escala em Y (number!).
<translation> : valores de translação (pair!).
<commands> : (opcional) Comandos do dialeto Draw.

Descrição

Define uma transformação, como translação, escala e rotação. Quando um bloco é fornecido como último argumento, a transformação será aplicada apenas aos comandos nesse bloco.

Quando as palavras-chave 'pen' ou 'fill-pen' são usadas, a transformação é aplicada respectivamente à caneta atual ou à caneta de preenchimento atual.



DRAW  clip

Limita a área de desenho a um retângulo.

Red [needs: view]

view [

       base

       draw [

                 pen black

               fill-pen red circle 15x40 30

               fill-pen blue circle 30x40 30

               fill-pen yellow circle 45x40 30

               fill-pen cyan circle 60x40 30

               fill-pen purple circle 75x40 30

       ]

       base

       draw [

               clip 10x40 60x70

               pen black

               fill-pen red circle 15x40 30

               fill-pen blue circle 30x40 30

               fill-pen yellow circle 45x40 30

               fill-pen cyan circle 60x40 30

               fill-pen purple circle 75x40 30

       ]

]




Se um bloco é fornecido como último argumento, o recorte é aplicado apenas aos comandos nesse bloco, ou seja, após o bloco, toda a área se torna novamente uma tela.


Da Documentação oficial do Red (com eventuais pequenas mudanças):

Sintaxe

clip <start> <end> <mode> [<commands>]
clip [<shape>] <mode> [<commands>]

<start> : canto superior esquerdo da área de recorte (pair!)
<end> : canto inf. direito da área de recorte (pair!)
<mode> : (opcional) modo de mistura das áreas recortadas (word!)
<commands> : (opcional) Comandos do dialeto Draw.
<shape> : Comandos do dialeto Shape.

Descrição

Define uma região retangular de recorte definida com dois pontos (início e fim) ou uma região com formato arbitrário definida por um bloco de comandos de sub-dialetos Shape. Esse recorte se aplica a todos os comandos subseqüentes do Draw. Quando um bloco é fornecido como último argumento, o recorte será aplicado apenas aos comandos nesse bloco.

Além disso, o modo de combinação entre uma nova região de recorte e a anterior pode ser definido como um dos seguintes:

            • replace (default)
            • intersect
            • union
            • xor
            • exclude


De todos este modos, eu só consegui entender  replace e exclude. Você pode tentar os outros.

Red [needs: view]


view [

       base

       draw [

               line-width 5

               pen red line 0x70 10x80 80x80 80x70 10x0

               pen blue line 0x60 20x80 80x80 80x60 20x0

               pen yellow line 0x50 30x80 80x80 80x50 30x0

               pen cyan line 0x40 40x80 80x80 80x40 40x0

               pen green line 0x30 50x80 80x80 80x30 50x0

               pen purple line 0x20 60x80 80x80 80x20 60x0

               pen gold line 0x10 70x80 80x80 80x10 70x0

               pen pink line 0x0 80x80 80x80


               clip 10x40 60x70 replace ;default

               

               pen red line 0x10 10x0 80x0 80x10 10x80

               pen blue line 0x20 20x0 80x0 80x20 20x80

               pen yellow line 0x30 30x0 80x0 80x30 30x80

               pen cyan line 0x40 40x0 80x0 80x40 40x80

               pen green line 0x50 50x0 80x0 80x50 50x80

               pen purple line 0x60 60x0 80x0 80x60 60x80

               pen gold line 0x70 70x0 80x0 80x70 70x80

               pen pink line 0x80 80x0 80x80


       ]

       base

       draw [

               line-width 5

               pen red line 0x70 10x80 80x80 80x70 10x0

               pen blue line 0x60 20x80 80x80 80x60 20x0

               pen yellow line 0x50 30x80 80x80 80x50 30x0

               pen cyan line 0x40 40x80 80x80 80x40 40x0

               pen green line 0x30 50x80 80x80 80x30 50x0

               pen purple line 0x20 60x80 80x80 80x20 60x0

               pen gold line 0x10 70x80 80x80 80x10 70x0

               pen pink line 0x0 80x80 80x80


               clip 10x40 60x70 exclude

               

               pen red line 0x10 10x0 80x0 80x10 10x80

               pen blue line 0x20 20x0 80x0 80x20 20x80

               pen yellow line 0x30 30x0 80x0 80x30 30x80

               pen cyan line 0x40 40x0 80x0 80x40 40x80

               pen green line 0x50 50x0 80x0 80x50 50x80

               pen purple line 0x60 60x0 80x0 80x60 60x80

               pen gold line 0x70 70x0 80x0 80x70 70x80

               pen pink line 0x80 80x0 80x80


       ]

]




Ou, usando uma imagem:

Red [needs: view]

picture: load %smallballoon.jpeg

view [

       base

       draw [

               line-width 5

               pen red line 0x70 10x80 80x80 80x70 10x0

               pen blue line 0x60 20x80 80x80 80x60 20x0

               pen yellow line 0x50 30x80 80x80 80x50 30x0

               pen cyan line 0x40 40x80 80x80 80x40 40x0

               pen green line 0x30 50x80 80x80 80x30 50x0

               pen purple line 0x20 60x80 80x80 80x20 60x0

               pen gold line 0x10 70x80 80x80 80x10 70x0

               pen pink line 0x0 80x80 80x80


               clip 10x40 60x70 replace ;default

               

               image picture

       ]

       base

       draw [

               line-width 5

               pen red line 0x70 10x80 80x80 80x70 10x0

               pen blue line 0x60 20x80 80x80 80x60 20x0

               pen yellow line 0x50 30x80 80x80 80x50 30x0

               pen cyan line 0x40 40x80 80x80 80x40 40x0

               pen green line 0x30 50x80 80x80 80x30 50x0

               pen purple line 0x20 60x80 80x80 80x20 60x0

               pen gold line 0x10 70x80 80x80 80x10 70x0

               pen pink line 0x0 80x80 80x80


               clip 10x40 60x70 exclude

               

               image picture

       ]

]