Referência Rápida do SeExpr

Esta página detalhada todas as variáveis, funções e operadores disponíveis no SeExpr. É uma versão bastante editada da documentação do utilizador oficial, sendo adaptada para ser usada no Krita.

Veja também

Variáveis

Variáveis externas

Estas variáveis são fornecidas pelas aplicações externas, neste caso o Krita. Estas são registadas na ajuda de auto-completação do SeExpr, à qual poderá aceder com o Ctrl+Espaço.

$u, $v

Posição do pixel em coordenadas normalizadas.

$w, $h

Largura e altura da imagem em pixels.

Variáveis Locais

As variáveis locais podem ser definidas no início da expressão:

$a = noise($P);
$b = noise($a * 1);
pow($a, 0.5) + $b

As variáveis externas também podem ser sobrepostas com atribuições locais. Isto pode ser útil para ajustar a escala da frequência do ruído, por exemplo:

$P = $P * 10; # aumentar a frequência do ruído
fbm(vnoise($P) + $P/4)

Poderá também definir variáveis com espaços de nomes, p.ex.:

$A::a = $u * 10;

Estruturas de Controlo

O SeExpr oferece a famosa estrutura condicional if:

if ($ u > 0.5) {
    $cor = [0, 0, 1];
}
else {
    $cor = [1, 0, 0];
}

$cor

E o operador ternário:

$u = $i < .5 ? 0.0 : 10.0

Poderá encadear à vontade os operadores ternários, p.ex.:

$cor = $u < .5 ? ($v < 0.5 ? [0, 0, 1] : [1, 0, 0]) : [0, 1, 0];
$cor

Também poderá obter o mesmo com as estruturas if:

if ($ u > 0.5) {
    if ($v < 0.5) {
        $cor = [0, 0, 1];
    }
    else {
        $cor = [1, 0, 0];
    }
}
else {
    $cor = [1, 0, 0];
}

$cor

Operadores (apresentados por prioridade decrescente)

[a,b,c]

construtor de vectores

$P[ n ]

acesso a componente do vector

Dica

O n deve ser 0, 1 ou 2, p.ex.:

$P[0]
^

expoente

Nota

Igual à função pow.

!

NÃO lógico

~

inversão

Dica

~$A

dá o mesmo resultado que:

1 - $A
*/ %

multiplicação, divisão, módulo

Nota

O % é igual à função fmod.

+-

adição, subtracção

<> <= >=

comparação: menor que, maior que, menor ou igual a, maior ou igual a

Nota

Só usa o primeiro componente de um vector.

== !=

igualdade, desigualdade

&&

E lógico

||

OU lógico

?:

operador if ternário

Dica

Exemplo:

$u < .5 ? 0 : 1
->

aplicação - A função à direita da seta é aplicada à expressão à esquerda.

Dica

Exemplos:

$Cs->contrast(.7) -> clamp(0.2,0.8)
$u->hsi(20,1.2,1,$Cs->gamma(1.2))

Operadores de Atribuição

Para além da instrução básica de atribuição:

$xpto = $xpto2

também poderá fazer atribuições de operadores como por exemplo:

$xpto += $xpto2;

o que é equivalente a:

$xpto = $xpto + $xpto2;

Adicionalmente, existem:

  • +=

  • -=

  • /=

  • %=

  • *=

  • ^=

Comentários

Poderá adicionar comentários ao seu programa se usar o carácter #. O SeExpr irá então ignorar o resto da linha para fins de desenho. Contudo, eles não são ignorados; os comentários podem à mesma ser usados para declarar o intervalo de valores válido para as variáveis inteiras, fraccionárias e vectoriais. Isto permite-lhe geri-las com controlos gráficos que irão aceitar o intervalo indicado.

Dica

O $var0 é uma variável inteira que varia entre 0 e 10, inclusive:

$var0 = 0; # 0, 10

$var1 é uma variável de vírgula flutuante com o mesmo intervalo:

$var1 = 0; # 0.000, 10.000

$var2 é um variável de vector:

$var2 = [0, 0, 0] # 0.000, 10.000

