Ferramentas de Utilizador

Ferramentas de Site


algoritmo:curvas_de_bezier

Curvas de Bezier

As curvas de bezier são linhas curvas geradas através de binómios, podendo ter quantos pontos de inflexão o programador desejar e sendo criada por um determinado número de pontos.

Linhas simples

Considerem que querem criar uma linha que ligue um ponto A(x1,y1) a um ponto B(x2,y2). Tendo uma variável a, sendo que 0 <= a <= 1, é possível criar essa linha da seguinte forma:

para (a=0, a<1, a=a+k) {
   b=1-a
   x=b*x1+a*x2
   y=b*y1+a*y2
}

sendo x e y as coordenadas de um dos pontos da linha e sendo que quanto menor for k maior será o número de pontos que constitui, sendo a linha constituída por 1/k pontos.

Curvas

Depois de entender como fazer uma linha, está na altura de entender como fazer uma curva. A primeira coisa a decidir é o número de pontos de inflexão desejados.

Curvas com um ponto de inflexão

Considerando que queremos criar uma curva entre A(xA,yA) e C(xC,yC) com um ponto de inflexão definido pelo ponto B(xB,yB).

O ponto de inflexão não está em B, B apenas serve para o definir, como pode ser visto na imagem: http://www.gamedev.net/reference/programming/features/curvessurfaces/curveQuadratic.gif

O que teremos é um código muito semelhante ao anterior, só que em vez de usarmos um polinómio de primeiro grau (b+a), utilizamos um polinómio de 2º grau (b²+2ba+a²), sendo que o nosso código passa a ser:

para (a=0, a<1, a=a+k) {
   b=1-a
   x=b^2*xA+2*a*b*xB+a^2*xC
   y=b^2*yA+2*a*b*yB+a^2*yC
}

Curvas com mais do que um ponto de inflexão

Para utilizar mais pontos de inflexão, é só usar um polinómio da forma (a+b)^k, sendo k-1 o número de pontos de inflexão. Para deduzir o polinómio é aconselhável usar o Binómio de Newton

É de notar que nas curvas de Bezier quanto maior for o número de pontos de inflexão, menores estes se tornam, tornando a curva cada vez mais próxima de uma recta. Para resolver este problema é necessário usar outras técnicas mais avançadas.
algoritmo/curvas_de_bezier.txt · Esta página foi modificada pela última vez em: 2018/05/14 21:37 (Edição externa)