Uniersidade Estadal do Oeste do Paraná - UNIOESTE Centro de Ciências Eatas e Tecnológicas - CCET Crso de Ciência da Comptação COMPUTAÇÃO GRÁFICA NOTAS COMPLEMENTARES CASCAVEL - PR 9
SUMÁRIO PRINCÍPIOS GEOMÉTRICOS.... EQUAÇÃO DA RETA.... INTERSEÇÃO ENTRE DUAS LINHAS....3 DISTÂNCIA ENTRE PONTO E RETA... 3 ALGORITMO DE WEILER-ATHERTON... 4 3 CÁLCULO DA ÁREA DE UM TRIÂNGULO... 8 3. IDENTIFICAÇÃO DA ORIENTAÇÃO DE TRÊS VÉRTICES... 8 3. IDENTIFICAÇÃO DE POLÍGONOS CÔNCAVOS... 8 3.3 DIVISÃO DE POLÍGONOS CÔNCAVOS... 9 4 TRANSFORMAÇÃO WINDOW-TO-VIEWPORT... 4. CASO EIXOS Y E V NA MESMA DIREÇÃO... 4. CASO EIXOS Y E V EM DIREÇÕES OPOSTAS... 5 CONVERSÃO ENTRE SISTEMAS DE CORES... 3 5. RGB E CMY... 3 5. RGB E CMYK... 3 5.3 RGB E HSV... 3 6 INTERPOLAÇÃO LINEAR... 5 6. INTERPOLAÇÃO COM CÁLCULO INCREMENTAL... 6
PRINCÍPIOS GEOMÉTRICOS. EQUAÇÃO DA RETA Dados pontos P (, ) e Q (, ), temos a reta; Q (, ) P (, ) A eqação da reta PQ pode ser assim escrita: (.) Fazendo m (.) Sbstitindo (.) em (.) temos m m ) ( + (.3) Podemos escreer b m (.4) Sbstitindo (.4) em (.3), escreemos a reta PQ escrita como: m+ b (.5) Fazendo as deidas mltiplicações em (.), temos:
) )( ( ) )( ( ) ( ) ( + (.6) Fazendo ) ( ) ( t s r (.7) Sbstitindo (.7) em (.6), escreemos + + t s r De (.4) e (.6), conclímos qe: s t b s r m. INTERSEÇÃO ENTRE DUAS LINHAS O ponto de interseção P i ( i, i ) entre das linhas é definido como:, m m bm m b m m b b P i i i (.8) o, r s r s r t r t r s r s t s st P i i i (.9)
3.3 DISTÂNCIA ENTRE PONTO E RETA P (, ) L r + s + t P i ( i, i ) por: A reta perpendiclar a r + s + t, qe contém o segmento P P i é dada s + r+ ( s r ) (.) o s s + (.) r r com s s m e b. r r O ponto de interseção P i ( i, i ) entre as retas r + s + t e a perpendiclar, qe contém o ponto P, pode ser calclado pelas eqações (.8) o (.9). E a distância L é dada por: L r + s r + s + t
4 ALGORITMO DE WEILER-ATHERTON Este algoritmo é tilizado para fazer o recorte de polígonos contra ma janela também poligonal. Veja m eemplo na figra a segir. Polígono de recorte Polígono Área recortada A única restrição é qe ambos os polígonos não possam atointerseções. Para estes casos a solção indicada na literatra é a sbdiisão destes em dois o mais polígonos sem ato-interseções. A segir o algoritmo de Weiler-Atherton será detalhado, demonstrando nm estdo de caso a seqüência de ações realizadas. O polígono P será recortado contra a janela Q. P Q Q P 4 P P 3 P P 4 P P P 3 P 9 Q 4 P 8 Q 3 P 5 P7 P 6 Nm primeiro passo calcle todas as interseções entre as arestas do
5 polígono e as arestas da janela de recorte, rotlando-as como mostrado na figra a segir. P 4 L A Q Q K B J P P P 3 G P C P H P 3 P 4 P 9 P I F Q 4 P 8 E D Q 3 P 5 P7 P 6 Arbitre m sentido para realizar o cahamento sobre as bordas do polígono e da janela de recorte. Dee ser o mesmo sentido para ambas as figras geométricas. Adoto-se neste eemplo o sentido horário. Cahando sobre as arestas do polígono inserem-se os értices originais e os értices de interseção nma primeira lista. O mesmo processo é efetado para a janela de recorte, dando origem a ma segnda lista de értices. Nma terceira lista armazenam-se apenas os értices de interseção para aqelas arestas do polígono qe adentram a janela de recorte. As três listas são apresentadas a segir. Polígono P A B P P 3 C P 4 D P 5 P 6 P 7 E P 8 F P 9 P G P H P I P 3 J P 4 K L Janela Q L A Q B C D Q3 E Q4 F I H G J K Vértices A C E G I K O algoritmo consiste em retirar m értice da lista de értices e, a partir dele, cahar sobre a lista do polígono. Encontrando m értice de interseção troca-se para a lista da janela e caha-se, a partir deste último értice, sobre ela. Encontrando otro értice de interseção troca-se noamente para lista de polígonos
6 cahando a partir do último értice encontrado na lista da janela. O cahamento sobre as lista pára qando m értice já analisado for encontrado. Neste momento tem-se m polígono recortado. Se algm dos értices deste polígono encontrar-se na lista de értice dee-se remoê-lo de lá. Caso restem értices na lista de értices tem-se ainda otros polígonos a recortar. Para tanto repete-se o processo acima. O processo todo acaba qando a lista de értices restar azia. Obsere esta seqüência de ações realizadas sobre as listas do eemplo. Inicie o algoritmo retirando m értice da lista de értice. Neste caso o értice A. Na seqüência, cahando sobre a lista do polígono, a partir de A encontra-se o értice B. Troca-se para lista da janela e encontra-se o értice C. Noamente troca-se para lista do polígono e encontram-se os értices P 4 e D. Trocase para lista da janela e encontram-se os értices Q 3 e E. Trocamos para a lista do polígono e encontram-se os értices P 8 e F. Troca-se para lista da janela e encontrase o értice I. Troca-se para a lista do polígono e encontram-se os értices P 3 e J. Troca-se para lista da janela e encontra-se o értice K. Troca-se para a lista do polígono e encontra-se o értice L. Troca-se para lista da janela e encontra-se o értice A. O értice A é o primeiro értice da lista, portanto o polígono recortado é formado pelas arestas dadas pelos értices: A, B, C, P 4, D, Q 3, E, P 8, F, I, P 3, J, K, L. Note qe entre os értices do primeiro polígono recortado estão os értices C, E, I e K. Estes értices fazem parte da lista de értices e deem também ser de lá remoidos. Resto ainda na lista de értice o értice G, indicando qe há mais m polígono para recortar. Retira-se G da lista de értice, inicia-se o cahamento sobre a lista do polígono e encontram-se os értices P e H. Troca-se para lista da janela e encontra-se o értice G, já analisado. O segndo polígono é formado pelas arestas dadas pelos értices: G, P, H. Como a lista de értices resto azia concli-se o algoritmo com o resltado apresentado na figra a segir.
7 L A K B J G P C I F H P 3 P 8 Q 3 P 4 D E Q 3
8 3 CÁLCULO DA ÁREA DE UM TRIÂNGULO A área de m triânglo pode ser calclada a partir de ses três értices a, b e c. O prodto etorial dos etores A e B fornece a área do paralelogramo. Logo, a metade desta área corresponde à área do triânglo abc. S X X A B Y Y A B (( ) ( ) ( ) ( )) b a c a c a b a 3. IDENTIFICAÇÃO DA ORIENTAÇÃO DE TRÊS VÉRTICES A eqação anterior, além de fornecer a área do triânglo, também fornece a orientação dos três pontos qe formam o triânglo. Caso a área seja negatia os pontos a, b e c estão no sentido-horário; caso seja positia os pontos estão no sentido anti-horário. Se a área calclada for nla então os 3 pontos são colineares. 3. IDENTIFICAÇÃO DE POLÍGONOS CÔNCAVOS Para identificar se m polígono é côncao tiliza-se o prodto etorial. Veja o polígono da figra seginte. V 6 E 5 V 5 E 4 E 6 V 4 E 3 V 3 E E V V
9 Compta-se o prodto etorial para todos os pares scessios de etores de borda. Uma componente z negatia, resltante da mltiplicação, posicionada entre componentes positias indica ma concaidade local. ( E E) > z ( E E3) > z ( E3 E4) < z ( E4 E5) > z ( E5 E6) > z ( E E ) 6 > z Otra forma de se fazer esta erificação é tilizar o teste de sentido apresentado no item 3.. Se o sentido definido por três pontos consectios da fronteira de m polígono for sempre o mesmo então o polígono é coneo. Em polígonos côncaos pelo menos m dos testes indicará sentido contrário aos demais. 3.3 DIVISÃO DE POLÍGONOS CÔNCAVOS Primeiramente identifiqe se o polígono é côncao atraés do cálclo do prodto etorial entre os etores de borda em sentido anti-horário. Se hoer m par de etores cjo prodto etorial apresente componente z negatia, concli-se qe o polígono é côncao. Procede-se, então, a diisão ao longo do primeiro dos etores deste prodto etorial. Veja o eemplo da figra seginte. V5 E 4 V 4 E 3 E 5 V 3 E V E V
4 TRANSFORMAÇÃO WINDOW-TO-VIEWPORT O mapeamento de m objeto descrito em coordenadas de ma window (mndo) para ma iewport (tela) consiste nma seqüência de transformações geométricas simples enolendo translações, escala e espelhamento. Dois casos são possíeis. O primeiro caso ocorre qando temos os eio da window e o eio da iewport na mesma direção. No segndo caso o eio Y e o eio estão em direções opostas. window iewport window iewport Caso Eios e na mesma direção Caso Eios e em direções opostas A segir apresentaremos as solções para ambos os casos. 4. CASO EIXOS Y E V NA MESMA DIREÇÃO A solção para este caso consiste em encadear 3 transformações geométricas: ma translação qe lea (, ) para a origem do sistema de coordenadas da window, ma transformação de escala qe igala o tamanho da window e da iewport e ma translação qe lea o ponto correspondente a (, ) para a posição (, ). Obsere a figra abaio. ma, ma ma, ma,, window translação escala translação
Encadeando as transformações temos: M jp T ma ma (, ) S, T( ), ma ma M jp ma ma ma ma M jp ma ma ma ma ma ma ma ma + + 4. CASO EIXOS Y E V EM DIREÇÕES OPOSTAS Este é o caso mais corriqeiro. Aprendemos, ainda na escola, a representar o plano cartesiano com a parte positia do eio na ascendente; essa orientação é contrária a orientação tilizada nas telas dos comptadores, onde a parte positia do eio está orientada na descendente. A solção para este caso consiste em encadear 4 transformações geométricas: ma translação qe lea (, ) para a origem do sistema de coordenadas da window, ma transformação de escala qe igala o tamanho da window e da iewport, m espelhamento em relação ao eio para inerter a direção de e ma translação qe lea o ponto correspondente a (, ) para a posição (, ma ). Obsere a figra seginte. Encadeando as transformações temos: M jp T ma ma (, ) EO ( ) S, T( ) ma, ma ma
M jp ma ma ma ma ma M jp ma ma ma ma ma ma ma ma + + ma ma, ma, window translação escala ma,, ma espelhamento translação
3 5 CONVERSÃO ENTRE SISTEMAS DE CORES 5. RGB E CMY // Based on C Code in "Compter Graphics -- Principles and Practice," // Fole et al, 996, p. 588 // R, G, B, C, M, Y each IN [..55] fnction CMYtoRGBTriple(const C, M, Y: integer): TRGBTriple; begin with (reslt) do begin rgbtred : 55 - C; rgbtgreen : 55 - M; rgbtble : 55 - Y end; end; {CMYtoRGBTriple}; procedre RGBTripleToCMY(const RGB: TRGBTriple; ar C, M, Y: integer); begin with (RGB) do begin C : 55 - rgbtred; M : 55 - rgbtgreen; Y : 55 - rgbtble end; end; {RGBtoCMY}; 5. RGB E CMYK // Based on C Code in "Compter Graphics -- Principles and Practice," // Fole et al, 996, p. 589 // R, G, B, C, M, Y,K each IN [..55] fnction CMYKtoRGBTriple(const C, M, Y, K: integer): TRGBTriple; begin with (reslt) do begin rgbtred : 55 - (C + K); rgbtgreen : 55 - (M + K); rgbtble : 55 - (Y + K) end; end; {CMYtoRGBTriple}; procedre RGBTripleToCMYK(const RGB: TRGBTriple; ar C, M, Y, K: integer); begin RGBTripleToCMY(RGB, C, M, Y); K : MinIntVale([C, M, Y]); C : C - K; M : M - K; Y : Y - K end; {RGBtoCMYK} 5.3 RGB E HSV // H to 36 (corresponding to..36 degrees arond hecone) // (ndefined) for S // S (shade of gra) to 55 (pre color) // V (black) to 55 (white) // RGB, each to 55, to HSV.
4 fnction HSVtoRGBTriple(const H, S, V: integer): TRGBTriple; const diisor: integer 55*6; ar f : integer; htemp : integer; p, q, t : integer; s : integer; begin if (s ) then reslt : RGBtoRGBTriple(V, V, V) //achromatic else begin //chromatic color if (H 36) then htemp : else htemp : H; f : htemp mod 6; // f is IN [, 59] htemp : htemp di 6; // h is now IN [,6) s : V * S; p : V - s di 55; q : V - (s * f) di diisor; t : V - (s *(6 - f)) di diisor; case (htemp) of : reslt : RGBtoRGBTriple(V, t, p); : reslt : RGBtoRGBTriple(q, V, p); : reslt : RGBtoRGBTriple(p, V, t); 3: reslt : RGBtoRGBTriple(p, q, V); 4: reslt : RGBtoRGBTriple(t, p, V); 5: reslt : RGBtoRGBTriple(V, p, q); else reslt : RGBtoRGBTriple(,,); end; end; end; {HSVtoRGBTriple}; procedre RGBTripleToHSV(const RGBTriple: TRGBTriple; ar H, S, V: integer); ar Delta : integer; Min : integer; Begin with (RGBTriple) do begin Min : MinIntVale([rgbtRed, rgbtgreen, rgbtble]); V : MaIntVale([rgbtRed, rgbtgreen, rgbtble]) end; Delta : V - Min; //Calclate satration: satration is if R, G and B are all if (V ) then S : else S : MlDi(Delta, 55, V); //Int(Delta * 55/V)\ if (S ) then H : //Achromatic else begin with (RGBTriple) do begin if (rgbtred V) then //degrees -- between ellow and magenta H : MlDi(rgbtGreen - rgbtble, 6, Delta) else if (rgbtgreen V) then //between can and ellow H : + MlDi(rgbtBle - rgbtred, 6, Delta) else if (rgbtble V) then //between magenta and can H : 4 + MlDi(rgbtRed - rgbtgreen, 6, Delta); end; if (H < ) then H : H + 36; end; end; {RGBTripleToHSV};
5 6 INTERPOLAÇÃO LINEAR a segir. Dois pontos não coincidentes definem m segmento de reta. Veja a figra P ( ; ; z ) P (; ; z) P ( ; ; z ) As coordenadas de qalqer ponto P (; ; z), compreendido no segmento P P, são obtidas por: + + z z + ( ) ( ), ( z z ) com (6.) O segmento de reta P P está descrito parametricamente, em fnção dos értices etremos e do parâmetro. O parâmetro assme alores entre e ; qando, P P e qando, P P. Para qaisqer otros alores de, dentro do limite possíel, estaremos em m ponto interno ao segmento. Vejamos m eemplo nmérico. Assma qe P é m ponto qe está a 6% do comprimento do segmento (,6), medido a partir do értice P.,6 P (,5; 3,9; 5,3) P (,, z) P (8,5; 5,5;,7) Aplicando o parâmetro,6 em (6.) temos P (; ; z):,5+,6 3,9+,6 z 5,3+,6 ( 8,5,5) 6, ( 5,53,9) (,75,3) 3, 4 4,86 Neste eemplo temos qe o ponto P está a certa distância de P. Entretanto as eqações (6.) nos permitem interpolar linearmente qalqer ponto no
6 segmento, desde qe seja conhecia ao menos ma das coordenadas de P. Vejamos o eemplo a segir, onde conhecemos a coordenada 3, do ponto P. P (8,5; 5,5;,7) P (3,;, z) P (,5; 3,9; 5,3) Como conhecemos o alor da coordenada de P, a partir de (6.) obtemos o alor do parâmetro. + 3,5+ ( ) ( 8,5,5),5,833 6 e z. Conhecido o alor de, podemos calclar os alores das coordenadas 3,9+,833 z 5,3+,833 ( 5,53,9) (,7 5,3) 5, 4,33 O seja, P (3,; 4,33; 5,). 6. INTERPOLAÇÃO COM CÁLCULO INCREMENTAL Sponha agora qe desejamos interpolar otros pontos no segmento, considerando incrementos de m ao longo de ; o seja, P (4; ; z), P (5; ; z), P (6; ; z), P (7;, z) e P (8; ; z). Neste caso não é necessário realizar o cálclo de para cada noo alor de em P, e depois calclar os alores de e z. Utilizamos aritmética incremental para tal, pois o segmento P P é linear. Como desejamos interpolar pontos com coordenadas inteiras e incrementadas de m em m, o primeiro passo do processo de interpolação é obter m primeiro ponto P, no segmento P P, com em alor inteiro. Este ponto já foi calclado e possi alor P i (3,; 4,33; 5,).
7 O segndo passo é calclar as taas de ariação das coordenadas e z do segmento em fnção da ariação de, pois o incremento nitário foi considerado em. As taas são calcladas a segir: ( P T ( P ( Pz Tz ( P P ) 5,53,9,667 P) 8,5,5 Pz ),75,3,6 P) 8,5,5 Em otras palaras, para cada nidade de ariação em ao longo do segmento P P, a coordenada sofre m acréscimo de,667 nidades enqanto qe a coordenada z sofre m decréscimo de,6 nidades. O terceiro passo é realizar a interpolação incremental, somando-se as taas correspondentes às coordenadas e z, a partir do primeiro ponto com coordenada inteira P i (3,; 4,33; 5,). O seja, P i+ P i + Taas Coordenadas Taas P i P i+ P i+ P i+3 P i+4 P i+5 --- 3 4 5 6 7 8,667 4,33 4,997 4,5664 4,833 5,998 5,3665 z -,6 5, 4,4 3,8 3,,6