A última é muito útil; o SeExpr considera os vectores com um intervalo [0, 1] como cores:

# este é um vermelho escuro
$cor = [0.5, 0, 0] # 0.000, 1.000

Em todos os casos, se não for indicado, o intervalo dos controlos associados vai de 0 a 1.

Para uma expressão em várias linhas, cada uma pode ter o seu próprio comentário.

Funções de Registo

float printf ( string formato, [param0, param1, …] )

Imprime um texto no “stdout” formatado da forma indicada. Os parâmetros de formatação possíveis são o %f para números fraccionários (usa o primeiro componente de um argumento vectorial) ou %v para um vector.

Dica

Por exemplo, se escrever:

$u = printf("teste %f %v",[1,2,3],[4,5,6]);

iria obter na sua consola:

teste 1 [4,5,6]
string sprintf ( string formato, [double|string, double|string, …] )

Devolve um texto formatado a partir dos valores indicados. Veja os detalhes do formato em man sprintf.

Funções de Cores, Máscaras e Associações

float bias ( float x, float b)

A variação do gama, onde o parâmetro de controlo vai de 0 a 1 com os valores > 0.5 a elevar a curva e os valores < 0.5 a baixar a curva. Definido como pow(x, log(b)/log(0.5)).

float boxstep ( float x, float a )
float gaussstep ( float x, float a, float b )
float linearstep ( float x, float a, float b )
float smoothstep ( float x, float a, float b )

As funções de passo são iguais a zero para x < a e um para x > b (ou x > a no caso do “boxstep”).  Entre a e b, o valor varia de forma contínua entre zero e um.  A função gausstep usa a curva em «sino» Gaussiana normal, que se baseia numa curva exponencial. A função smoothstep usa uma curva cúbica.  Intuitivamente, o gausstep tem uma transição mais forte perto do um e uma transição mais suave perto do zero, enquanto o smoothstep tem uma suavidade média perto do um e do zero.

float clamp ( float x, float inf, float sup )

Restringe o x ao intervalo [inf, sup].

float compress ( float x, float inf, float sup )

Comprime o intervalo dinâmico de [0, 1] para [inf, sup].

float contrast ( float x, float c )

Ajusta o contraste. Para um c de 0 a 0.5, o contraste é diminuído. Para o c > 0.5, o contraste é aumentado.

float expand ( float x, float inf, float sup )

Expande o intervalo dinâmico de [inf, sup] para [0, 1].

float fit ( float x, float a1, float b1, float a2, float b2 )

Mapeamento linear de [a1..x..b1] a [a2..x..b2]

float gamma ( float x, float g)

pow(x, 1/g)

float invert ( float x )

Inverte o valor. Definido como 1 - x.

color hsi ( color x, float h, float s, float i, float mapa=1 )

A função hsi desvia a matiz em h (em graus) e ajusta a escala da saturação e intensidade em s e i respectivamente. Poderá ser indicado um mapa que irá controlar o desvio - o desvio completo irá acontecer quando o mapa for igual a 1 e não ocorrerá nenhum desvio quando o mapa for zero. O desvio será ajustado à escala para os valores entre zero e um.

color hsltorgb ( color hsl )
color rgbtohsl ( color rgb )

Conversão do espaço de cores RGB para HSL. O HSL corresponde a Matiz, Saturação e Luminosidade (todos no intervalo [0, 1]). Estas funções também foram estendidas para suportar os valores de RGB e HSL fora do intervalo [0, 1] de forma razoável. Para qualquer valor de RGB ou HSL (excepto os valores negativos), a conversão está bem-definida e é reversível.

color midhsi ( color x, float h, float s, float i, float mapa, float corte=1, int interp=0 )

A função midhsi é igual à hsi, excepto que o mapa de controlo está centrado em torno do ponto médio (valor igual a 0.5) e pode ajustar a escala do desvio em ambas as direcções. No ponto médio, não existe qualquer desvio. Em 1.0 ocorre o desvio total e, em 0.0, ocorre o desvio inverso na totalidade. Os controlos de corte e interp são fornecidos para ajustar o mapa com a função remap. Os valores predefinidos de corte e interp resultam em não ser aplicado o mapeamento.

