Mais sobre os atributos gráficos
Esta página tenta ampliar um pouco o assundo dos atributos gráficos, que são os ajustes que podemos fazer nas formas que desenhamos, mencionados desde os primeiros passos e também quando falamos mais sobre as cores.
Quais são os ajustes que podemos fazer nos atributos gráficos das formas que desenhamos?
- Cor de preenchimento
fill()
ou não-preenchimentono_fill()
, cor de traçostroke()
e não-traçono_stroke()
- As cores podem ser indicadas como uma trinca de números de 0 a 255 (R, G, B) ou ainda com um quarto número que define o * alpha * ou opacidade(R, G, B, A) sendo que * alpha * 0 torna a cor totalmente transparente e 255 totalmente opaca. Se usarmos
color_mode(HSB)
podemos indicar matiz(hue), saturação(saturation) e Brilho(brightness), também com o quarto valor para o * alpha * opcional. - Espessura de traço
stroke_weight()
(não pode ser menor que zero!) - Junções e terminações dos traços
stroke_join()
estroke_caps()
Preservando o estado atual dos atributos (fazendo modificações e depois voltando ao estado anterior)
As funções push_style()
e pop_style()
(ou push()
e pop()
que combinam os primeiros com push_matrix
/pop_matrix
) permitem alterar os atributos gráficos em uso para desenhar(dentro de uma função, por exemplo) e depois devolver os atributos ao que eram antes. Desta forma, uma função pode usar uma cor específica e outra que é a corrente, sem perturbar a segunda.
Lendo o estado atual dos atributos de cor “ativos”
Usando pg = get_graphics()
podemos obter uma referência ao objeto Py5Graphics do sketch, que é a superfície em que estamos desenhando. Podemos consultar pg._instance.fillColor
e pg._instance.strokeColor
para saber as cores que estão atualmente em uso.
Veja um exemplo de uso, uma função que desenha uma pequena seta cuja cabeça é um triângulo preenchido com a mesma cor ‘atual’ do traço(stroke).
def setup():
size(400, 400)
seta_vetor((100, 100), (200, 200))
def setup():
size(400, 400)
stroke(0, 150, 0)
translate(200, 200)
seta_vetor((100, 100))
def seta_vetor(v, origin=(0, 0), head_size=10):
"""
Desenhe uma seta representando um vetor `v`, partindo da origem (0, 0)
ou na posição informada com o argumentos opcional `origin`.
"""
sg = get_graphics()
current_stroke = sg._instance.strokeColor
v = Py5Vector(*v)
body = v.mag
head_size = min(head_size, body / 2)
xo, yo = origin
xh = xo + v.x
yh = yo + v.y
ang = v.heading
xha = xh + cos(ang + QUARTER_PI / 2 + PI) * head_size
yha = yh + sin(ang + QUARTER_PI / 2 + PI) * head_size
xhb = xh + cos(ang - QUARTER_PI / 2 + PI) * head_size
yhb = yh + sin(ang - QUARTER_PI / 2 + PI) * head_size
line(xo, yo, xh, yh) # corpo com tamanho fixo
with push(): # preserva os atributos gráficos atuais
fill(current_stroke) # usa a cor de traço como preenchimento!
no_stroke()
with begin_closed_shape():
vertex(xha, yha)
vertex(xh, yh)
vertex(xhb, yhb)
end_shape(CLOSE)