recorte ( clipping ) de : o segmentos de retas o polígonos o textos Prof. Julio Arakaki 2005 1
Recorte ( clipping ) Ponto Processo de visualização que leva em conta apenas o conteúdo da janela de desenho. Assumindo que a janela para recorte seja uma área retangular, um ponto (x,y) será desenhado numa área de tela se obedecer as seguintes inequações: xwmin <= x <= xwmax ywmin <= y <= ywmax onde, as bordas da janela podem ser uma janela de coordenadas globais ou as bordas de uma viewport. Retas (segmentos de retas) Para realizar o recorte de segmentos de retas, é necessário testar se o segmento esta totalmente fora ou totalmente dentro da área de recorte. Caso contrário, deve-se achar as intersecções do segmento com as bordas da janela de recorte. P9 P4 P2 P10 P2 P3 P1 P8 P1 P5 P6 P5 P6 P8 P7 P7 Antes do clipping Depois do clipping 2
Cohen-Sutherland line clipping É um dos mais antigos e populares algoritmos baseados em recorte de segmentos de reta. Todas as extremidades dos segmentos são codificadas através de um código binário de 4 dígitos, que identifica a localização do ponto em relação às bordas da área de recorte. Uma possível codificação poderia ser: 1001 1000 1010 (xwmax, ywmax) Onde: 0001 (xwmin, ywmin) 0000 0010 bit1: left bit2: right bit3: below bit4: above 0101 0100 0110 Se uma extremidade tem código 0101 então, este ponto esta à esquerda e abaixo da janela. Assim, para fazer o recorte em função de uma janela pré-estabelecida, deve -se seguir as seguintes regras: Os segmentos de reta cujas extremidades tem códigos 0000, estão totalmente dentro da área de recorte. Os segmentos de reta que possuem códigos das extremidades com 1 no mesmo bit, estão totalmente fora da área de recorte. Os segmentos que não são identificadas como totalmente dentro ou totalmente fora, deverão ser recortados de acordo com o algoritmo a seguir: 3
P2 P2 P2 P3 P1 P1 P4 Para os segmentos da figura, temos: 1. Verificar a posição relativa de P1 em função da janela (right, left, below ou above): abaixo da janela 2. Procurar a intersecção com a borda inferior da janela e definir P1 3. Verificar a posição de P2 em relação à janela: esquerda e acima da janela. Definir P2 e P2 através da intersecção com a borda esquerda e superior, respectivamente. 4. Armazenar segmento definido por P1 e P2. Cálculo dos pontos de intersecção das linhas com as bordas da janela: Seja um segmento de reta definido por: (x1, y1) e (x2, y2), o ponto de intersecção (x, y) é dado por: Para intersecção com as bordas verticais: y = y1 + m(x - x1), onde x pode valer xwmin ou xwmax. Para intersecção com as bordas horizontais: x = x1 + (y - y1)/m, onde y pode valer ywmin ou ywmax. Onde, 4
m = (y2-y2)/(x2-x1) Polígonos: Um polígono é formado por um conjunto de segmentos de retas interligados e formando uma área fechada. A utilização de algoritmos para recorte de polígonos, acarretará em uma série de segmentos não conectados como na figura abaixo. Desta maneira, os algoritmos para recorte de polígonos deverão recortar os segmentos de retas e também fechar as áreas formadas após o recorte. Incorreto Correto 5
Sutherland-Hodgeman polygon clipping V2 V2 V2 IN V2 Left Clipper Right Clipper botton Clipper Top Clipper V2, V2, V2, V2 OUT V2, V2 Este algoritmo, funciona bem para polígonos convexos. Para polígonos côncavos pode ocorrer a seguinte situação: Produz duas áreas conectadas. CORRETO 6
Este tipo de problema ocorre quando o polígono a ser recortado tem duas ou mais áreas separadas após o recorte. A solução para este problema, é a utilização de um algoritmo mais genérico. Weiler-Atherton Polygon Clipping V2 V4 V4 V6 V5 V5 Algoritmo: Seguir as bordas do polígono no sentido horário e aplicar as seguintes regras: Para um par de vértices outside to inside, segue-se a borda do polígono, armazenando-se o ponto de intersecção. Para um par de vértice inside to outside, segue-se a borda da janela. 7
clipping de textos Envoltória no texto Envoltória sobre cada caractere Sem envoltória Para texto vetorial, utiliza-se clipping de retas. Para texto matricial, verifica-se cada pixel da matriz de caractere em relação às bordas da janela. 8