float mix ( float a, float b, float alfa )

Mistura do “a” e do “b” de acordo com o alfa. Definido como a*(1-alfa) +b*alfa.

float remap ( float x, float origem, float intervalo, float corte, int interp )

Função geral de mapeamento. Quando o x se encontra no ± intervalo da origem, o resultado é um. O resultado é igual a zero para além de uma distância de corte desse intervalo. A forma de corte é controlada pela interp.

Nota

Poderá usar valor numéricos ou constantes com nomes:

  • int linear = 0

  • int suave = 1

  • int gaussiano = 2

Funções de Ruído

float cellnoise ( vector v )
float cellnoise1 ( float x )
float cellnoise2 ( float x, float y )
float cellnoise3 ( float x, float y, float z )
color ccellnoise ( vector v )

O cellnoise gera um campo de cubos coloridos constantes com base na localização inteira. Isto é igual à função “cellnoise” do PRMan.

Nota

O ccellnoise devolve o ruído em células de cores.

float fbm ( vector v, int oitavas=6, float lacunas=2, float ganho=0.5 )
float cfbm ( vector v, int oitavas=6, float lacunas=2, float ganho=0.5 )
float vfbm ( vector v, int oitavas=6, float lacunas=2, float ganho=0.5 )
float fbm4 ( vector v, int oitavas=6, float lacunas=2, float ganho=0.5 )
float cfbm4 ( vector v, int oitavas=6, float lacunas=2, float ganho=0.5 )
float cfbm4 ( vector v, int oitavas=6, float lacunas=2, float ganho=0.5 )

O fbm (Fractal Brownian Motion - Movimento Fractal de Brown) é uma função de ruído multi-frequências. A frequência de base é igual à da função noise. O número total de frequências é controlado pelas oitavas. As lacunas é o intervalo entre as frequências - um valor de 2 significa que cada oitava é duas vezes a frequência anterior. O ganho controla qual o ajuste da escala de cada frequência face à frequência anterior.

Nota

O cfbm e o cfbm4 devolvem o ruído da cor.

O vfbm e o vfbm4 devolvem o ruído do vector.

float hash ( float base1, [float base2, …] )

Como o rand, mas sem valores de base internos. Poderá indicar qualquer número de valores de base e o resultado será uma função aleatória com base em todos os valores de base.

float noise ( vector v )
float noise ( float x, float y )
float noise ( float x, float y, float z )
float noise ( float x, float y, float z, float w )
color cnoise ( vector v)
color cnoise4 ( vector v, float t)
float pnoise ( vector v, vector periodo )
float snoise ( vector v)
float snoise4 ( vector v, float t)
vector vnoise (vector v )
vector vnoise4 (vector v, float t )

O noise é uma função aleatório que mistura suavemente amostras em localizações inteiras. Esta é a função de ruído original de Ken Perlin.

Nota

O cnoise e o cnoise4 devolvem o ruído da cor.

O noise4 devolve ruído vectorial com sinal.

O pnoise devolve um ruído periódico.

O snoise e o snoise4 devolvem um ruído com sinal no intervalo [-1, 1].

O vnoise devolve um ruído vectorial com sinal.

float rand ( [float min, float max], [float base] )

Número aleatório entre [min, max] (ou [0, 1] se não for indicado). Se for indicado um valor de base, será usado para além dos valores de base internos pode ser usado para criar vários geradores distintos.

float turbulence ( vector v, int oitavas=6, float lacunas=2, float ganho=0.5 )
float cturbulence ( vector v, int oitavas=6, float lacunas=2, float ganho=0.5 )
float vturbulence ( vector v, int oitavas=6, float lacunas=2, float ganho=0.5 )

O turbulence é uma variante do fbm em que é retirado o valor absoluto de cada termo do ruído. Isto gera uma aparência mais ondulada.

