Mário Rui Gomes Computação Gráfica 1 Recorte de Segmentos de Recta e Polígonos 1.1 Introdução Relembrando os andares do pipeline de visualização, podemos verificar que no andar anterior foi efectuada a Transformação de Visualização a qual consistiu na definição de uma vista sobre a cena, recorrendo à especificação dos parâmetros de uma câmara virtual e à definição de uma projecção, seguindo-se a transformação do volume de visualização num volume canónico. No andar de recorte de objectos 3D sobre o volume canónico pretende-se identificar quais os objectos que se encontram totalmente dentro desse volume, os quais são trivialmente aceites, e quais os que se encontram parcialmente dentro do volume canónico, pelo que têm que ser recortados (clipping em Inglês) pelas faces da fronteira do volume canónico. Como foi descrito no capítulo anterior, o volume canónico é um paralelepípedo que tem como limites os planos x = -1, x = 1, y = -1, y = 1, z = 0 e z = 1 como pode observar-se na figura 1.1. (-1, 1, 0) y (-1, 1, 1) (1, 1, 1) plano de recorte posterior (z = 0) (-1, 1, 0) plano de recorte anterior (z = 1) z (-1, -1, 1) x (1, -1, 0) (-1, -1, 1) Figura 1.1 – Volume canónico. 1 Computação Gráfica Recorte de Segmentos de Recta e Polígonos O objectivo do recorte será, assim, eliminar as partes dos objectos da cena que se encontrem fora do volume canónico. Nas representações mais simples, os objectos são descritos pelas suas arestas (modelo em arames) ou pela sua fronteira definida por uma malha de polígonos, pelo que, neste capítulo serão descritos os algoritmos que permitem o recorte de segmentos de rectas e de polígonos. Mas os algoritmos de recorte têm, em Computação Gráfica, múltiplas aplicações para lá de permitirem escolher as partes dos objectos que se encontram no interior do volume de canónico. Considere-se, por exemplo, a situação em que existe uma cena composta por dois polígonos, A e B os quais, ao serem vistos segundo um dado ponto de vista, o polígono A encobre parcialmente o polígono B pelo que só deste estará visível. Para obter a parte visível do polígono B basta rejeitar a parte deste polígono que é recortada pelo polígono A. Esta operação designa-se por cálculo de elementos invisíveis e será tratada noutro capítulo. Objectivos • Introduzir o recorte de segmentos de recta no pipeline de visualização • Identificar os vários tipos de utilização dos algoritmos de recorte de segmentos de recta e polígonos • Identificar as situações em que cada algoritmo deve ser aplicado • Descrever o funcionamento dos algoritmos mais importantes 1.2 Recorte de Linhas O recorte de segmentos de recta consiste em identificar os valores das coordenadas X, Y e Z que correspondem aos pontos de intersecção com cada uma das faces do volume canónico, caso esses pontos existam. Por facilidade expositiva considera-se unicamente uma das paredes rectangulares do volume canónico a qual passamos a designar por rectângulo de recorte. Uma vez que o recorte é aplicado também na remoção de elementos ocultos considera-se que um rectângulo de recorte genérico com as coordenadas que podem ser observadas na figura 1.2. 2 Mário Rui Gomes Computação Gráfica D F D´ F´ Ymax H B C J H´ E A J´ G´ Rectângulo de Recorte I´ G I Xmin Ymin Xmax Figura 1.2 – Recorte de segmentos de recta contra o rectângulo de recorte. Nos polígonos convexos (todos os ângulos internos inferiores a 180º) em, por exemplo, rectângulos, pode ser usada a propriedade geométrica que garante que se os dois vértices de um segmentos de recta estiverem dentro do polígono, então todo o segmento de recta está dentro do polígono. Um vértice com coordenadas (X, Y) encontra-se dentro de um rectângulo quando se verificarem, simultaneamente, as duas condições X min ≤ X ≤ X max Ymin ≤ Y ≤ Ymax (1-1) Tal como acontece com o segmento de recta AB da figura, se ambos os vértices estiverem dentro do rectângulo de recorte, então todo o segmento de recta se encontra também dentro dele, pelo que pode ser trivialmente aceite. Se ambos os vértices estiverem fora do rectângulo de recorte, o segmento de recta pode estar completamente fora (segmento EF da figura 1.2) e deve ser trivialmente rejeitado, ou não (caso do segmento GH da mesma figura), situação em que tem que ser efectuado o recorte. Quando um só dos vértices está dentro do rectângulo o recorte é inevitável (segmento CD da figura). 1.2.1 Algoritmo da Força Bruta Designa-se por algoritmo da Força Bruta aquele que efectua o cálculo de recorte de um segmento de recta através do cálculo da sua intersecção com cada uma das arestas que limitam o rectângulo de recorte. Considere-se a representação paramétrica de um segmento de recta cujas coordenadas dos vértices são, respectivamente, (X0, Y0) e (X1, Y1): 3 Computação Gráfica Recorte de Segmentos de Recta e Polígonos X = X 0 + t seg ( X 1 − X 0 ) Y = Y0 + t seg (Y1 − Y0 ) (1-2) 0 ≤ t seg ≤ 1 Por seu lado, a representação paramétrica dos segmentos de recta constituintes do rectângulo de recorte é X aresta = X min + t aresta ( X max − X min ) Ymin Y = aresta Ymax X min X aresta = (1-3) X max Y aresta = Ymin + t aresta ( Ymax − Ymin ) consoante sejam os limites inferior ou superior ou os limites esquerdo ou direito. Para determinar as intersecções de um segmento de recta a recortar com o rectângulo de recorte basta resolver o sistema de equações simultâneas da segmento de recta a recortar e de cada uma das arestas que delimitam o rectângulo em ordem a t seg e a t aresta . Para o caso do limite vertical esquerdo do rectângulo de recorte temos: X aresta = X min Yaresta = Ymin + t aresta ( Ymax − Ymin ) (1-4) Determinam-se então t seg e a t aresta , por esta ordem. Existirá intersecção quando se verificarem simultaneamente: 0 ≤ t aresta ≤ 1 0 ≤ t seg ≤ 1 (1-5) Para calcular as coordenadas do ponto de intersecção basta substituir na representação paramétrica da aresta o parâmetro t aresta pelo valor que foi calculado. 1.2.2 Algoritmo de Cohen-Sutherland Considerando que o cálculo de intersecções é um algoritmo pesado, surgiram vários algoritmos mais eficientes que se baseiam em técnicas de “atrasar” o cálculo das intersecções. Essa técnica é utilizada pelo algoritmo cuja descrição será agora efectuada, o algoritmo de Cohen-Sutherland. Considere-se um rectângulo de recorte e classifique-se cada vértice dos segmentos de recta a recortar consoante a posição relativa às rectas colineares com cada uma das 4 arestas do rectângulo de recorte, conforma figura 1.3 apresenta. 4 Mário Rui Gomes Computação Gráfica 1 2 3 4 5 6 7 8 9 Figura 1.3 – Algoritmo de Cohen-Sutherland: os limites do rectângulo de recorte determinam 9 sub espaços. O algoritmo inicia-se com o cálculo do sub espaço em que se encontra cada um dos vértices do segmento de recta a recortar. Por exemplo, se ambos os vértices se encontrarem nos sub espaços superiores, respectivamente 1, 2 ou 3, o segmento de recta será rejeitado. Se ambos os vértices estiverem no sub espaço 5, o segmento será aceite. Em ambos os casos não foi necessário efectuar qualquer cálculo de intersecção. Para simplificar a identificação dos sub espaços em que se encontram os vértices, os autores recorreram a uma codificação dos 9 sub espaços usando uma codificação com 4 bits, em que cada um dos bits define a posição do sub espaço relativamente a uma das arestas do polígono de recorte. Estes conjuntos de 4 bits denominam-se códigos ou outcodes. O 1º bit está relacionado com a aresta superior, tomando o valor 1 se o vértice se encontra no sub espaço superior e 0 se no sub espaço inferior relativamente à recta colinear com a aresta superior. O código 1 é sempre usado para codificar os sub espaços que não contêm o rectângulo de recorte, conduzindo, desse modo a que a codificação do sub espaço 5 será 0000. A tabela 1.1 apresenta os valores assumidos pelos vários bits do código de acordo com a posição do ponto em relação ao rectângulo de recorte. Daqui resulta a codificação dos sub espaços apresentada pela figura 1.4. Bit 1 2 3 4 Aresta Superior Inferior Direito Esquerdo Valor 1 1 1 1 Posição acima abaixo à direita à esquerda Tabela 1.1 – Valores dos bits do código de posição de um ponto em relação ao rectângulo de recorte no algoritmo de Cohen-Sutherland. 5 Computação Gráfica Recorte de Segmentos de Recta e Polígonos 1001 1000 1010 0001 0000 0010 0101 0100 0110 Figura 1.4 – Algoritmo de Cohen-Sutherland: códigos dos 9 sub espaços determinados pelas rectas que suportam os segmentos de recta correspondentes aos lados do rectângulo de recorte. Usando esta codificação dos sub espaços é possível identificar vários tipos de situações e tratá-las adequadamente, realizando cálculos de intersecções apenas quando tal seja necessário. Considere-se que OC0 é o código do sub espaço dentro do qual se encontra o primeiro vértice do segmento de recta a recortar e que OC1 é o código do sub espaço dentro do qual se encontra o 2º vértice do segmento. Como já foi referido, teremos OC1 = OC0 = 0 se ambos os vértices se encontrarem dentro do rectângulo de recorte e o segmento será aceite. O segmento será rejeitado se os seus dois vértices se encontrarem num dos 4 semiespaços definidos por cada uma das rectas sobre as quais assentam cada uma das 4 arestas do rectângulo de recorte. Essa situação ocorre quando OC1 & OC0 ≠ 0 (1-6) Nos restantes casos, em que OC1 & OC0 = 0, terá que ser efectuada uma primeira subdivisão do segmento de recta. A tabela 1.2 resume estas situações e as acções correspondentes. Situação OC1 = OC0 = 0 OC1 & OC0 ≠ 0 OC1 & OC0 = 0 Acção Aceitação Rejeição Subdivisão Tabela 1.2 – Algoritmo de Cohen-Sutherland: Sequência de testes aos códigos dos pontos extremos de um segmento de recta. Nas situações em que é necessário subdividir o segmento de recta tem que se calcular a intersecção com a recta sobre a qual assenta uma das arestas do rectângulo de recorte. 6 Mário Rui Gomes Computação Gráfica Utilizando uma aproximação do tipo “força bruta” teria que calcular-se a intersecção da segmento de recta com cada um dos 4 lados do rectângulo de recorte. No entanto, como existe informação sobre em que sub espaço se encontra cada um dos vértices do segmento de recta a recortar, podemos utilizar essa informação para escolher um dos lados do rectângulo. Considere-se o caso do segmento de recta GH representado na figura 1.5 em que o segmento de recta GH não é nem trivialmente aceite pois pelo menos um dos códigos é diferente de 0 (OCG = 0100 e OCH = 0010), nem trivialmente rejeitado (OCG & OCH = 0). H G Figura 1.5 – Algoritmo de Cohen-Sutherland: o segmento de recta a recortar intersecta o rectângulo de recorte. Analisando os códigos dos vértices obtém-se informação sobre qual o lado do rectângulo de recorte que deverá ser seleccionado em primeiro lugar para recortar o segmento de recta, eliminando as partes do segmento de recta que se encontram fora do rectângulo de recorte. O bit a 1 do código do 1º vértice, o vértice G, identifica a aresta inferior como aquela que deve ser seleccionada. Efectuando o cálculo de intersecção obtêm-se um novo vértice, G´ (veja-se a figura 1.6), que tem como código o valor 0000. Uma vez que o código do 1º vértice do novo segmento de recta passou a ter todos os bits a 0, selecciona-se agora o 2º vértice, H. O bit a 1 do 2º vértice conduz à selecção da aresta direita do rectângulo de recorte. Daqui resulta o cálculo de um novo vértice, H´, cujo código é 0000. O segmento de recta resultante, G´H´, que a figura 1.6 apresenta, é trivialmente aceite. 7 Computação Gráfica Recorte de Segmentos de Recta e Polígonos H H´ J I´ G´ G I Figura 1.6 – Algoritmo de CohenSutherland: segmento de recta depois de recortado. Figura 1.7 – Algoritmo de CohenSutherland: segmento de recta não trivialmente rejeitado. A rejeição ocorre depois do primeiro recorte que gera o novo ponto I’. Neste exemplo foi possível efectuar o número mínimo de cálculos de intersecções para obter-se o segmento de recta recortado, mas nem sempre tal acontece como se pode observar no exemplo que se segue. Considere-se agora uma nova situação, ilustrada na figura 1.7 e na qual os códigos do 1º e 2º vértice são os mesmos que anteriormente, mas que não intersecta o rectângulo de recorte. Sendo os código dos dois vértices exactamente os mesmos do exemplo anterior, será em primeiro lugar seleccionada a aresta inferior do rectângulo de recorte e calculado um novo vértice. O código deste vértice é idêntico ao código do 2º vértice, de que resulta a situação em que o segmento recortado é rejeitado. Dos dois exemplos é possível concluir que o algoritmo de Cohen-Sutherland não garante que o cálculo de intersecções seja efectuado só quando é necessário. Em contrapartida, o algoritmo é eficiente nas situações em que a maioria dos segmentos de recta são trivialmente aceites ou trivialmente rejeitadas, casos em que basta serem calculados os códigos dos vértices. Existem situações em que a maioria dos segmentos são trivialmente aceites ou rejeitados, pelo que o Algoritmo de Cohen-Sutherland é eficiente. Sempre que o rectângulo de recorte é muito pequeno comparado com a cena a maioria dos segmentos de recta são trivialmente rejeitados. Sempre a que o rectângulo é muito grande a maioria dos objectos são trivialmente aceites. Uma das técnicas usadas para identificar os objectos que estão na proximidade do cursor (selecção de objectos ou pick em Inglês) baseia-se na aplicação do algoritmo de recorte sobre um rectângulo de reduzidas dimensões centrado nas coordenadas do cursor, o rectângulo de selecção. Todos os objectos que sejam recortados por esse rectângulo, são seleccionados. Esta é uma situação em que o Algoritmo de CohenSutherland é eficiente. O algoritmo é facilmente estendido para 3D, bastando para tal identificar 27 sub espaços e utilizar códigos compostos por 6 bits. 8 Mário Rui Gomes 1.2.3 Computação Gráfica Algoritmo Paramétrico de Cyrus-Beck Os investigadores Cyrus e Beck seguiram uma aproximação ao problema do recorte de segmentos de recta bastante diferente da anterior. Para tal conceberam um algoritmo que permite o recorte de um segmento de recta por qualquer polígono convexo, em 2D, ou de um segmento de recta em 3D por qualquer poliedro convexo. Consideremos novamente a representação paramétrica de um segmento de recta. Como pode observar-se na figura 1.8, existem sempre 4 valores de t que resultam da intersecção da recta contendo o segmento do recta a recortar com as 4 arestas do rectângulo de recorte. t4 t3 t2 t1 Figura 1.8 – Recorte paramétrico: pontos de intersecção da recta contendo o segmento de recta a recortar com o rectângulo de recorte. Através da classificação de cada um dos pontos de intersecção é possível saber quais os valores de t dos vértices do segmento recortado, caso existam (no exemplo da figura seriam os vértices correspondentes a t2 e t3). Intersecção entre linhas Considere-se novamente a representação paramétrica de um segmento de recta: P (t ) = P0 + t ( P1 − P0 ) 0 ≤ t ≤1 (1-7) O polígono de recorte é definido pela enumeração dos seus lados (ou vértices) segundo a convenção da circulação directa (sentido contrário ao dos ponteiros do relógio). Para cada aresta define-se a normal, Ni, orientada para o exterior do polígono. Seja Pei um ponto arbitrário pertencente a uma aresta do polígono de recorte. Como pode observar-se na figura 1.9, podemos definir três vectores que partem desse ponto, 9 Computação Gráfica Recorte de Segmentos de Recta e Polígonos um deles seguindo a fronteira e os outros dois para o espaço interior e para o espaço exterior ao polígono convexo de recorte. Lado Ei Pei P1 Ni . [P(t) - Pei] > 0 Ni . [P(t) - Pei] < 0 Ni . [P(t) - Pei] = 0 P0 Ni Figura 1.9 – Algoritmo de Cyrus-Beck: produtos internos dos três vectores com a normal exterior ao polígono de recorte. O produto interno da normal à aresta do polígono com cada um destes três vectores é, respectivamente, nulo, negativo e positivo. O sinal do produto interno permite determinar se um ponto do segmento de recta coincide com a aresta ou é um ponto interior ou exterior do polígono de recorte. Para determinar o ponto de intersecção do segmento de recta com a aresta que estamos a considerar é necessário obter o valor do parâmetro no ponto de intersecção. Como vimos atrás, no ponto de intersecção o produto interno da normal à aresta com o vector que une o ponto arbitrário Pei com o ponto de intersecção é nula, ou seja N i • [P(t ) − Pei ] = 0 (1-8) Substituindo P(t) pela equação paramétrica da recta que contem o segmento de recta e explicitando o parâmetro t, obteremos sucessivamente: N i • [P0 + (P1 − P0 ) t − Pei ] = 0 N i • (P0 − Pei ) + N i • [(P1 − P0 ) t ] = 0 t= N i • (P0 − Pei ) − N i • (P1 − P0 ) e, definindo D=P1-P0, t= N i • (P0 − Pei ) − Ni • D Para ser possível calcular t é necessário que: • N i ≠ 0 , o que é sempre verdadeiro; 10 (1-9) Mário Rui Gomes Computação Gráfica • P1 e P0 não sejam coincidentes, o que é verdadeiro para qualquer segmento de recta de comprimento não nulo; • N i • D ≠ 0 , o que aconteceria se o segmento de recta a recortar fosse paralelo à aresta do polígono; Não existe intersecção se o valor de t for inferior a 0 ou superior a 1. Tendo sido obtido um modo de calcular se um ponto está no exterior ou no interior do polígono convexo de recorte e um modo de calcular o valor de t na intersecção estamos em condições de descrever o algoritmo paramétrico. Descrição do Algoritmo O algoritmo de Cyrus-Beck aplica-se sucessivamente a cada uma das arestas do polígono convexo. Para cada uma das arestas, escolhe-se, por exemplo, o primeiro vértice como Pei, calcula-se a normal exterior, Ni e o valor de t no ponto de intersecção. É ainda necessário identificar se o primeiro vértice do segmento de recta está no exterior e o 2º no interior, situação em que a intersecção é definida como Potencialmente de Entrada, PE, ou vice-versa em que a intersecção é definida como Potencialmente de Saída, PS. Para efectuar essa identificação poderia classificar-se cada vértice do segmento de recta, tal como acontecia no algoritmo da Cohen-Sutherland. No entanto, é possível efectuar a classificação com base no ângulo existente entre o vector P0P1 e o vector Ni. Se o ângulo for inferior a 90º trata-se de uma intersecção do tipo PS, se não, será do tipo PE. Esta informação está contida no sinal do produto interno entre aqueles dois vectores e que é necessário para o cálculo do próprio valor de t. N i • D < 0 ⇒ PE N i • D > 0 ⇒ PS (1-10) Estando calculados todos os valores t dos pontos de intersecção, e devidamente classificados como sendo do tipo PE ou PS, estamos em condições de identificar exactamente os valores de t dos vértices do segmento de recta já recortado. Identifica-se a intersecção do tipo PE que corresponde ao maior t e a intersecção do tipo PS que corresponde ao menor t e comparam-se os dois valores de t. Se o valor de t da intersecção do tipo PE for superior ao valor de t da intersecção do tipo PS, então todo o segmento de recta pode ser rejeitado. Se o valor de t da intersecção do tipo PE for inferior ao valor de t da intersecção do tipo PS, então usam-se os dois valores para obter as coordenadas dos vértices do segmento de recta recortado. A figura 1.10 apresenta um polígono convexo de recorte com 5 lados e um segmento de recta a recortar (P0P1). 11 Computação Gráfica Recorte de Segmentos de Recta e Polígonos P1 PS PS PE PE P0 Figura 1.10 – Algoritmo de Cyrius-Beck: segmento de recta a recortar com identificação do tipo (PE ou PS) das suas intersecções com o polígono de recorte. Do cálculo das intersecções resultam 4 valores de t, sendo dois do tipo PE e dois do tipo PS. Como o segmento de recta é paralelo ao lado inferior direito do polígono, o 5º valor de t não foi calculado uma vez que N i • D = 0 . Escolhendo-se a intersecção do tipo PE com maior valor de t e a intersecção do tipo PS com o menor valor de t obtêm-se os valores paramétricos de cada um dos vértices do segmento recortado. Considere-se agora o exemplo apresentado pela figura 1.11. Aplicando o algoritmo, são calculados 5 valores de t dos quais só são classificados os três valores representados na figura uma vez que os restantes têm valores de t inferiores a 0 ou superiores a 1. P1 PE PS PE P0 Figura 1.11 – Algoritmo de Cyrus-Beck: segmento de recta rejeitado (o maior t das intersecções de tipo PE é superior ao menor t de tipo PS). 12 Mário Rui Gomes Computação Gráfica Como pode observar-se, a intersecção do tipo PS tem um valor de t inferior ao maior valor de t de uma intersecção do tipo PE pelo que se conclui que o segmento de recta deve ser rejeitado. Pseudocódigo Pré-calcular Ni e seleccionar Pei para cada aresta Para cada segmento de recta Se P1 = P0 então segmento de recta degenerado: recortar como ponto Senão te = 0; tl= 1; para cada aresta de recorte Se Ni . D ≠ 0 então /* ignorar arestas paralelas ao segmento */ calcular t; /* de intersecção do segmento com aresta */ usar sinal de Ni . D para caracterizar PE ou PS; Se PE então tE = max(tE, t); Se PS então tS = min(tS, t); FimSe Se tE > tS então devolve nulo; Senão devolve [P(tE), P(tS)] Rectângulo de Recorte (Liang e Barsky) Quando os polígonos de recorte são rectângulos com as respectivas arestas horizontais e verticais podem ser efectuadas várias simplificações. Em primeiro lugar, os valores de Ni só têm uma coordenada com valor diferente de 0 e a outra coordenada toma o valor 1 ou –1 (veja-se a figura 1.12). Ni=(0,1) Ni=(-1,0) Ni=(1,0) Ni=(0,-1) Figura 1.12 – Algoritmo de Liang e Barsky: normais às arestas do rectângulo de recorte 13 Computação Gráfica Recorte de Segmentos de Recta e Polígonos Como nos cálculos de t é utilizado o produto da normal com o vector P0 Pei, basta utilizar uma das coordenadas de Pei, sendo irrelevante o valor da outra coordenada. Neste caso os cálculos são bastante simplificados, como pode observar-se na tabela 1.3. O algoritmo paramétrico é eficiente quando é necessário recortar a maioria dos segmentos de recta, uma vez o cálculo das coordenadas dos pontos de intersecção é adiado até se ter a certeza de que existe intersecção. Aresta Normal Ni Pei P0-Pei Esquerda: x=xmin (-1,0) (xmin,y) (xo-xmin, yo-y) Direita: x=xmax (1,0) (xmax,y) (xo-xmax, yo-y) Superior: y=ymin (0,-1) (x, ymin) (xo-x, yo-ymin) Inferior: y=ymax (0,1) (x, ymax) (xo-x, yo-ymax) t= N i • ( Po − Pei ) − Ni D − ( x0 − x min ) ( x1 − x0 ) ( x0 − x max ) − ( x1 − x0 ) − ( y 0 − y min ) ( y1 − y 0 ) ( y 0 − y max ) − ( y − y0 ) Tabela 1.3 – Algoritmo de Liang e Barsky: expressões do parâmetro do ponto de intersecção de um segmento de recta com os limites do rectângulo de recorte. 1.3 Recorte de Polígonos O recorte de polígonos implica a identificação do lugar geométrico dos pontos que simultaneamente pertencem ao polígono a recortar e ao polígono de recorte. A existência de uma topologia no caso de polígonos torna esta operação mais complexa que no caso de segmentos de recta. Assim, não basta usar as coordenadas de cada um dos vértices do polígono. Estes têm que estar ordenados segundo o sentido directo (contrário ao dos ponteiros do relógio). Figura 1.13 – Recorte de um Triângulo 14 Mário Rui Gomes Computação Gráfica Figura 1.14 – Recorte de um Polígono Côncavo Figura 1.15 – Recorte de um Polígono Côncavo (2 polígonos recortados) O problema também fica mais complexo quando é aplicado a um polígono côncavo, como o da figura 1.14. Quando é aplicado o recorte a um polígono côncavo podemos obter mais do que um polígono recortado, como pode observar-se na figura 1.15. 1.3.1 Algoritmo de Sutherland - Hodgman O algoritmo de Sutherland-Hodgman permite o recorte de qualquer tipo de polígono por um polígono convexo de recorte. Baseia-se na aproximação de “dividir para conquistar” segundo a qual se obtém um polígono recortado por recorte sucessivamente efectuado por cada uma das rectas de suporte de cada uma das arestas do polígono de recorte. Como pode observar-se nas figuras 1.16 e 1.17, o algoritmo consiste em recortar o polígono por cada uma das linhas que suportam as arestas do polígono de recorte (4 arestas, se for um rectângulo). 15 Computação Gráfica Recorte de Segmentos de Recta e Polígonos Figura 1.16 – Algoritmo de Sutherland-Hodgman: primeiro recorte pela recta que suporta a aresta direita do polígono de recorte. Figura 1.17 – Algoritmo de Sutherland-Hodgman: recorte pelas rectas que suportam as arestas inferior, esquerda e superior do polígono de recorte. A formulação do algoritmo passa do problema do recorte de um polígono por outro polígono para o recorte de um polígono por uma recta, garantindo que se mantém a topologia. Assim sendo, dada a descrição de um polígono através de uma lista de vértices (V1, V2, …, Vn), o algoritmo consiste em, ao recortar o polígono contra cada uma das rectas sobre a qual assenta uma aresta do polígono de recorte, obter uma nova lista de vértices, ou mais do que uma lista se houver lugar ao aparecimento de polígonos degenerados que são separados. Cada uma destas listas descreve um dos polígonos recortados contra cada um desses limites. Em primeiro lugar é necessário identificar se o 1º vértice se encontra dentro ou fora do polígono de recorte. Este vértice é colocado na lista de vértices do polígono já recortado se o vértice se encontrar dentro do polígono de recorte. Caso contrário, a lista permanecerá vazia. 16 Mário Rui Gomes Computação Gráfica Seguidamente podem ocorrer 4 situações quando é efectuado o tratamento de cada par de vértices formando uma aresta do polígono de recorte (vejam-se as figuras 1.18 e 1.19) • Transição Interior-Interior: Quando ambos os vértices estão contidos no semi-plano interior, o 2º vértice da aresta é adicionado à lista de vértices do polígono recortado. • Transição Interior-Exterior: Quando ocorre uma transição do semi-espaço interior para o exterior é necessário calcular o vértice de intersecção, I, o qual é adicionado à lista de vértices do polígono recortado. • Transição Exterior-Exterior: Quando ambos os vértices estão contidos no semi-plano exterior nada é adicionado à lista de vértices do polígono recortado. • Transição Exterior-Interior: Quando ocorre uma transição do semi-espaço exterior para o interior é necessário calcular o vértice de intersecção, I, o qual é adicionado à lista de vértices do polígono recortado, assim como o 2º vértice da aresta. Interior Interior Exterior Exterior S P I S P Figura 1.18 – Transição Interior – Interior e Interior – Exterior Exterior Interior Exterior Exterior I P S P S Figura 1.19 – Transição Exterior – Exterior e Exterior - Interior 17 Computação Gráfica Recorte de Segmentos de Recta e Polígonos A H´ F H F´ F´´ D´ E G´ G D B´ B C Figura 1.20 – Recorte de polígono côncavo pelo algoritmo de SutherlandHodgman. Como exemplo, vamos agora aplicar o algoritmo de Sutherland-Hodgman ao polígono côncavo com 8 vértices ordenados segundo o sentido directo (contrário ao dos ponteiros do relógio) representado na figura 1.20. Escolhendo em primeiro lugar a recta sobre a qual assenta a aresta esquerda: • A é um ponto exterior, pelo que a lista de vértices resultantes se mantém vazia; • AB: Transição EE -> nenhum dos vértices é adicionado à lista que continua vazia; • BC: Transição EI -> calcula-se a intersecção B´ que é adicionada à lista assim como o 2º vértice (B´C); • CD: Transição II -> o vértice D é adicionado à lista (B´CD); • DE: Transição IE -> calcula-se a intersecção D´ que é adicionada à lista (B´CDD´); • EF: Transição EE -> nenhum dos vértices é adicionado à lista (B´CDD´); • FG: Transição EI -> calcula-se a intersecção F´ a qual é adicionada à lista assim como o 2º vértice (B´CDD´F´G); • GH: Transição II -> o vértice H é adicionado à lista (B´CDD´F´GH); • HA: Transição IE -> calcula-se a intersecção H´ a qual é adicionada à (B´CDD´F´GHH´); Antes de passar ao recorte pela aresta superior, convém verificar o que foi obtido como polígono recortado. Analisando o conteúdo da lista de vértices (B´CDD´F´GHH´) verifica-se que obtivemos um rectângulo (B´CDD´), ligado por uma aresta (D´F´) a um 2º polígono (F´GHH´) o qual está, também ligado por uma aresta (H´B´) ao 1º polígono. Obteve-se um polígono degenerado, pelo que será 18 Mário Rui Gomes Computação Gráfica necessário efectuar um pós-processamento que transforme o polígono degenerado em dois polígonos (B´CDD´ e F´GHH´). Seguidamente efectuam-se os mesmos cálculos para cada um dos polígonos. O 1º polígono não será mais recortado pela recta que suporta a aresta superior uma vez que todos os vértices estão contidos no semi-plano interior. O 2º polígono, (F´GHH´), será processado do seguinte modo: • F´ é um vértice pertencente ao semi-espaço exterior pelo que a lista de vértices se mantém vazia (); • F´G: Transição EI -> calcula-se a intersecção F´´ que é adicionada à lista assim como o 2º vértice (F´´G); • GH: Transição IE -> calcula-se a intersecção G´ que é adicionado à lista (F´´GG´); • HH´: Transição EE -> nenhum dos vértices é adicionado à lista (F´´GG´); • H´F´: Transição EE -> nenhum dos vértices é adicionado à lista (F´´GG´); Obtém-se assim o triângulo (F´´GG´); Exercícios 1-1 Descreva, sucintamente, o algoritmo de recorte Força Bruta e descreva, justificando, uma das suas fraquezas. 1-2 Explique como procederia para adaptar o algoritmo de Cohen-Sutherland para três dimensões. Escreva o pseudocódigo resultante. 1-3 Proponha uma extensão para 3D do algoritmo de Cohen-Sutherland, incluindo o cálculo dos códigos e das intersecções. 1-4 O algoritmo de Cohen-Sutherland é particularmente eficaz no recorte de segmentos de recta contra janelas rectangulares. Considere a figura seguinte e explique como seriam processados cada um dos 5 segmentos, pelo algoritmo mencionado. Além de calcular os códigos, deve definir o critério seguido na subdivisão dos segmentos. 1 Ymax 2 5 3 Ymin 4 Xmin 1-5 Xmax Qual o critério usado no Algoritmo de Cohen-Sutherland para a definição dos códigos do 9 sub espaços? 19 Computação Gráfica Recorte de Segmentos de Recta e Polígonos 1-6 No Algoritmo de Cohen-Sutherland como é que os códigos dos vértice de um segmentos de recta pode ser usado na escolha da aresta do polígono de recorte com a qual se deve proceder ao calculo de uma intersecção? 1-7 Considere o caso da figura anexa com a qual vai ser utilizado o algoritmo de Cohen-Sutherland no recorte da segmento de recta poligonal ABCD pelo polígono de recorte. Calcule os códigos dos vértices. Qual o significado de um 1 no código do ponto C? Como aplicaria esse algoritmo no recorte do polígono ABCD? C B A D 1-8 Considere o algoritmo de Cohen – Suntherland. a) Qual o número máximo de recortes de um segmento de recta aplicando esse algoritmo? b) Quais os códigos dos vértices de um segmento de recta de modo a que o número máximo de intersecções seja 0? 1-9 Descreva sucintamente o modo como funciona o Algoritmo de Cyrus-Beck e indique um ponto fraco e outro forte desse algoritmo. 1-10 Aplique o algoritmo de Cyrus-Beck à figura. Inclua a classificação de todos os pontos de intersecção que o algoritmo calcula. 1-11 Descreva os principais problemas que podem ocorrer ao aplicar o recorte a um polígono côncavo? Justifique, utilizando uma figura. 1-12 Descreva o algoritmo de Sutherland – Hodgman. O que poderá acontecer se o algoritmo for aplicado a um polígono côncavo? Ilustre com um exemplo. 1-13 Por que é que o algoritmo de Sutherland-Hodgman só funciona com polígonos de recorte convexos? Dê um exemplo. 20