Algoritmos de Interseções de Curvas de Bézier com Uma Aplicação à Localização de Raízes de Equações Rodrigo L.R. Madureira Programa de Pós-Graduação em Informática, PPGI, UFRJ 21941-590, Cidade Universitária, Ilha do Fundão, Rio de Janeiro, RJ E-mail: [email protected] Mauro Antonio Rincon Luis Menasche Schechter Departamento de Ciência da Computação, IM, UFRJ 21941-590, Cidade Universitária, Ilha do Fundão, Rio de Janeiro, RJ E-mail: [email protected], [email protected] Resumo: As curvas de Bézier receberam essa denominação a partir do trabalho do engenheiro francês Pierre Bézier Etienne (1919-1999) com sistemas CADCAM na Renault, no início dos anos 60. Um pouco antes, Paul De Casteljau, um físico e matemático da Citröen, já havia desenvolvido métodos matemáticos equivalentes para essas curvas, muito importantes na área de Computação Gráfica, já que muitos softwares disponíveis no mercado utilizam este conceito [1]. Os principais algoritmos para localizar interseções entre duas curvas de Bézier encontrados na literatura são: Subdivisão Recursiva de De Casteljau, Subdivisão Intervalar adotado por Koparkar e Mudur [4] e Bézier Clipping [2]. A proposta deste trabalho trata do estudo e análise comparativa dos três algoritmos para o cálculo de interseções entre duas curvas de Bézier, seguidos de um estudo de uma aplicação destes algoritmos para o cálculo de raízes reais de funções (não necessariamente polinomiais). 1. Curvas de Bézier 1.1. Definição Seja n ≥ 1 um número inteiro. A curva de Bézier de grau n, Qn(t), definida por n + 1 pontos de controle P0, P1, ..., Pn é uma curva definida parametricamente dada por: n Qn (t) = ∑ Bin (t)Pi , (1) i =0 no domínio 0 ≤ t ≤ 1, t ∈ ℝ, onde: n Bin (t) = (1 − t) n −i t i , 0 ≤ i ≤ n, (2) i são as funções-base denominadas Polinômios de Bernstein. A Figura 1 mostra um exemplo de curva de Bézier de grau 3. 1.2. Principais características Algumas características importantes das curvas de Bézier são [1]: 1. Para curvas de Bézier de grau n ≥ 2, o polígono formado pelos pontos de controle P0, P1, ... , Pn formará o polígono de controle. A Figura 1 mostra uma curva cúbica e seu respectivo polígono de controle. 153 2. O ponto inicial P0 e o ponto final Pn são denominados pontos extremos do polígono de controle, pois se localizam nas extremidades dele. Os pontos P1, P2, ... , Pn – 1 são denominados pontos intermediários ou interiores do polígono de controle. 3. Os pontos extremos do polígono de controle também são extremidades da curva. Assim, P0 = Qn(0) e Pn = Qn(1). 4. Propriedade do fecho convexo: a curva sempre estará contida no fecho convexo do polígono de controle. 5. Propriedade de invariância afim: Qualquer transformação nos pontos de controle implica em transformação na curva. A curva é uma aproximação mais suave do polígono de controle. Assim, a quantidade de vezes que os segmentos do polígono de controle interceptam a curva será no máximo a quantidade destes segmentos. 6. Derivadas da curva de Bézier de grau n nos pontos extremos: Qn′ (0) = n(P1 − P0 ) Qn′ (1) = n(Pn − Pn-1 ) P1 P2 Q3(t) P0 P3 Figura 1: Curva de Bézier de grau 3. 2. Principais algoritmos de interseções de curvas de Bézier 2.1. Subdivisão recursiva de De Casteljau É o processo de divisão de uma curva de Bézier em duas sub-curvas usando o método de De Casteljau. É muito usado quando se quer aproximar uma curva de Bézier por segmentos de reta [1]. Quando os segmentos estão bastante subdivididos, eles devem estar suficientemente próximos de retas. Assim, encontrando o ponto de interseção entre estas retas, encontra-se o ponto de interseção entre as curvas relacionadas a elas. A Figura 2 mostra três iterações. Figura 2: Três iterações da subdivisão recursiva [4]. 154 2.2. Subdivisão intervalar de Koparkar e Mudur Trata-se de um algoritmo semelhante à Subdivisão recursiva de De Casteljau, sendo que neste caso, cada curva é pré-processada para determinar suas tangentes horizontais e verticais apenas nos pontos extremos. Os limites destas tangentes definirão o intervalo. A Figura 3 mostra duas iterações do algoritmo para uma curva de Bézier cúbica. Figura 3: Duas iterações da subdivisão intervalar [4] 2.3. Bézier Clipping Trata-se de um algoritmo proposto em 1990 por Tomoyuki Nishita, professor do Departamento de Engenharia da Universidade de Tóquio, e Thomas W. Sederberg, professor do Departamento de Ciência da Computação da Universidade de Brigham Young, nos Estados Unidos, para o problema da interseção de curvas de Bézier [2]. O funcionamento do algoritmo acontece da seguinte forma: sejam duas curvas de Bézier P(t) e Q(u) e uma fat line L, uma região que representa a fronteira de Q(u). A Figura 4 mostra um exemplo. Figura 4: Fat Line para curva de Bézier cúbica Q(u) no processo de Bézier Clipping [2] P(t) é definida pela equação paramétrica n P (t) = ∑ Pi Bin (t) i =0 A função d(t) é um polinômio interpolador das distâncias d i , 0 ≤ i ≤ n, dos pontos de controle da curva P(t) à fat line L e pode ter a seguinte representação paramétrica na forma Bernstein-Bézier: n D(t) = (t, d(t)) = ∑ D B (t) i =0 i n i Os pontos de controle Di = (t i ,d i ) são igualmente espaçados em t ( t i = i / n ). 155 n Como ∑ (i / n)B i =0 n i (t) = t[(1 − t) + t]n = t , a coordenada horizontal de qualquer ponto D(t) é de fato o parâmetro t. Figura 5: Curva de Bézier para representação Bernstein-Bézier de d(t) [2]. Os valores de t para os quais P(t) se encontra fora de L correspondem aos valores de t para os quais D(t) se encontra abaixo de d min ou acima de d max . Na Figura 5, tem-se que P(t) se encontra fora de L em t < 0.25 e t > 0.75. Dessa forma, chega-se à uma das etapas do algoritmo de Bézier Clipping, que é o recorte das partes da curva P(t) que ficarem nesses intervalos. Essas partes são eliminadas de P(t) [2]. Após o recorte, uma fat line L será aplicada à curva P(t) no intervalo 0.25 ≤ t ≤ 0.75 . O próximo passo é repetir o procedimento aplicado anteriormente para P(t) na curva Q(u), depois P(t) terá um novo recorte contra Q(u) e assim alternando a curva de recorte sucessivamente [2]. No caso de múltiplas interseções, a solução é dividir uma das curvas pela metade e computar as interseções de cada metade com a outra curva [2]. 3. Alguns resultados obtidos para localização de raízes de equações Exemplo 1: Resolver a equação sen(x) = e − x , no intervalo [0, π / 4] , usando o algoritmo de Bézier Clipping. Primeiro, vamos aproximar a função sen(x) por uma curva de Bézier de grau 3 no intervalo dado. Neste caso, os pontos de controle extremos devem ser: P0 = (0,0) e P3 = (π / 4,sen(π / 4)) ≈ (0.785,0.7071). Para calcular os pontos interiores, devemos aplicar as seguintes propriedades de derivadas das curvas de Bézier nos pontos extremos: P '(0) = 3(P1 − P0 ) P '(1) = 3(P3 − P2 ) Estes são os valores dos vetores tangentes à curva normalizados nos seus extremos [3]. 156 Neste exemplo, temos: P’(0) = (0.7071, 0.7071) e P’(1) = (0.816, 0.577). Substituindo os valores, chegamos a: P1 = (0.2357,0.2357); P2 = (0.513,0.5151) Analogamente, para o caso de e− x , chegamos aos seguintes pontos de controle: Q 0 = (0,1); Q1 = (0.236,0.764); Q 2 = (0.482,0.594); Q 3 = (0.785,0.456) . A Figura 6 mostra os gráficos obtidos para as curvas. Figura 6: Aplicação das curvas de Bézier de grau 3 para localização de raízes de equações. Os resultados encontrados para as três primeiras iterações se encontram na seguinte tabela: Iteração 0 1 2 3 tmin 0 0.7515 0.7521 0.7520 tmax 1 0.7650 0.7656 0.7654 umin 0 0.7513 0.7655 0.7668 umax 1 0.7949 0.7836 0.7838 Tabela 1: Resultados para três iterações de Bézier Clipping. Na iteração 3, são colhidos os seguintes resultados para as curvas: Curva P(t): xP(0.7520) ≈ 0.5824; yP(0.7520) ≈ 0.5501; xP(0.7654) ≈ 0.5933; yP(0.7654) ≈ 0.5592; Curva Q(u): xQ(0.7668) ≈ 0.5817; yQ(0.7668) ≈ 0.5582; xQ(0.7838) ≈ 0.5960; yQ(0.7838) ≈ 0.5503; 157 Estes resultados se aproximam do ponto de interseção (0.5885, 0.5551) dado pela solução analítica com precisão de quatro casas decimais. Exemplo 2: Resolver a equação sen(x) = e − x , no intervalo [0, π / 4] , usando o algoritmo da Subdivisão Recursiva de De Casteljau. Os pontos de controle são os mesmos vistos no exemplo 1 para as respectivas curvas. Após cinco iterações, as sub-curvas que se interceptaram foram aproximadas de retas. Para uma reta, foi obtida a equação 0.0131x + 0.0282 y – 0.0231 = 0. Para a outra, foi obtida a equação – 0.0182x + 0.0255y – 0.0037 = 0. Portanto, deve ser resolvido o sistema linear: 0.0131 x + 0.0282 y – 0.0231 = 0 – 0.0182 x + 0.0255 y – 0.0037 = 0 A solução deste sistema com precisão de quatro casas decimais será x ≈ 0.5721, y ≈ 0.5533997. Ou seja, após cinco iterações, os valores já estão relativamente próximos da solução analítica x ≈ 0.5885, y ≈ 0.5551. Exemplo 3: Resolver a equação sen(x) = e − x , no intervalo [0, π / 4] , usando o algoritmo da Subdivisão Intervalar de Koparkar e Mudur. A tabela a seguir mostra os resultados para cinco iterações do algoritmo. Iteração 1 2 3 4 5 t=u 0.5 0.75 0.875 0.8125 0.78125 xP(t) 0.3789 0.5807 0.6828 0.6318 0.6062 yP(t) 0.3699 0.5488 0.6313 0.5907 0.5699 xQ(u) 0.3674 0.5677 0.6740 0.6203 0.5938 yQ(u) 0.6913 0.5660 0.5093 0.5372 0.5515 Tabela 2: Resultados para cinco iterações de Subdivisão Intervalar. Referências [1] Samuel R. Buss, “3-D Computer Graphics – A Mathematical Introduction with OpenGL”, Cambridge University Press, 2003. [2] T. Nishita, T.W. Sederberg, “Curve Intersection Using Bézier Clipping”, pp. 538-549, Computer-Aided Design 22(9), 1990. [3] David Salomon, “Curves and Surfaces for Computer Graphics”, Springer, 2006. [4] T.W. Sederberg, S.R. Parry, “Comparison of Three Curves Intersection Algorithms”, pp. 58-63, Computer-Aided Design Vol. 18. 158