Curso de Basic
Curvas de Bézier


  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:   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.


MARMSX/CURSOS/Basic