Curso de Basic
Curvas de Bézier
Você está em: MarMSX >> Cursos >> BASIC
No MSX podemos criar gráficos vetoriais através dos comandos PSET e PRESET para pontos, LINE e DRAW para linhas e CIRCLE para círculos. Entretanto, as curvas de Bézier podem dar mais sofisticação aos desenhos vetoriais no MSX.
A curva de Bézier é uma curva polinomial expressa como a interpolação linear entre alguns pontos representativos, chamados de pontos de controle. É uma curva utilizada em
diversas aplicações gráficas e formatos de imagem vetorial como o SVG. Esse tipo de curva também pode originar Superfícies de Bézier, bastante utilizadas em modelagem tridimensional, animações, design de produtos, engenharia, arquitetura entre outras aplicações [1].
O cálculo da curva de Bézier é baseado no Binômio de Newton e possui a seguinte fórmula:
n
B(t) = Σ (n k) * (1-t)n-k * tk * Pk
k=0
Onde (n k) são os coeficientes binomiais e t varia de 0 a 1.
Antes de começarmos a traçar as curvas de Bézier no MSX, vejamos o concento de Binômio de Newton.
Binômio de Newton
Um binômio é uma expressão algébrica formada pela soma ou diferença de dois termos. Ex: a + b.
O Binômio de Newton permite calcular qualquer exponenciação de um binômio.
A exponenciação n do binômio (x+y) é calculado através da seguinte fórmula:
n
(x+n)n = Σ (n k) * xn-k * yk
k=0
Conforme dito na seção anterior, (n k) são os coeficientes binomiais. Eles são os coeficientes que acompanham a expansão polinomial da exponenciação do binômio.
Para entender melhor, vejamos o seguinte exemplo: seja (x+y)2, temos:
(x+y)2 = x2 + 2xy + y2
Onde os coeficientes binomiais são: 1 2 1. Observe na ilustração abaixo:
1x2 + 2xy + 1y2
Utilizando-se a notação (n k), temos:
(2 0) (2 1) (2 2)
1 2 1
O cálculo do coeficiente (n k) é feito através da seguinte fórmula:
n!
(n k) = ----------
k!(n-k)!
O programa em Basic a seguir irá imprimir todos os coeficientes de um binômio de grau 5, ou seja (x + y)5.
10 N=5
20 IF N=0 THEN DIM BN(1) ELSE DIM BN(N)
30 GOSUB 500
40 FOR I=0 TO N
50 PRINT BN(I);
60 NEXT I
70 END
500 ' Coeficientes binomiais
510 BN(0)=1 : BN(N)=1
520 FOR K=1 TO N-1
530 NF=N : GOSUB 600 : NN=FA
540 NF=K : GOSUB 600 : KK=FA
550 NF=(N-K) : GOSUB 600 : NK=FA
560 BN(K)=NN/(KK*NK)
570 NEXT K
580 RETURN
600 ' Fatorial
610 IF NF<2 THEN FA=1:RETURN
620 FA = 1
630 FOR I=2 TO NF
640 FA = FA * I
650 NEXT I
660 RETURN
Saída:
1 5 10 10 5 1
O programa a seguir escreve o polinômio completo para o grau 5.
05 DEF FN N$(X) = RIGHT$(STR$(X),LEN(STR$(X))-1)
10 N=5
20 IF N=0 THEN DIM BN(1) ELSE DIM BN(N)
30 GOSUB 500
40 FOR I=0 TO N
50 IF BN(I) > 1 THEN PRINT FN N$(BN(I));
60 IF (N-I)>1 THEN PRINT "(X^";FN N$(N-I);")"; ELSE IF (N-I) = 1 THEN PRINT "X";
70 IF I>1 THEN PRINT "(Y^";FN N$(I);")"; ELSE IF I = 1 THEN PRINT "Y";
80 IF I<N THEN PRINT " + ";
90 NEXT I
100 END
500 ' Coeficientes binomiais
510 BN(0)=1 : BN(N)=1
520 FOR K=1 TO N-1
530 NF=N : GOSUB 600 : NN=FA
540 NF=K : GOSUB 600 : KK=FA
550 NF=(N-K) : GOSUB 600 : NK=FA
560 BN(K)=NN/(KK*NK)
570 NEXT K
580 RETURN
600 ' Fatorial
610 IF NF<2 THEN FA=1:RETURN
620 FA = 1
630 FOR I=2 TO NF
640 FA = FA * I
650 NEXT I
660 RETURN
Saída:
(X^5) + 5(X^4)Y + 10(X^3)(Y^2) + 10(X^2)(Y^3) + 5X(Y^4) + (Y^5)
De forma a melhorar o desempenho computacional, será utilizada a fórmula multiplicativa [2]:
k (n+1) * i
(n k) = ∏ ----------
i=1 i
O programa em Basic correspondente é:
10 N=5
20 IF N=0 THEN DIM BN(1) ELSE DIM BN(N)
30 GOSUB 500
40 FOR I=0 TO N
50 PRINT BN(I);
60 NEXT I
70 END
500 ' Coeficientes binomiais
510 BN(0)=1 : BN(N)=1
520 FOR K=1 TO N-1
530 BN(K)=1
540 FOR I=1 TO K
550 BN(K) = BN(K)*((N+1)-I)/I
560 NEXT I,K
570 RETURN
Saída:
1 5 10 10 5 1
Curvas de Bézier
Um vez visto o conceito de Binômio de Newton, podemos retornar à fórmula da curva de Bezier e traçar essas curvas na tela do MSX.
Antes de começar, vamos definir as variáveis do programa:
- PC - matriz com os pontos de controle.
- BN - vetor com os coeficientes binômiais calculados.
- NP - Define a quantidade de pontos de controle.
- N - Define o grau do polinômio. Varia de 0 a N.
O programa a seguir traça uma curva de Bézier para três pontos de controle: P0, P1 e P2.
10 SCREEN 2
20 NP=3
30 N=NP-1
40 DIM BN(N) : DIM PC(N,2)
50 FOR I=0 TO N
60 READ PC(I,1), PC(I,2)
70 NEXT I
80 GOSUB 500
100 '
101 ' Curva de bezier
102 '
105 PRESET(PC(0,1), PC(0,2))
110 FOR T=0 TO 1 STEP .1
120 BX=0 : BY=0
130 FOR K=0 TO N
140 F = BN(K)*(1-T)^(N-K)*T^K
150 BX = BX + F*PC(K,1)
160 BY = BY + F*PC(K,2)
170 NEXT K
180 LINE -(BX,BY),15
190 NEXT T
200 GOTO 200
500 '
501 ' Coeficientes binomiais
502 '
510 BN(0)=1 : BN(N)=1
520 FOR K=1 TO N-1
530 BN(K)=1
540 FOR I=1 TO K
550 BN(K) = BN(K)*((N+1)-I)/I
560 NEXT I,K
570 RETURN
1000 '
1001 ' Dados dos PCs
1002 '
1010 DATA 10,100,80,10,150,80
O resultado pode ser visto na figura abaixo:

Onde a curva é desenhada em branco e os pontos de controle em vermelho.
Para desenhar os pontos de controle, modifique o programa anterior da seguinte maneira:
200 FOR I=0 TO N
210 X=PC(I,1) : Y=PC(I,2)
220 LINE(X-3,Y)-(X+3,Y),9
320 LINE(X,Y-3)-(X,Y+3),9
330 NEXT I
340 GOTO 340
Alterando-se as linhas 20 e 1010 para:
20 NP=4
...
1010 DATA 10,100,80,10,120,30,150,80
Passamos a ter 4 pontos de controle. O resultado é:

Fazendo-se uma nova alteração:
20 NP=5
...
1010 DATA 10,100,80,10,120,30,150,80,210,30
Passamos a ter 5 pontos de controle. O resultado é:

A seguinte animação de quatro Curvas de Bézier ilustram a influência dos pontos de controle na curva.

Pontos utilizados:
2 pontos: 1010 DATA 10,100,150,80
3 pontos: 1010 DATA 10,100,80,10,150,80
4 pontos: 1010 DATA 10,100,80,10,120,30,150,80
5 pontos: 1010 DATA 10,100,70,100,80,10,120,30,150,80
Referências:
[1] - Artigo sobre as Curvas de Bezier na Wikipédia, em https://pt.wikipedia.org/wiki/Curva_de_Bézier e https://en.wikipedia.org/wiki/Bézier_curve.
[2] - Artigo sobre os coeficientes binomiais na Wikipédia, em https://en.wikipedia.org/wiki/Binomial_coefficient.