Personagens Modulares
Escrito no dia 15 de Fevereiro, 2011, por dardna em Design de Comunicação (gráfico), Grafismos Especializados.
[gallery /]
Numa primeira abordagem pareceu-me importante o desafio de pensar uma alternativa para o sistema de Identicons como forma de reconhecimento visual cujos resultados permitam identificação (no seu sentido total). Assim, mais do que pensar numa solução que resolvesse 300000 situações, prefiro não encontrar um limite tangível (apontar para o infinito?).
Os insectos surgiram rapidamente como o personagem que naturalmente oferece mais variações: são conhecidas milhares de espécies e outras tantas estão por descobrir. Por outro lado, no contexto digital/informático, estão sempre em relação com a ideia de “bug” (falha). Lembrei-me pouco depois que não era completamente inocente esta solução pois já tinha uma imagem em mente que acabei por identificar.
Avancei então com um gerador de insectos (ou antes, insectos e aranhas, que não são bem a mesma coisa). Tencionava também incluir estruturas semelhantes a minhocas, larvas e centopeias mas não tive tempo (ainda) e teria de contornar uma ou outra dificuldade no código (points e contours de path no shoebot).
Código nodebox/shoebot:
"""
Aranha (2 partes) ou Insecto (3 partes) de tamanho variável
6 ou 8 patas variáveis (8 se for aranha)
2 olhos variáveis ou mais se for aranha
1 a 3 pares variáveis de mandibulas
0 a 2 pares variáveis de antenas se for insecto
0 a 2 pares variáveis de asas se for insecto
"""
# devolve valor relativo a proporção (importado do Processing)
def map(value,istart,istop,ostart,ostop):
return ostart+(ostop-ostart)*((value-istart)/(istop-istart))
# devolve a distancia entre dois pontos
def distance(x0,y0,x1,y1):
from math import sqrt,pow
return sqrt(pow(x1-x0,2)+pow(y1-y0,2))
# devolve coordenadas de um ponto a uma distancia e angulo de outro
def rel_coordinates(x0,y0,distance,angle):
from math import radians,sin,cos
x1=x0+cos(radians(angle))*distance
y1=y0+sin(radians(angle))*distance
return x1,y1
# devolve o angulo entre dois pontos
def angle(x0,y0,x1,y1):
from math import degrees,atan2
a=degrees( atan2(y1-y0,x1-x0) )
return a
# oval a partir do centro
def oval_from_center(x,y,w,h,drawing=True):
x=x-w/2
y=y-h/2
if drawing==True:
oval(x,y,w,h)
else:
return oval(x,y,w,h,draw=False)
# devolve lista de partes, proporção (tamanho) de cada parte
def parts(parts_number,start_x,start_y,length,angle):
parts=list() # (size_x,size_y,rad_size,brightness)
head_size=random(.15,.45)/(parts_number-1)
head_width=random(.9,1.1)*head_size
head_rad=random(2.1,3.) # falsos radius (menores)
parts.append((head_size,head_width,head_rad,random(-.25,.25)))
tor_size=0
if parts_number==3:
tor_size=random(.1,.45)
tor_width=random(.85,1.5)*head_size
tor_rad=random(2.1,3.)
parts.append((tor_size,tor_width,tor_rad,random(-.25,.25)))
abd_size=1-head_size-tor_size
abd_width=random(1.25*head_size,abd_size*.75)
abd_rad=random(2.1,3.)
parts.append((abd_size,abd_width,abd_rad,random(-.25,.25)))
parts.reverse() # tails first
return parts
size(400,400)
colormode(HSB)
background(1)
# Cores ternárias
main_color=random(0.,1.)
alt_color=main_color+.33 if main_color+.330 else main_color+.66
# Inicio e fim do insecto, opções
body_start=(random(0,WIDTH),random(0,HEIGHT))
body_end=None
while body_end==None or distance(body_start[0],body_start[1],body_end[0],body_end[1])