float voronoi ( vector v, int tipo=1, float desvio=0.5, float fbmEscala=0, int fbmOitavas=4, float fbmLacunas=2, float fbmGanho=0.5)
float cvoronoi ( vector v, int tipo=1, float desvio=0.5, float fbmEscala=0, int fbmOitavas=4, float fbmLacunas=2, float fbmGanho=0.5)
float pvoronoi ( vector v, int tipo=1, float desvio=0.5, float fbmEscala=0, int fbmOitavas=4, float fbmLacunas=2, float fbmGanho=0.5)

O voronoi é um padrão de ruído celular. É uma variante com desvio do cellnoise. O parâmetro “tipo” descreve diferentes variantes da função de ruído. O parâmetro desvio controla quão irregular é o padrão (0 é como o “cellnoise” normal). Os parâmetros do fbm... podem ser usados para distorcer o campo do ruído. Quando o fbmEscala é zero (por omissão), não há qualquer distorção. Os restantes parâmetros são os mesmos da função fbm.

Dica

Tipos de Voronoi de 1 a 5:

|imagem0| |imagem1| |imagem2| |imagem3| |imagem4|

Nota

O cvoronoi devolve uma cor aleatória para cada célula e o pvoronoi devolve a localização do ponto no centro da célula.

Funções de Selecção

float choose ( float indice, float opcao1, float opcao2, […] )

Escolha uma das opções indicadas com base no índice (assume-se que está no intervalo de [0, 1]).

int cycle ( int indice, int intervaloInf, int intervaloSup )

Circula pelos valores entre “intervaloInf” e “intervaloSup” com base no índice fornecido. Esta é uma função mod do deslocamento. O resultado é calculado como intervaloInf + valor % (intervaloSup-intervaloInf+1).

int pick ( float indice, int intervaloInf, int intervaloSup, [ float pesos, … ] )

Escolhe os valores aleatoriamente entre “intervaloInf” e “intervaloSup” com base no índice fornecido (que é disperso de forma automática). Os valores serão distribuídos de acordo com os pesos indicados. Todos os pesos não indicados assumem-se como sendo iguais a 1.0.

float wchoose ( float indice, float opcao1, float peso1, float opcao2, float peso2, […] )

Escolhe uma das opções fornecidas com base no índice (que se assume no intervalo [0, 1]). Os valores serão distribuídos de acordo com os pesos indicados.

Dica

Este exemplo devolve valores inteiros entre e 1 e 10:

pick(valor, 1, 10)

Este exemplo devolve os valores 1 e 2 com uma frequência duas vezes e duas vezes e meia mais elevada, respectivamente, face aos outros valores (3-10):

pick(valor, 1, 10, 2, 2.5)

Este exemplo devolve 10, 11 e 13 até 20 (o 12 é ignorado devido ao seu peso zero):

pick(valor, 10, 20, 1, 1, 0)

Constantes e Funções Matemáticas Gerais

float PI
float PI = 3.14159...
float E
float E = 2.71828...
float abs ( float x)

Valor absoluto de x.

float cbrt ( float x )

Raiz cúbica.

float ceil ( float x )

Valor inteiro arredondado por excesso.

float exp ( float x )

E elevado ao expoente x.

float floor ( float x )

Valor inteiro arredondado por defeito.

float fmod ( float x, float y )

Resto de x / y.

Nota

Também conhecido como o operador %.

float log ( float x )

Logaritmo natural.

float log10 ( float x )

Logaritmo de base 10.

float max ( float a, float b )

O valor máximo entre a e b.

float min ( float a, float b )

O valor mínimo entre a e b.

float pow ( float x, float y )

x elevado ao expoente y.

Nota

Também conhecido como o operador ^.

float round ( float x )

Inteiro mais próximo.

float sqrt ( float x )

Raiz quadrada.

float trunc ( float x )

Inteiro mais próximo em direcção a zero.

Funções Trigonométricas

float acos ( float x )

Arco-coseno.

float acosd ( float x )

Arco-coseno em graus.

float acosh ( float x )

Arco-coseno hiperbólico.

float asin ( float x )

Arco-seno.

float asind ( float x )

Arco-seno em graus.

float asinh ( float x )

Arco-seno hiperbólico.

