





























Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
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
1 / 37
Esta página não é visível na pré-visualização
Não perca as partes importantes!






























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.
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).
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)
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
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
/* Retorna TRUE se a interseccao logica entre codigo1 e codigo
/* 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
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,
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)).
Figura 8.2: Aproxima¸c˜ao de curvas por segmentos de reta conectados.
8.2 Curve Fitting x Curve Fairing
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.
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.
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
O texto sobre modelagem pode ser encontrado no seguinte endere¸co: http://gbdi.icmc.usp.br/documentacao/apostilas/cg/downloads/modelagem.pdf
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.