2.1 INTRODUÇÃO
2.1.1 Primitivas básicas de modelagem
As primitivas básicas de modelagem são as entidades fundamentais que constituirão os modelos sólidos e correspondem aos pontos, linhas e curvas. Os pontos são a base das outras entidades, embora sozinhos não sejam de grande utilidade. As linhas são um dos elementos fundamentais de construção das faces dos sólidos. Com frequência são representadas pelos pontos correspondentes às suas extremidades que podem estar conectadas geométrica e topologicamente a outras linhas e curvas para formar uma face ou elemento. As linhas/retas são fundamentais nos algoritmos de intersecção, conforme será demonstrado mais adiante. Na representação das entidades geométricas, pode-se utilizar mais de uma forma para descrever a primitiva. A representação paramétrica (SANTOS, 2007) da reta mostra- se bastante conveniente:
{
𝑥𝑟 = 𝑥0 + 𝑡̅𝑎 𝑦𝑟 = 𝑦0+ 𝑡̅𝑏 𝑧𝑟= 𝑧0+ 𝑡̅𝑐
(2.1) Nesse caso, é desejável tomar o ponto (𝑥0, 𝑦0, 𝑧0) como o início da linha e o parâmetro 𝑡̅ variando de 0 (início) a 1 (final).
As curvas mais comuns na modelagem de sólidos são as cônicas – correspondentes ao círculo/arco e a elipse. A representação paramétrica do círculo ou do arco é:
{
𝑥𝑐 = 𝑥0+ 𝑟 cos 𝜃 𝑦𝑐 = 𝑦0+ 𝑟 sen 𝜃
𝑧𝑐 = 𝑧0
(2.2) Nesse caso, o ponto (𝑥0, 𝑦0, 𝑧0) corresponde ao centro do círculo/arco e o parâmetro 𝜃 varia de 0 a 2𝜋; ou menos, no caso do arco. Notar que essa equação representa o círculo no plano 𝑥, 𝑦 apenas, entretanto, utilizando-se um eixo de coordenadas local, é possível representar o círculo em qualquer posição e ainda fazer com que a origem do eixo local sempre coincida com o centro do círculo, de forma que 𝑥0, 𝑦0 e 𝑧0 se anulam. Nessa condição, a equação implícita do círculo é:
𝑥𝑐2 + 𝑦𝑐2− 𝑟2 = 0 (2.3)
Trata-se de outra forma de representar matematicamente o círculo.
A elipse é uma forma importante na engenharia, especialmente na mecânica da fratura, tendo em vista que as trincas normalmente são modeladas em formato elíptico – sua equação na forma implícita é (HOFFMANN, 1992):
𝑥2 𝑎𝑒2 +𝑦2
𝑏𝑒2 − 1 = 0 (2.4)
Ao passo que na forma paramétrica é (HOFFMANN, 1992):
𝑥(𝑡) = 𝑎𝑒1 − 𝑡̅2
1 + 𝑡̅2 ; 𝑦(𝑡) = 𝑏𝑒 2𝑡̅
1 + 𝑡̅2 (2.5)
Há ainda a possibilidade de parametrizar pelo ângulo:
𝑥(𝜃) = 𝑥𝑒+ 𝑟 cos(𝜃 + 𝜃0) ; 𝑦(𝜃) = 𝑦𝑒+ 𝑟 sen(𝜃 + 𝜃0) ;
𝑟 = √ 𝑎𝑒2𝑏𝑒2
cos2𝜃 𝑏𝑒2+ 𝑠𝑒𝑛2𝜃 𝑎𝑒2
(2.6)
A figura 2.3 ilustra essas primitivas e a notação de seus parâmetros.
As formas paramétricas são adequadas para a segmentação de curvas, por sua vez úteis nos algoritmos de exibição e intersecção. A exibição de curvas é normalmente aproximada por segmentos de reta, tal como sugerido no manual do OpenGL (JACKIE; DAVIS; DIXON, 1997) – um conhecido software de computação gráfica. A segmentação pode ser feita por meio de incrementos no parâmetro, porém isso seria muito difícil na representação implícita. Contudo, verificar se um ponto coincide com uma curva ou uma superfície é mais fácil na representação implícita. Há
métodos para converter de uma forma de representação para outra. A princípio, todas as curvas e superfícies paramétricas racionais podem ser convertidas para a forma implícita, mas o contrário não é necessariamente verdadeiro (HOFFMANN, 1992).
Figura 2.3 – O círculo e a elipse: duas primitivas de modelagem geométrica.
Fonte: Elaboração do próprio autor
Quando se torna necessário representar curvas de formatos arbitrários, é usual recorrer às curvas de Bézier e às splines. Elas são definidas pela seguinte expressão (PIEGL e TILLER, 1997):
𝑪(𝑡̅) = ∑ 𝐵𝑖,𝑛(𝑡̅)𝑷𝑖
𝑛
𝑖=0
0 ≤ 𝑡̅ ≤ 1 (2.7)
𝐵𝑖,𝑛(𝑡̅) = 𝑛!
𝑖! (𝑛 − 𝑖)!𝑡̅𝑖(1 − 𝑡̅)𝑛−𝑖 (2.8) na qual 𝑪(𝑡̅) e 𝑷𝑖 são os vetores de posição dos pontos da curva e dos pontos de controle, respectivamente. 𝐵𝑖,𝑛 são os polinômios de Bernstein e 𝑛 o número de pontos de controle. Embora as curvas de Bézier ofereçam uma maneira intuitiva de manipulação, sofrem de alguns problemas (PIEG; TILLER, 1997):
• Curvas de elevado grau são requeridas para satisfazer um número alto de restrições, como na interpolação de pontos, por exemplo. Isso as tornam instáveis numericamente;
• Um elevado grau é requerido para ajustar as curvas a um conjunto de pontos – regressão;
• Embora as curvas de Bézier possam ser ajustadas pelos seus pontos de
controle, seu ajuste não é suficientemente local10.
A solução é usar curvas que sejam polinomiais ou racionais por trechos, como se ela fosse uma emenda de várias outras. Dessa forma, é possível ajustar muitos pontos com uma curva de grau baixo, que geralmente tem comportamento melhor para a modelagem e desenho. Um exemplo desse tipo de curva são as B-splines, definidas por (PIEGL e TILLER, 1997):
𝑪(𝑡̅) = ∑ 𝑁𝑖,𝑝(𝑡̅)𝑷𝑖
𝑛
𝑖=0
; α ≤ 𝑡 ≤ β (2.9) onde 𝑁𝑖,𝑝 são as funções de base de grau 𝑝 da B-spline que podem ser calculadas pela fórmula recursiva de Boor, Cox e Mansfield (PIEG; TILLER, 1997):
𝑁𝑖,0(𝑡̅) = {1, 𝑠𝑒 𝑡𝑖 ≤ 𝑡̅ < 𝑡𝑖+1
0, 𝑐𝑎𝑠𝑜 𝑐𝑜𝑛𝑡𝑟á𝑟𝑖𝑜 ; 𝛼 ≤ 𝑡 ≤ 𝛽
𝑁𝑖,𝑝(𝑡) = 𝑡̅ − 𝑡𝑖
𝑡𝑖+𝑝− 𝑡𝑖 𝑁𝑖,𝑝−1(𝑡) + 𝑡𝑖+𝑝+1− 𝑡̅
𝑡𝑖+𝑝+1− 𝑡𝑖+1𝑁𝑖+1,𝑝−1(𝑡)
(2.10)
na qual 𝑡 é o parâmetro da curva, 𝑝 o seu grau, 𝑚 = 𝑛 + 𝑝 + 1 e as variáveis discretas 𝑡𝑘 formam o vetor não-decrescente de knots 𝑇 = {𝑡0, … , 𝑡𝑚}, tipicamente utilizado na forma (PIEGL e TILLER, 1997):
𝑇 = {𝛼, … , 𝛼⏟
𝑝+1
, 𝑡𝑝+1, … , 𝑡𝑚−𝑝−1, 𝛽, … , 𝛽⏟
𝑝+1
}
Esse vetor limita a atuação das funções de base, gerando a propriedade desejável de controle (ou suporte) local, como se pode observar na figura 2.4.
A propriedade de suporte local garante que 𝑁𝑖,𝑝(𝑡̅) = 0 se 𝑡 estiver fora do intervalo [𝑡𝑖, 𝑡𝑖+𝑝+1) (PIEGL; TILLER, 1997). De fato, observa-se na figura 2.4 que as funções de base respeitam essa propriedade. Os valores numéricos do eixo das abcissas marcam os knots, nesse caso 𝑇 = {0,0,0,1,2,3,4,4,5,5,5}. Reparar que a multiplicidade de knots no início e no fim do vetor garante que a B-spline obrigatoriamente passará pelo ponto de controle inicial e final, conforme a figura 2.5:
10 Isso quer dizer que ao se deslocar um ponto de controle da curva, grande parte dela é modificada, ao invés de somente uma região próxima ao ponto manipulado.
Figura 2.4 – Funções de base de segundo grau de uma B-spline.
Fonte: Adaptado de Piegl e Tiller (1997)
Figura 2.5 – Representação de uma B-spline e seu polígono de controle. Reparar que a curva coincide com os pontos inicial e final devido à multiplicidade do knots.
Fonte: Piegl e Tiller (1997)
Se os pontos de controle (𝑷𝒊) forem conhecidos, determinar os pontos da B-spline (𝑪(𝑡̅)) é relativamente simples:
• Define-se um vetor de knots (𝑇) de tamanho 𝑚 + 1 com 𝑝 + 1 multiplicidade nas extremidades. Esse vetor varia de 0 a 1 e pode ser uniformemente espaçado nesse intervalo ou não;
• Para um determinado parâmetro 𝑡̅, encontra-se a i-ésima posição em 𝑇 que respeite 𝑡𝑖 ≤ 𝑡̅ < 𝑡𝑖+1;
• Calcula-se as funções de base não nulas por meio da equação (2.10);
• Por meio da equação (2.9) determina-se o ponto na curva correspondente ao parâmetro 𝑡̅.
Em muitos casos o usuário deseja traçar uma curva por meio da entrada de pontos de interpolação (𝑸𝑘) ao invés de pontos de controle (𝑷𝒊). Conforme a equação (2.9) tem-se:
𝑸𝑘 = 𝑪(𝑡̅𝑘) = ∑ 𝑁𝑖,𝑝(𝑡̅𝑘)𝑷𝑖
𝑛
𝑖=0
(2.11) Primeiramente é preciso criar uma parametrização para a curva. Há três métodos comuns para se fazer isso: igual espaçamento, comprimento da corda e o centrípeto. O método centrípeto é mais adequado que os demais quando os pontos resultam em curvas com trechos de pequeno raio (PIEG; TILLER, 1997):
𝑑̅ = ∑ √|𝑸𝑘− 𝑸𝑘−1|
𝑛
𝑘=1
𝑡̅0 = 0 𝑡̅𝑛 = 1
𝑡̅𝑘 = 𝑡̅𝑘−1+√|𝑸𝑘− 𝑸𝑘−1|
𝑑̅ 𝑘 = 1, … , 𝑛 − 1
(2.12)
Em relação aos knots, pode-se utilizar a técnica da média (PIEG; TILLER, 1997):
𝑡0 = ⋯ = 𝑡𝑝 = 0 𝑡𝑚−𝑝 = ⋯ = 𝑡𝑚 = 1
𝑡𝑗+𝑝 =1
𝑝 ∑ 𝑡̅𝑖
𝑗+𝑝−1
𝑖=𝑗
𝑗 = 1, … , 𝑛 − 𝑝
(2.13)
Reescrevendo a equação (2.11) como:
𝑸 = ℕ𝑷 (2.14)
na qual ℕ é uma matriz formada pelas funções de base, os pontos de controle podem ser encontrados pela resolução do sistema linear (2.14).
Uma extensão das B-splines são as NURBS (Non-Uniform Rational B-Splines) que possuem forma muito parecida com a equação (2.11), porém com um fator que pode ser diferente de 1 no denominador. As NURBS estão presentes na maioria dos softwares de computação gráfica de hoje e o livro de Piegl e Tiller (1997) trata com detalhes esses elementos. Como as NURBS são uma generalização das B-Splines, as funções de NURBS da biblioteca GLU do OpenGL (SHREINER et al., 2013) podem ser utilizadas para exibi-las.
Convém lembrar que as curvas podem ser aproximadas por segmentos de reta e assim representadas, às custas de mais memória.