float atan ( float x )

Arco-tangente.

float atand ( float x )

Arco-tangente em graus.

float atan2 ( float y, float x)

Arco-tangente de y/x entre -PI e PI.

float atan2d ( float y, float x )

Arco-tangente em graus de y/x entre -180º e 180º.

float atanh ( float x )

Arco-tangente hiperbólica.

float cos ( float x )

Coseno.

float cosd ( float x )

Coseno em graus.

float cosh ( float x )

Coseno hiperbólico.

float deg ( float x )

Conversão de radianos para graus.

float hypot ( float x, float y )

Comprimento do vector 2D [x, y].

float rad ( float x )

Conversão de graus para radianos.

float sin ( float x )

Seno.

float sind ( float x )

Seno em graus.

float sinh ( float x )

Seno hiperbólico.

float tan ( float x )

Tangente.

float tand ( float x )

Tangente em graus.

float tanh ( float x )

Tangente hiperbólica.

Funções Vectoriais

float angle ( vector a, vector b )

O ângulo entre dois vectoers (em radianos).

vector cross ( vector a, vector b )

Produto vectorial.

float dist ( vector a, vector b )

Distância entre dois pontos.

float dot ( vector a, vector b)

Produto interno de vectores.

float length ( vector v )

Comprimento do vector.

vector norm ( vector v )

O vector escalado ao comprimento da unidade.

vector ortho ( vector a, vector b )

O vector ortográfico a dois vectores.

vector rotate ( vector v, vector eixo, float angulo )

Roda o v em torno do eixo no angulo indicado (em radianos).

vector up ( vector v, vector cima )

Roda o v de forma que o eixo dos Y aponte para a direcção cima indicada.

Suporte Vectorial

Os Vectores (pontos, cores ou vectores 3D) podem ser associados a escalares (valores símples de vírgula flutuante). Se for usado um valor escalar num contexto vectorial, será replicado nos três componentes, p.ex. 0.5 transforma-se em [0.5, 0.5, 0.5].

Se for usado um vector num contexto escalar, só é usado o primeiro componente. Um dos benefícios disto é que todas as funções que são definidas para funcionar com valores escalares estendem-se automaticamente aos vectores. Por exemplo, o pick, choose, cycle, spline, etc., irão funcionar bem com vectores.

Os operadores aritméticos como o +, *, etc., e as funções escalares são aplicados componente a componente de cada vector. Por exemplo, se aplicar a função gamma a um mapa, ajusta o gama de todos os três canais de cores.

Funções de Curvas

A interpolação dos valores dos parâmetros a um conjunto de pontos de controlo é controlada pelas seguintes funções.

color ccurve ( float param, float pos0, color val0, int interp0, float pos1, color val1, int interp1, […] )

Faz uma interpolação da rampa de cores indicada pelos pontos de controlo em param. Os pontos de controlo são indicados pelos grupos de três parâmetros pos_i, val_i e interp_i.

Dica

Os códigos de interpolação são:

  • 0 - nenhum

  • 1 - linear

  • 2 - suave

  • 3 - curva

  • 4 - curva monótona (não-oscilante)

float curve ( float param, float pos0, float val0, int interp0, float pos1, float val1, int interp1, […] )

Interpola uma rampa em 1D definida pelos pontos de controlo em param. Os pontos de controlo são definidos com os grupos de três parâmetros pos_i, val_i e interp_i.

Dica

Os códigos de interpolação são:

  • 0 - nenhum

  • 1 - linear

  • 2 - suave

  • 3 - curva

  • 4 - curva monótona (não-oscilante)

float spline ( float param, float y1, float y2, float y3, float y4, […] )

Faz a interpolação de um conjunto de valores para o parâmetro indicado em que os valores y1, …, yn estão distribuídos de forma uniforme de [0, 1].

“Plugins” Personalizados

Poderão ser criadas funções personalizadas em C++ e carregadas como um ou mais “plugins” dinâmicos. Veja como Criar “Plugins” de Expressões Personalizados para ver mais detalhes.

Aviso

Esta funcionalidade não é suportada no Krita.