Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Computação Gráfica Parte3, Notas de estudo de Aplicações de Ciências da Computação

Apostilas de Computação sobre a Computação Gráfica, Traçadores Digitais, Dispositivos de Video Vetoriais (Vector Refresh Display Tubes), Primitivas de Software para Dispositivos Vetoriais, Dispositivos Gráficos Matriciais.

Tipologia: Notas de estudo

2013

Compartilhado em 11/12/2013

Futebol13
Futebol13 🇧🇷

4.5

(204)

196 documentos

1 / 37

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
Cap´ıtulo 7
Recorte de Primitivas 2D
a vimos que um “pacote gr´afico” atua como intermedi´ario entre o aplicativo (e o seu modelo/estrutura de
dados interna) e o hardware de visualiza¸ao. Sua fun¸ao ´e aproximar primitivas matem´aticas (“ideais”),
descritas em termos de ertices num sistema de coordenadas cartesianas, por conjuntos de pixels com a
cor ou n´ıvel de cinza apropriado. Estes pixels ao armazenados num bitmap na mem´oria da CPU, ou num
frame buffer (mem´oria de imagem no controlador do dispositivo. At´e o momento estudamos, de maneira
ao extensiva, alguns algoritmos asicos para convers˜ao matricial utilizados por pacotes gr´aficos. Vamos
estudar agora alguns algoritmos para clipping [recorte] de primitivas. (O “recorte” ´e necess´ario para que
a imagem “apare¸ca” dentro do retˆangulo de visualiza¸ao definido para ela.
Existem arias abordagens para o processo de clipping. Uma ecnica ´obvia ´e recortar a primi-
tiva antes da convers˜ao matricial, calculando analiticamente suas intersec¸oes com o retˆangulo de re-
corte/visualiza¸ao [clip rectangle]. Estes pontos de intersec¸ao ao ent˜ao usados para definir os novos
ertices para a vers˜ao recortada da primitiva. A vantagem, evidente, ´e que o processo de convers˜ao
matricial precisa tratar apenas da vers˜ao recortada da primitiva, cuja ´area pode ser muito menor que a
original. Esta ´e a ecnica mais freq¨uentemente utilizada para recortar segmentos de reta, retˆangulos e
pol´ıgonos, e os algoritmos que vamos estudar ao baseados nesta estrat´egia.
Outra estrat´egia seria converter todo o pol´ıgono, mas tra¸car apenas os pixels vis´ıveis no retˆangulo de
visualiza¸ao [scissoring ]. lsto pode ser feito checando as coordenadas de cada pixel a ser escrito contra
os limites do retˆangulo. Na pr´atica, existem maneiras de acelerar o processo que evitam o teste de cada
pixel individualmente. Se o teste dos limites puder ser feito rapidamente [por hardware especializado,
por exemplo], esta abordagem pode ser mais eficiente que a anterior, e tem a vantagem de ser extens´ıvel
a regi˜oes de recorte arbitr´arias.
7.1 Recorte de segmentos de reta
Figura 7.1: Exemplos de recorte de segmentos de reta.
Vamos estudar especificamente o processo de recorte de segmentos de reta contra retˆangulos. Segmen-
tos que interceptam uma regi˜ao de recorte retangular, depois de recortados, ao sempre transformados
num ´unico segmento. Segmentos que est˜ao sobre a fronteira do retˆangulo de recorte ao considerados
como dentro dele, e portanto devem ser mostrados (Figura 7.1).
78
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25

Pré-visualização parcial do texto

Baixe Computação Gráfica Parte3 e outras Notas de estudo em PDF para Aplicações de Ciências da Computação, somente na Docsity!

Cap´ıtulo 7

Recorte de Primitivas 2D

J´a vimos que um “pacote gr´afico” atua como intermedi´ario entre o aplicativo (e o seu modelo/estrutura de dados interna) e o hardware de visualiza¸c˜ao. Sua fun¸c˜ao ´e aproximar primitivas matem´aticas (“ideais”), descritas em termos de v´ertices num sistema de coordenadas cartesianas, por conjuntos de pixels com a cor ou n´ıvel de cinza apropriado. Estes pixels s˜ao armazenados num bitmap na mem´oria da CPU, ou num frame buffer (mem´oria de imagem no controlador do dispositivo. At´e o momento estudamos, de maneira n˜ao extensiva, alguns algoritmos b´asicos para convers˜ao matricial utilizados por pacotes gr´aficos. Vamos estudar agora alguns algoritmos para clipping [recorte] de primitivas. (O “recorte” ´e necess´ario para que a imagem “apare¸ca” dentro do retˆangulo de visualiza¸c˜ao definido para ela. Existem v´arias abordagens para o processo de clipping. Uma t´ecnica ´obvia ´e recortar a primi- tiva antes da convers˜ao matricial, calculando analiticamente suas intersec¸c˜oes com o retˆangulo de re- corte/visualiza¸c˜ao [clip rectangle]. Estes pontos de intersec¸c˜ao s˜ao ent˜ao usados para definir os novos v´ertices para a vers˜ao recortada da primitiva. A vantagem, evidente, ´e que o processo de convers˜ao matricial precisa tratar apenas da vers˜ao recortada da primitiva, cuja ´area pode ser muito menor que a original. Esta ´e a t´ecnica mais freq¨uentemente utilizada para recortar segmentos de reta, retˆangulos e pol´ıgonos, e os algoritmos que vamos estudar s˜ao baseados nesta estrat´egia. Outra estrat´egia seria converter todo o pol´ıgono, mas tra¸car apenas os pixels vis´ıveis no retˆangulo de visualiza¸c˜ao [scissoring]. lsto pode ser feito checando as coordenadas de cada pixel a ser escrito contra os limites do retˆangulo. Na pr´atica, existem maneiras de acelerar o processo que evitam o teste de cada pixel individualmente. Se o teste dos limites puder ser feito rapidamente [por hardware especializado, por exemplo], esta abordagem pode ser mais eficiente que a anterior, e tem a vantagem de ser extens´ıvel a regi˜oes de recorte arbitr´arias.

7.1 Recorte de segmentos de reta

Figura 7.1: Exemplos de recorte de segmentos de reta.

Vamos estudar especificamente o processo de recorte de segmentos de reta contra retˆangulos. Segmen- tos que interceptam uma regi˜ao de recorte retangular, depois de recortados, s˜ao sempre transformados num ´unico segmento. Segmentos que est˜ao sobre a fronteira do retˆangulo de recorte s˜ao considerados como dentro dele, e portanto devem ser mostrados (Figura 7.1).

7.1.1 Recorte de Pontos Extremos

Antes de discutir o problema do recorte de segmentos de reta, vamos considerar o problema mais simples de recortar pontos extremos. Se a fronteira do retˆangulo de recorte tem coordenada x no intervalo xmin e xmax, e coordenada y no intervalo ymin e ymax, ent˜ao 4 desigualdades precisam ser satisfeitas para que um ponto (x, y) esteja dentro do retˆangulo de recorte:

xmin ≤ x ≤ xmax ymin ≤ y ≤ ymax (7.1)

7.1.2 Algoritmo de Cohen-Sutherland para Recorte de Segmentos de Reta

Para recortar um segmento de reta, precisamos considerar apenas os seus pontos extremos, e n˜ao os infinitos pontos no interior. Se ambas as extremidades est˜ao dentro do retˆangulo de visualiza¸c˜ao (AB na Figura 7.1), toda a linha est´a dentro do retˆangulo e pode ser tra¸cada (neste caso diz-se que a reta foi trivialmente aceita). Se apenas uma das extremidades est´a dentro (CD na Figura 7.1), a linha intercepta o retˆangulo de visualiza¸c˜ao, e o ponto de intersec¸c˜ao precisa ser calculado. Se ambas as extremidades est˜ao fora, a linha pode ou n˜ao interceptar o retˆangulo, e precisamos verificar se as intersec¸c˜oes existem e onde est˜ao. Uma estrat´egia de for¸ca bruta seria checar a linha contra cada aresta do retˆangulo de visualiza¸c˜ao, para localizar um eventual ponto de intersec¸c˜ao. Se existe um, a linha corta o retˆangulo, e est´a parcialmente dentro dele. Para cada linha e cada aresta do retˆangulo, tomamos as duas retas (matematicamente infinitas) que as cont´em, e calculamos a intersec¸c˜ao entre elas. A seguir, testamos se este ponto ´e interior

  • ou seja, se est´a dentro do retˆangulo de visualiza¸c˜ao e da linha. Se este ´e o caso, existe uma intersec¸c˜ao com o retˆangulo de visualiza¸c˜ao. Na Figura 7.1, os pontos de intersec¸c˜ao G′^ e H′^ s˜ao interiores, mas I′ e J′^ n˜ao s˜ao. Nesta abordagem, precisamos resolver duas equa¸c˜oes simultˆaneas usando multiplica¸c˜ao e divis˜ao para cada par < aresta, linha >. Entretanto, este ´e um esquema bastante ineficiente, que envolve quantidade consider´avel de c´alculos e testes, e portanto deve ser descartado. O algoritmo de Cohen-Sutherland ´e mais eficiente, e executa testes iniciais na linha para determinar se c´alculos de intersec¸c˜ao podem ser evitados. Primeiramente, verifica pares de pontos extremos. Se a linha n˜ao pode ser trivialmente aceita, s˜ao feitas verifica¸c˜oes por regi˜oes. Por exemplo, duas compara¸c˜oes simples em x mostram que ambos os pontos extremos da linha EF na Figura 7.1 tˆem coordenada x menor que xmin, e portanto est˜ao na regi˜ao a esquerda do retˆangulo de visualiza¸c˜ao (ou seja, fora do semi-plano definido pela aresta esquerda). A consequˆencia ´e que o segmento EF pode ser trivialmente rejeitado, e n˜ao precisa ser recortado ou tra¸cado. Da mesma forma, podemos rejeitar trivialmente linhas com ambos os extremos em regi˜oes a direita de xmax, abaixo de ymin e acima de ymax. Se o segmento n˜ao pode ser trivialmente aceito ou rejeitado, ele ´e subdividido em dois segmentos por uma aresta de recorte, um dos quais pode ser trivialmente rejeitado. Dessa forma, um segmento ´e recortado interativamente testando-se aceita¸c˜ao ou rejei¸c˜ao trivial, sendo subdividido se nenhum dos dois testes for bem-sucedido, at´e que o segmento remanescente esteja totalmente contido no retˆangulo ou totalmente fora dele. Para executar os testes de aceita¸c˜ao ou rejei¸c˜ao trivial, as arestas do retˆangulo de visualiza¸c˜ao s˜ao estendidas de forma a dividir o plano do retˆangulo de visualiza¸c˜ao em 9 regi˜oes [Figura 7.2]. A cada regi˜ao ´e atribu´ıdo um c´odigo de 4 bits, determinado pela posi¸c˜ao da regi˜ao com rela¸c˜ao aos semi-planos externos `as arestas do retˆangulo de recorte. Uma maneira eficiente de calcular os c´odigos resulta da observa¸c˜ao de que o bit 1 ´e igual ao bit de sinal de (ymax − y); o 2 ´e o bit de sinal de (y − ymin); o 3 ´e o bit de sinal de (xmax − x), e o 4 e o de (x − xmin).
    • 1 ◦^ bit: semiplano acima da aresta superior y > ymax
    • 2 ◦^ bit: semiplano abaixo da aresta inferior y < ymin
    • 3 ◦^ bit: semiplano a direita da aresta direita x > xmax
    • 4 ◦^ bit: semiplano a esquerda da aresta esquerda x < xmin

A cada extremidade do segmento de reta ´e atribu´ıdo o c´odigo da regi˜ao a qual ela pertence. Esses c´odigos s˜ao usados para determinar se o segmento est´a completamente dentro do retˆangulo de visualiza¸c˜ao ou em um semiplano externo a uma aresta. Se os 4 bits dos c´odigos das extremidades s˜ao iguais a zero, ent˜ao a linha est´a completamente dentro do retˆangulo. Se ambas as extremidades estiverem no semi plano externo a uma aresta em particular, como para EF na Figura 7.1, os c´odigos de ambas as extremidades tem o bit correspondente `aquela aresta igual a 1. Para EF, os c´odigos s˜ao 0001 e 1001, respectivamente,

A linha EI requer mais itera¸c˜oes. O primeiro extremo, E, tem c´odigo 0100 e ´e escolhido pelo algoritmo como ponto externo. O c´odigo ´e testado para obter a primeira aresta que a linha cruza, no caso a aresta inferior, e EI ´e recortado para FI. Na segunda itera¸c˜ao, FI n˜ao pode ser trivialmente aceito ou rejeitado. O c´odigo da primeira extremidade, F, ´e 0000, de forma que o algoritmo escolhe o ponto externo I, cujo c´odigo ´e 1010. A primeira aresta interceptada ´e a superior, resultando no segmento FH. O c´odigo de H ´e 0010, e a terceira itera¸c˜ao resulta num corte pela aresta direita. O segmento resultante ´e trivialmente aceito e tra¸cado na quarta itera¸c˜ao. O Algoritmo 7.1 e 7.2 ilustram este procedimento. Este algoritmo n˜ao ´e o mais eficiente - como os testes e recorte s˜ao executados numa ordem fixa, eventualmente ser˜ao feitos recortes desnecess´arios. Por exemplo, quando a intersec¸c˜ao com uma aresta do retˆangulo ´e uma “intersec¸c˜ao externa”, que n˜ao est´a na fronteira do retˆangulo de visualiza¸c˜ao (ponto H na linha EI, Figura 7.4). Existem algoritmos mais eficientes (v. Foley, 3.12), mas este ainda ´e o mais utilizado, por ser simples e bastante conhecido.

typedef enum {LEFT = 0, RIGHT = 1, BOTTOM = 2, TOP = 3} aresta; typedef enum {TRUE, FALSE} boolean; typedef boolean outcode;

/* Retorna TRUE se todos os outcodes em codigo sao FALSE, e

  • FALSE c.c. */ boolean Vazio(outcode codigo[]);

/* Retorna TRUE se a interseccao logica entre codigo1 e codigo

  • 2 e vazia, e FALSE c.c. */ boolean InterseccaoVazia(outcode codigo0[], outcode codigo1 []);

/* Retorna TRUE se codigo0 e codigo 1 sao iguais, e FALSE c.c. */ boolean Igual(outcode codigo0[], outcode codigo1[]);

/* Calcula outcode para ponto (x,y) */ void CalculaOutCode(float x, float y, outcode codigo[]) { int i;

for (i - LEFT; i < = TOP; i++) codigo[i] = FALSE; /* Fim for / if (y > YMAX) codigo[TOP] = TRUE; else if (y < YMIN) codigo[BOTTOM] = TRUE; / Fim se / if (x > xmax) codigo[RIGHT] = TRUE; else if (x < xmax) codigo[BOTTOM] = TRUE; / Fim Se / }/ End CalculaOutCode */

Algoritmo 7.1: Calculando os c´odigos do algoritmo de Cohen-Sutherland.

7.2 Recorte de Circunferˆencias

Para recortar uma circunferˆencia contra um retˆangulo, podemos primeiro executar um teste de aceita¸c˜ao/rejei¸c˜ao trivial interceptando a extens˜ao da circunferˆencia (um quadrado do tamanho do diˆametro da circun- ferˆencia) com o retˆangulo de visualiza¸c˜ao usando o algoritmo para recorte de pol´ıgonos que ser´a visto a se- guir. Se a circunferˆencia intercepta o retˆangulo, ela ´e subdivida em quadrantes, e testes de aceita¸c˜ao/rejei¸c˜ao trivial s˜ao feitos para cada um. Estes testes podem levar a testes por octantes. E poss´´ ıvel ent˜ao calcular a intersec¸c˜ao da circunferˆencia e da aresta analiticamente, resolvendo suas equa¸c˜oes simultaneamente, e a seguir fazer a convers˜ao matricial dos arcos resultantes. Se a convers˜ao matricial ´e r´apida, ou se a cir- cunferˆencia n˜ao ´e muito grande, seria provavelmente mais eficiente usar a t´ecnica de scissoring, testando cada pixel na circunferˆencia contra os limites do retˆangulo antes de tra¸c´a-lo. Um algoritmo para recorte de pol´ıgonos precisa tratar de muitos casos distintos, como mostra a Figura 7.5. O caso (a) ´e particularmente interessante porque um pol´ıgono cˆoncavo ´e recortado em dois pol´ıgonos

/* algoritmo de recorte de Cohen-Sutherland para linha P0(x0,y0) a

  • P1(x1,y1), e retangulo de recorte com diagonal de (xmin,ymin) a
  • (xmax,ymax). */ void RecorteLinhaCohenSutherland(float x0,float y0,float x1,float y1,int valor){ boolean aceito, pronto; outcode outcode0[4], outcode1 [4], outcode0ut; / outcodes para P0, P1 e quaisquer outros pontos que estao fora do retangulo de recorte */ float x, y; aceito = FALSE; pronto = FALSE;

CalculaOutCode(x0,y0,outcode0); CalcuiaOutCode(xl ,y1 ,outcode1); do { if (vazio(outcode0) && vazio(outcode1)){ /* aceitacao trivial e sai / aceito = TRUE; pronto = TRUE; }else if (interseccao_vazia(outcode0,outcode1)) / rejeicao trivial e sai / pronto = TRUE; else { / ambos os testes falharam, entao calcula o segmento de reta a recortar: a partir de um ponto externo a uma interseccao com a aresta de recorte / / pelo menos um ponto esta fora do retangulo de recorte; seleciona-o */

outcode0ut= vazio(outcode0)? outcode1 : outcode0; /* acha agora o ponto de interseccao, usando as formulas: y = y0 + inclinacao * (x-x0), x = x0 + ( 1 /inclinacao) * (y-y0) / if (outcodeOut(TOP)) { / divide a linha no topo do retangulo de recorte / x= x0 + (x1-x0) * (ymax-y0)/(y1-y0); y= ymax; }else if (outcode0ut[BOTTOM]) { / divide a linha na base do retangulo de recorte / x = x0 + (x1-x0) + (ymin-y0)/(y1-y0); y = ymin; }else if (outcode0ut[RIGHT]) { / divide a linha na aresta direita do retangulo de recorte / y = y0 + (y1 -y0) + (xmax-x0)/(x1-x01; x = xmax; }else if (outcode0ut[LEFT]) { / divide a linha na aresta esquerda do retangulo de recorte / y = y0 + (y 1 -y0) + (xmin-x0)/(x1-x0); x = xmin; } / Fim se / / agora move o ponto externo para o ponto de interseccao, para recortar e preparar para o proximo passo / if (igual(outcode0ut,outcode0)) { x0 = x; y0 = y; CalculaOutCode(x0,y0,outcode0); }else{ x1 = x; y1 = y; CalculaOutCode(x1,y1,outcode1); } }/ fim do else da subdivisao */ } while (pronto);

if (aceito) MeioPontoLinhaReal(x0,y0,x1,y1),valor); /* versao do algoritmo para coordenadas reais / } / fim do algoritmo de recorte e tracado */

Algoritmo 7.2: Desenhando a linha com o algoritmo de Cohen-Sutherland. Algumas das fun¸c˜oes usadas est˜ao ilustradas no Algoritmo 7.2.

da posi¸c˜ao do v´ertice sendo analisado em rela¸c˜ao `a aresta de recorte.

Figura 7.6: Quatro situa¸c˜oes poss´ıveis no recorte de pol´ıgonos.

S˜ao quatro situa¸c˜oes poss´ıveis (Figura 7.6). Consideremos uma aresta do pol´ıgono que vai do v´ertice s ao v´ertice p. Suponha que o v´ertice s foi analisado na itera¸c˜ao anterior, e a intera¸c˜ao corrente est´a analisando p. No caso 1 , a aresta do pol´ıgono est´a completamente dentro da fronteira do retˆangulo de visualiza¸c˜ao, e o v´ertice p ´e adicionado a lista de sa´ıda. No caso 2, o ponto i, que define a intersec¸c˜ao entre a aresta do pol´ıgono e a aresta do retˆangulo, ´e colocado como um v´ertice na lista de sa´ıda. No caso 3, ambos os v´ertices est˜ao fora do retˆangulo, e nenhum ´e colocado na lista de sa´ıda. No caso 4, ambos os pontos i (intersec¸c˜ao) e p, s˜ao colocados na lista de sa´ıda. O procedimento, mostrado no Algoritmo 7.3, aceita um vetor de v´ertices, inVertexArray, e cria outro vetor outVertexArray. Para manter o c´odigo simples, n˜ao inclu´ımos verifica¸c˜ao dos erros nos limites dos vetores, e usamos o procedimento Output() para incluir um v´ertice em outVertexArray. O procedimento Intersect() calcula a intersec¸c˜ao de uma aresta s -¿p do pol´ıgono com a aresta clipBoundary, definida por dois v´ertices da fronteira do pol´ıgono de recorte. A fun¸c˜ao Inside() retorna true se o v´ertice est´a no interior da fronteira de recorte. Assume-se que o v´ertice est´a no interior da fronteira se estiver “a esquerda da aresta de recorte, quando olha-se do primeiro para o segundo v´ertice da aresta”. Esta orienta¸c˜ao corresponde a uma enumera¸c˜ao das arestas no sentido anti-hor´ario. Para calcular se um ponto est´a fora da fronteira de recorte, podemos testar o sinal do produto vetorial do vetor normala fronteira de recorte e da aresta do pol´ıgono. 0 algoritmo ´e bastante geral, e pode ser estruturado para chamar a si pr´oprio recursivamente de uma forma que o torna bastante eficiente para implementa¸c˜ao em hardware.

/* Algoritmo de Sutherland-Hodgman para recorte do pol´ıgonos */ #define MAX 20

typedef struct {float x,y;} ponto; typedef ponto vertice; typedef vertice aresta[2]; typedef vertice VetorVertices[MAX]; typedef enum {TRUE = 1, FALSE = 0} boolean;

/* Acrescenta um novo vertice a vetorSaida, e atualiza tamSaida */ void saida(vertice novoVertice, int *tamSaida, VetorVertices vetorSaida);

/* Checa se o vertice esta dentro ou fora da aresta de recorte */ boolean dentro(vertice testeVertice, aresta arestaRecorte);

/* recorta a aresta (prim,seg) do poligono contra arestaRecorte,

  • retorna o novo ponto */ vertice intercepta(vertice prim, vertice seg, aresta arestaRecorte);

void RecortePoligonosSutherlandHodgman( VetorVertices vetorEntrada, /* vetor de vertices de entrada / VetorVertices vetorSaida, / vetor de vertices de saida / int tamEntrada, / numero de entradas em vetorEntrada / int tamSaida, / numero de vertices em vetorSaida / aresta arestaRecorte / aresta do poligono de recorte /){ vertice s, p; / pontos inicial e final da aresta de recorte corrente / vertice i; / ponto de interseccao com uma aresta de recorte / int j; / contador para o loop de vertices */ *tamSaida = 0;

s = vetorEntrada[tamEntrada]; / * comeca com o ultimo vertice em vetorEntrada / for (j = 1 ;j < = tamEntrada;j + + ) { p= vetorEntrada[j]; / agora s e p correspondem aos vertices na Fig. / if (dentro(s,arestaRecorte)) { / casos 1 e 4 / if (dentro(s,arestaRecorte)) saida(p,tamSaida,vetorSaida); else { i = intercepta(s,p,arestaRecorte); saida(i,tamSaida,vetorSaida); saida(p,tamSaida,vetorSaida); }/ Fim Se / }else{ / casos 2 e 3 / if (dentro(s,arestaRecorte)) { i = intercepta(s,p,arestaRecorte); saida(i,tamSaida,vetorSaida); }/ Fim Se / }/Fim Se / s = p; }/ fim do for / }/ fim do algoritmo de recorte */

Algoritmo 7.3: Algoritmo de Cohen-Sutherland.

reta ´e particularmente ruim (Figura ??(a)). Uma maneira de melhorar a representa¸c˜ao ´e aumentar a densidade dos pontos nessas regi˜oes (Figura ??(b)).

  • anal´ıtica: ou seja, atrav´es de formula¸c˜oes matem´aticas, o que apresenta v´arias vantagens em rela¸c˜ao `a representa¸c˜ao anterior:
  • precis˜ao,
  • armazenagem compacta,
  • facilidade de c´alculo (exato) de pontos intermedi´arios (em uma representa¸c˜ao por pontos pontos intermedi´arios precisam ser determinados por interpola¸c˜ao),
  • facilidade para calcular propriedades da curva como inclina¸c˜ao e curvatura (em uma representa¸c˜ao por pontos tais propriedades precisam ser calculadas por diferencia¸c˜ao num´erica, um procedimento que ´e pouco preciso),
  • facilidade para desenhar as curvas,
  • facilidade para fazer altera¸c˜oes cont´ınuas no formato da curva de forma a atender requisitos de projeto (“design”).

Figura 8.2: Aproxima¸c˜ao de curvas por segmentos de reta conectados.

8.2 Curve Fitting x Curve Fairing

8.2.1 Ajuste de curvas (curve fitting)

Frequentemente, deseja-se obter representa¸c˜oes anal´ıticas para curvas definidas originalmente por con- juntos de pontos - por exemplo, pontos em uma curva ou superf´ıcie real foram digitalizados. Do ponto de vista matem´atico, esse ´e um problema de interpola¸c˜ao. Uma curva que ajusta (fit) os pontos da- dos passa por todos esses pontos. Uma t´ecnica usual de ajuste de curvas s˜ao as splines c´ubicas, uma estrat´egia de aproxima¸c˜ao polinomial por partes.

8.2.2 Aproxima¸c˜ao de curvas (curve fairing)

Se os pontos dados s˜ao aproxima¸c˜oes para valores desconhecidos, por exemplo, s˜ao pontos coletados ou obtidos em medidas experimentais, ent˜ao o que se deseja ´e uma curva que mostre a tendˆencia dos dados. Em geral, a curva obtida pode n˜ao passar por nenhum dos pontos dados, e diz-se que a curva aproxima (fair ) os dados. Alternativamente, pode-se desejar gerar uma descri¸c˜ao matem´atica de uma curva no espa¸co sem qualquer conhecimento pr´evio da forma da curva. Para esse caso, t´ecnicas usuais s˜ao as representa¸c˜oes de B´ezier e B-splines (ambas s˜ao estrat´egias de aproxima¸c˜ao de curvas).

8.3 Representa¸c˜oes Param´etricas e N˜ao Param´etricas (expl´ıcita

e impl´ıcita)

Para uma curva plana, a forma n˜ao param´etrica expl´ıcita ´e dada por

y = f (x) (8.1)

por exemplo, a equa¸c˜ao de uma linha reta ´e dada por

y = mx + b (8.2)

Desta forma, obt´em-se um valor de y para cada valor de x dado. Consequentemente, curvas fechadas, ou com valores m´ultiplos, como um c´ırculo, n˜ao podem ser representadas explicitamente. Essa limita¸c˜ao n˜ao existe no caso de representa¸c˜oes impl´ıcitas, na forma

f (x, y) = 0 (8.3)

A equa¸c˜ao impl´ıcita de segundo grau gen´erica:

ax^2 + 2bxy + cy^2 + 2dx + 2ey + f = 0 (8.4)

engloba uma variedade de curvas bi-dimensionais denominadas se¸c˜oes cˆonicas. Os trˆes tipos de se¸c˜oes cˆonicas s˜ao a par´abola, a hip´erbole e a elipse (um c´ırculo ´e um caso especial de uma elipse) (Figura ??).

Figura 8.3: Aproxima¸c˜ao de curvas por segmentos de reta conectados.

Dependendo dos valores de a, b, c, d, e e f , diferentes tipos de se¸c˜oes cˆonicas s˜ao produzidas. Se a se¸c˜ao cˆonica ´e definida em rela¸c˜ao a um sistema de coordenadas local e passa pela origem, ent˜ao f = 0.

8.3.1 Limita¸c˜oes das representa¸c˜oes n˜ao param´etricas

  • Ambas (expl´ıcita e impl´ıcita) s˜ao dependentes do sistema de coordenadas, cuja escolha afeta a facilidade de uso. Por exemplo, surgem problemas se no sistema de coordenadas escolhido for necess´aria uma inclina¸c˜ao infinita como condi¸c˜ao de contorno, pois essa inclina¸c˜ao n˜ao pode ser usada diretamente como uma condi¸c˜ao de contorno num´erica. Ou o sistema de coordenadas ´e alterado, ou a inclina¸c˜ao infinita ser´a representada numericamente por um valor muito grande, positivo ou negativo.

Figura 8.4: Pontos de uma circunferˆencia.

8.4 Curvas de B´ezier

T´ecnicas de aproxima¸c˜ao de curvas s˜ao muito usadas em ambientes de projeto (CAD) interativos, por serem mais intuitivas do que as t´ecnicas de ajuste. Um m´etodo adequado para o design de curvas e superf´ıcies de forma-livre em ambientes interativos foi desenvolvido por Pierre B´ezier. Uma curva de B´ezier ´e determinada por um pol´ıgono de defini¸c˜ao (Figuras 8.5 e ??).

Figura 8.5: Representa¸c˜ao de uma curva de B´ezier definida pelos pontos B 0 , B 1 , B 2 e B 3.

Matematicamente, uma curva de B´ezier param´etrica ´e definida como

P (t) =

∑^ n

i=

BiJn,i(t) 0 ≤ t ≤ 1 (8.9)

onde as fun¸c˜oes de blending, ou fun¸c˜oes base de B´ezier s˜ao

Jn,i(t) =

n i

ti(1 − t)n−i^ (8.10)

com

( n i

n! i!(n − i)!

Jn,i(t) ´e a i-´esima fun¸c˜ao base de Bernstein de ordem n, onde n, o grau da fun¸c˜ao-base, e portanto do segmento de curva polinomial, ´e um menos o n´umero de pontos do pol´ıgono de defini¸c˜ao. Os v´ertices do pol´ıgono s˜ao numerados de 0 a n (como na Figura 8.5). A Figura 8.6 mostra as fun¸c˜oes de blending

Figura 8.6: Fun¸c˜oes de blending para v´arios valores de n.

para v´arios valores de n. Observe a simetria das fun¸c˜oes. Examinando-se as Equa¸c˜oes 8.9 a 8.11 para o primeiro ponto na curva, i.e., em t = 0, verifica-se que

Jn, 0 (0) = 1 i = 0 Jn,i(0) = 0 i 6 = 0 (8.12)

Portanto,

P (0) = B 0 Jn, 0 (0) = B 0 (8.13)

e o primeiro ponto na curva coincide com o primeiro ponto do pol´ıgono de controle. Verifica¸c˜ao an´aloga pode ser feita para o ´ultimo ponto, i.e., em t = 1. As fun¸c˜oes base da Figura 8.6 ilustram estes resultados. Al´em disso, pode-se mostrar que para qualquer valor do parˆametro t, o somat´orio das fun¸c˜oes base ´e 1, i.e.,

∑^ n

i=

Jn,i = 1 (8.14)

A equa¸c˜ao para uma curva de B´ezier pode ser expressa na forma matricial como

P (t) = T N G = F G (8.15)

onde F = Jn, 0 Jn, 1 · · · Jn,n e Gr^ = B 0 B 1 · · · Bn. As matrizes espec´ıficas para valores pequenos de n (n = 3, 4) s˜ao de particular interesse. Para qualquer valor de n, a matriz [N] ´e sim´etrica em rela¸c˜ao `a diagonal principal e o canto triangular inferior direito cont´em apenas zeros. Em geral, uma forma complexa n˜ao pode ser modelada por uma ´unica curva, mas por v´arias curvas que s˜ao conectadas em seus pontos extremos. Ao criar as jun¸c˜oes, o projetista, em geral, deseja controlar

Cap´ıtulo 9

Apostila Modelagem

O texto sobre modelagem pode ser encontrado no seguinte endere¸co: http://gbdi.icmc.usp.br/documentacao/apostilas/cg/downloads/modelagem.pdf

Cap´ıtulo 10

Rendering

Esta apostila est´a sob revis˜ao e ser´a adicionada nesta vers˜ao assim que poss´ıvel. A vers˜ao anterior pode ser encontrada em: http://gbdi.icmc.usp.br/∼cg/ap10.html

de uma cor em rela¸c˜ao a luminˆancia de outra ou em rela¸c˜ao ao fundo, e a satura¸c˜ao ´e a pureza aparente de um matiz. Quanto maior o dom´ınio de um comprimento de onda, maior ´e a sua satura¸c˜ao. As cores preta, branca e cinza possuem satura¸c˜ao uniforme em todos os comprimentos de onda e, por isso, s˜ao diferenciadas apenas pelo brilho. As propriedades de satura¸c˜ao e de matiz de uma cor s˜ao referenciadas como cromaticidade. Algumas pessoas possuem uma anomalia, denominada daltonismo, que impede a distin¸c˜ao de uma ou mais cores. O daltonismo se deve a um defeito na constitui¸c˜ao dos cones e est´a vinculada ao sexo. Ele atinge cerca de 8% dos homens, e apenas 0.5% das mulheres. Esse defeito pode se manifestar em 1, 2 ou nos 3 tipos de receptores. Os tricomatas s˜ao daltˆonicos que possuem os 3 sistemas de pigmentos, mas que utilizam os sistemas em propor¸c˜oes diferentes das pessoas normais e das pessoas com o mesmo defeito. Os dicromatas percebem as cores defeituosamente porque combinam apenas 2 sistemas. Os monocromatas percebem apenas gradua¸c˜oes de claro e de escuro, pois sua estimula¸c˜ao visual se baseia em um ´unico sistema crom´atico. Um outro aspecto que tamb´em influencia na percep¸c˜ao de cores ´e o amarelamento das lentes do olho que ocorre com o passar dos anos, fazendo com que as pessoas se tornem menos sens´ıveis, por exemploa cor amarela do que `a cor azul.

11.2 Sistemas de Cores Prim´arias

O conte´udo desta se¸c˜ao, que descreve alguns sistemas de cores prim´arias, foi baseado principalmente em Hearn [Hea94], Cap´ıtulo 15. Um sistema de cores ´e um m´etodo que explica as propriedades ou o comportamento das cores num contexto particular. N˜ao existe um sistema que explique todos os aspectos relacionados a cor. Por isso, s˜ao utilizados sistemas diferentes para ajudar a descrever as diferentes caracter´ısticas da cor que s˜ao percebidas pelo ser humano. Existem v´arios sistemas de cores, sendo que ser˜ao apresentados apenas alguns dos principais: o XYZ, o RGB, o HSV e o HLS. As cores prim´arias s˜ao as 2 ou 3 cores que um sistema utiliza para produzir outras cores. As cores podem ser produzidas a partir de uma combina¸c˜ao das prim´arias, ou ent˜ao, da composi¸c˜ao de 2 com- bina¸c˜oes. O universo de cores que podem ser reproduzidas por um sistema ´e chamado de espa¸co de cores (color space ou color gamut). Alternativamente, um espa¸co de cores (color space) pode ser definido como uma representa¸c˜ao visual de um modelo de cores, como o cubo definido pelas componentes do modelo RGB, ou o cone definido pelo modelo HSV. N˜ao existe um conjunto finito de cores prim´arias que pro- duza todas as cores vis´ıveis, mas sabe-se que uma grande parte delas pode ser produzida a partir de 3 prim´arias. O estudo da utiliza¸c˜ao de 3 fontes de luz espectral para a gera¸c˜ao de cores ´e chamado de colorimetria, e tem como um de seus objetivos determinar espa¸cos de cor perceptualmente uniformes. Um espa¸co de cores (ou sistema de cores) perceptualmente uniforme ´e um no qual distˆancias perceptuais iguais separam todas as cores. Por exemplo, a escala de cinzas do espa¸co deve transmitir uma transi¸c˜ao suave entre o preto e o branco. A defini¸c˜ao de um espa¸co de cores uniforme ´e feita atrav´es de medi¸c˜oes emp´ıricas obtidas sob condi¸c˜oes experimentais rigidamente controladas - as condi¸c˜oes do ambiente e outros parˆametros importantes devem ser mantidos constantes, como o tamanho das amostras de cores, o espa¸camento entre as amostras, a luminˆancia e cromaticidade do fundo e da luz ambiente. Apesar dessa limita¸c˜ao, os espa¸cos perceptuais de cores fornecem ferramentas adequadas para a solu¸c˜ao de problemas como a compress˜ao de imagens (para decidir o n´ıvel de codifica¸c˜ao da informa¸c˜ao de cor) e pseudo-colora¸c˜ao^1 (para mapear as cores da imagem em um conjunto com espa¸camento perceptual m´aximo). Os sistemas de cores podem ser aditivos ou subtrativos. Nos modelos aditivos (por exemplo, RGB e XYZ), as intensidades das cores prim´arias s˜ao adicionadas para produzir outras cores. A Figura 11. ilustra a demonstra¸c˜ao do funcionamento desses modelos atrav´es da sobreposi¸c˜ao de c´ırculos coloridos. Pode-se pensar que o branco ´e a mistura das intensidades m´aximas das 3 cores prim´arias aditivas (vermelha, verde e azul). Os matizes intermedi´arios (amarelo, turquesa e magenta) s˜ao obtidos atrav´es da combina¸c˜ao das intensidades m´aximas de 2 cores. Nos modelos subtrativos (por exemplo, o CMY), as cores s˜ao geradas subtraindo-se o comprimento da onda dominante da luz branca, por isso, a cor resultante correspondea luz que ´e refletida. A Figura 11. ilustra a demonstra¸c˜ao do funcionamento desses modelos atrav´es da sobreposi¸c˜ao de c´ırculos coloridos. Pode-se pensar que o preto ´e a combina¸c˜ao das 3 cores subtrativas (turquesa, magenta e amarela). A quantidade de preto numa cor ´e indicada pela diferen¸ca entre o branco e a intensidade m´axima das 3 cores prim´arias aditivas. E, da mesma forma, a quantidade de branco numa cor ´e indicada pela diferen¸ca entre o preto e a intensidade m´ınima das 3 cores prim´arias aditivas.

(^1) A colora¸c˜ao “falsa” (“pseudocoloring”) ocorre quando as cores “verdadeiras” de uma imagem s˜ao mapeadas em outro conjunto de cores, ou quando uma imagem adquirida em tons de cinza ´e colorida.

Figura 11.2: Ilustra¸c˜ao da mistura de cores aditivas [For94].

Figura 11.3: Ilustra¸c˜ao da mistura de cores subtrativas [For94].

As cores puras e saturadas n˜ao representam toda a classe de cores poss´ıveis, existem ainda os tints, shades e tones que correspondem, respectivamente, as cores obtidas atrav´es da adi¸c˜ao de branco, preto e cinzaas cores saturadas, causando uma altera¸c˜ao no efeito da cor. A Figura 11.4^2 ilustra de tints, shades e tones obtidos a partir da cor vermelha.

Figura 11.4: Ilustra¸c˜ao da obten¸c˜ao de tints, shades e tones.

A adi¸c˜ao de branco clareia uma cor e cria um tint (por exemplo, adicionando branco ao vermelho para obter a cor pink). A adi¸c˜ao de preto escurece uma cor e cria um shade (por exemplo, adicionando preto ao vermelho para obter um castanho-avermelhado (maroon). Al´em disso, a adi¸c˜ao de cinza reduz o brilho de uma cor e cria um tone. Uma composi¸c˜ao monocrom´atica ´e formada inteiramente de tints, shades e tones da mesma cor.

11.3 Modelo XYZ

O sistema XY Z de cores prim´arias da CIE (Comiss˜ao Internacional de Ilumina¸c˜ao) ´e um sistema aditivo que descreve as cores atrav´es de 3 cores prim´arias virtuais X, Y e Z. Esse sistema foi criado devido `a inexistˆencia de um conjunto finito de cores prim´arias que produza todas as cores vis´ıveis poss´ıveis. Nesse sistema, as cores Cl podem ser expressas pela seguinte equa¸c˜ao:

Cl = x.X + y.Y + z.Z (11.1) (^2) reproduzida de http://www.contrib andrew.cmu.edu:8001/usr/dw4e/color/tints.html.