# Curvas de Bézier

Nesta folha de trabalho calculamos curvas de Bézier de grau arbitrário

A função minmax receve uma lista L de números e devolve uma lista contendo apenas dois elementos: os números mínimo e máximo (em esta ordem) de L. Será usada depois para definir os limites do gráfico.

minmax(L) :=
(
    m: L[1],
    M: L[1],
    for x in L do
    (
        if x < m then m:x,
        if x > M then M:x
    ),
    [m,M]
)$ 

A função Bézier receve uma lista de n pontos e, a partir deles, calcula e desenha a curva de Bézier de grau n-1 definida por eles.

Bezier(P) := 
(
    f(t) := (1-t)*p + t*q, 
    X: makelist(ev(f(t), [p=P[i][1], q=P[i+1][1]]), i, 1, length(P)-1),   
    Y: makelist(ev(f(t), [p=P[i][2], q=P[i+1][2]]), i, 1, length(P)-1),
    while length(X) > 1 do
    (
        X: makelist(ev(f(t), [p=X[i], q=X[i+1]]), i, 1, length(X)-1),
        Y: makelist(ev(f(t), [p=Y[i], q=Y[i+1]]), i, 1, length(Y)-1)
    ),
    mx: minmax(makelist(P[i][1], i, 1, length(P))),
    my: minmax(makelist(P[i][2], i, 1, length(P))),
    wxplot2d([[parametric, X[1], Y[1], [t, 0, 1]], [discrete, P]], [x, mx[1]-0.2, mx[2]+0.2], [y, my[1]-0.2, my[2]+0.2])
)$

Bezier([ [0, 0.3], [1/2, 0], [1/2, 1], [1, 0.5], [1,0], [2,0] ]);