Algoritmos de Recorte em 2D
Computação Gráfica – DCC065
Sumário
● Conceito de Janela ● Recorte (Clipping)
● Introdução
● Algoritmo simples (Força Bruta) ● Algoritmo de Cohen-Sutherland
● Recorte por área
●Algoritmo de Sutherland-Hodgman
Janelas
Uma cena é composta por uma série de objetos em “coordenadas do mundo”
Coordenadas do Mundo
Janelas
Quando apresentamos uma cena, apenas os objetos contidos em uma janela em particular são mostrados
wymax
wymin
wxmin wxmax
Janelas
Desenhar objetos tem um custo computacional, por isso é necessário recortar tudo que está
fora da janela wymax
wymin
wxmin wxmax
Coordenadas do Mundo Janela
Recorte
Para a imagem abaixo, considere quais linhas e pontos deveriam estar dentro ou fora da
janela.
wymax
wymin
wx wx
Janela
P1
P2
P3 P6
P5 P7
P10 P9
P4
Recorte
Para a imagem abaixo, considere quais linhas e pontos deveriam estar dentro ou fora da
janela.
wymax
wymin
wxmin wxmax Janela
P1
P2
P3 P6
P5 P7
P10 P9
P4
P8
Recorte
Para a imagem abaixo, considere quais linhas e pontos deveriam estar dentro ou fora da
janela.
wymax
wymin
wx wx
Janela
P1
P2
P3 P6
P5 P7
P10 P9
P4
Recorte
Para a imagem abaixo, considere quais linhas e pontos deveriam estar dentro ou fora da
janela.
wymax
wymin
wxmin wxmax Janela
P1
P2
P3 P6
P5 P7
P10 P9
P4
P8
Recorte de Pontos
Fácil – um ponto (x,y) NÃO é cortado se: wxmin ≤ x ≤ wxmax E wymin ≤ y ≤ wymax
senão será cortado
wymax
wymin
Window
P1
P2
P5 P7
P10 P9
P4
P8 Cortado
Pontos que não serão cortados
Cortado
Recorte de linha
Complicado – devemos examinar os extremos de cada linha para avaliarmos se ela está
dentro ou fora da janela de visualização
Situação Ação Ação
Extremos dentro da
janela Não Recortar!
Um extremo dentro e
um fora Recortar!
Extremos fora da janela
Recorte de linha – Força Bruta
Recorte de linha “forçado” pode ser feito da seguinte forma:
● Não recorte linhas com
extremos dentro da janela
● Para linhas com uma
ponta dentro da janela e outra fora, calcule o ponto de interseção e recorte
Recorte de linha – Força Bruta
● Para linhas com os
extremos fora da janela devemos testá-las contra todas as bordas da janela e recortar de forma
apropriada.
Entretanto, calcular interseção de linha é
computacionalmente dispendioso. Se a
cena tiver um número grande de segmentos
de reta o método de “força bruta” é muito
Algoritmo de Cohen-Sutherland
● É um algoritmo clássicode recorte de linha
● A vantagem chave deste
algoritmo em relação ao anterior é reduzir
drasticamente o número de interseções que
precisam ser calculadas
Dr. Ivan E. Sutherland
auxiliou o desenvolvimento deste algoritmo. Sutherland é uma das referências na área de CG. Ele foi o inventor dos primeiros HMD (Head
Algoritmo de Cohen-Sutherland
Neste algoritmo, o mundo é dividido em
regiões baseadas nas fronteiras da janela de interesse
● Cada região tem um código único de 4 bits, um
para cada semi-espaço.
● Os bits de cada ponto são classificados como
dentro = 0 e fora = 1 em relação a cada
semi-espaço. 1001 1000 1010
0001 0000Janela 0010
0101 0100 0110
Cohen-Sutherland: Identificação
Os pontos que compõem cada linha são identificados com códigos de região
apropriados
wymax
wymin
wxmin wxmax
Janela
P3 [0001] P6 [0000] P5 [0000]
P7 [0001]
P10 [0100] P9 [0000]
P4 [1000]
P8 [0010] P12 [0010] P11 [1010]
Algoritmo de Cohen-Sutherland
●
Aceitação trivial:
Classif(P1)
OR
Classif(P2) = 0
●
Rejeição trivial:
Classif(P1)
AND
Classif(P2) ≠ 0
●
Interseção com quais semi-espaços?
Classif(P1)
XOR
Classif(P2)
Algoritmo de Cohen-Sutherland
1001 1000 1010
0001 0000 0010
0101 0100 0110 1001 1000 1010
0001 0000 0010
0101 0100 0110
0000 OR 0000 = 0000
0000 AND 0000 = 0000 0000 XOR 0000 = 0000
1010 OR 0110 = 1110
1010 AND 0110 = 0010
Algoritmo de Cohen-Sutherland
19
1001 1000 1010
0001 0000 0010
0101 0100 0110 1001 1000 1010
0001 0000 0010
0101 0100 0110
0001 OR 0100 = 0101 0001 AND 0100 = 0000
0001 XOR 0100 = 0101
0100 OR 1010 = 1110 0100 AND 1010 = 0000
Cohen-Sutherland: Outras Linhas
● Como visto, linhas que não podem ser
classificadas como completamente dentro ou fora da janela podem ou não cruzar seu interior
● Podemos usar os códigos de região para
determinar quais semi-espaços devem ser considerados no cálculo de interseção
● Como visto anteriormente, para checar se uma
Cohen-Sutherland: Outras Linhas
● Estas linhas são processadas da seguinte
forma:
● Compare uma extremidade fora da janela com
uma borda (da janela) e determine quanto pode ser descartado
● Se o restante da linha estiver dentro da janela ou
fora da janela mantenha o segmento ou recorte, respectivamente
● Senão, compare o restante da linha com as outras
bordas da janela
● Continue o processo até que a linha seja
descartada ou um segmento dentro da janela seja encontrado
●
Cohen-Sutherland: Exemplos
● Considere a linha (P9, P10)
● Começaremos em P10
● Considerando os códigos
de região dos pontos
sabemos que a linha não cruza as bordas direita e esquerda
● Calculamos a interseção
da linha em relação ao
semi-espaço inferior para gerar o ponto P10’
● A linha (P9 ,P10’) está completamente contida na
janela e, desta forma, será mantida
wymax
wymin
wxmin wxmax Janela
P10 [0100] P9 [0000]
Cohen-Sutherland: Exemplos
● Considere agora a linha (P3, P4 )● Começaremos em P4
● Considerando os códigos
de região dos pontos sabemos que a linha cruza o semi-espaço
esquerdo. Calculando a interseção da linha com este semi-espaço o ponto P4’ é gerado
● A linha (P3 ,P4’) está completamente fora da
janela e, portanto, será descartada ( a linha (P4 ,P4’) também )
wymax
wymin
wxmin wxmax Janela
P4’ [1001]
P3 [0001]
P4 [1000]
P3 [0001]
Cohen-Sutherland: Exemplos
● Considere a linha (P7, P8)
● Começaremos por P7
● Considerando os códigos
de região dos pontos sabemos que a linha
cruza a borda esquerda então calcularemos a interseção da linha com esta borda para gerar o ponto P7’
wymax
wymin
wxmin wxmax Janela
P7’ [0000]
P7 [0001] P8 [0010]
Cohen-Sutherland: Exemplos
● Considere a linha (P7’, P8)
● Começaremos de P8
● Calculando a interseção
com a borda direita geraremos P8’
● O ponto (P7’ ,P8’)
está dentro da janela e portanto será
mantido
wymax
wymin
wxmin wxmax Janela
P7’ [0000]
P7 [0001] P8 [0010]
P8’ [0000]
Outros algoritmos
● Outros algoritmos para recorte de linha mais
eficientes foram propostos posteriormente. Entre eles podemos citar:
● Cyrus-Beck ● Liang-Barsky
Recorte de Polígonos
● Polígonos são definidos por arestas
● Por que não utilizar algoritmos de recorte de
linhas?
● Geram segmentos de reta desconexos
● Precisamos de uma área delimitada após o
recorte
● A área deve ser rasterizada posteriormente
● A saída do cortador deve ser uma sequência de
vértices que define as fronteiras cortadas
Algoritmo de
Sutherland-Hodgman
● Aplicado a cada fronteira separadamente ● Partes visíveis são repassadas ao próximo
cortador
● Começamos com o conjunto inicial de
vértices
● Após cada fronteira, uma nova sequência de
Algoritmo de
Sutherland-Hodgman
● Este algoritmo utiliza quatro tipos de
transição:
● Fora-dentro ● Dentro-dentro ● Dentro-fora ● Fora-fora
● O tipo de transição determina quais vértices
serão salvos
Algoritmo de
Sutherland-Hodgman
● Transição “fora-dentro”
v1'
v1 v
2
v3 v4
Vértices salvos: v1’ e v2
Algoritmo de
Sutherland-Hodgman
● Transição “dentro-dentro”
v1 v
2
v3 v4
Vértices salvos: v3
Janela
Algoritmo de
Sutherland-Hodgman
● Transição “dentro-fora”
v3'
v1 v
2
v3 v4
Vértices salvos: v3’
Algoritmo de
Sutherland-Hodgman
● Transição “fora-fora”
v1 v
2
v3 v4
Vértices salvos: nenhum
Janela
Algoritmo de
Sutherland-Hodgman
● Transição “fora-fora”
Algoritmo de
Sutherland-Hodgman
● Lista de vértices de saída de uma fronteira é
a entrada para o cortador da próxima fronteira
● Como otimizar?
● Processar vértices individualmente
● Vértices são incluídos ou removidos da lista de
saída somente após terem sido classificados com relação a todos planos
● Vértice classificado como exterior é
imediatamente retido
Algoritmo de
Sutherland-Hodgman
● Exemplo 1
v1
v2
v3
v4
Algoritmo de
Sutherland-Hodgman
● Exemplo 1
v1
v2
v3
v4
Vértices
v1 OUT v2 IN v3 IN v4 IN Janela
Algoritmo de
Sutherland-Hodgman
● Exemplo 1
v1
v2
v3
v4
Vértices
v1 OUT v2 IN
v3 IN v4 IN v1’
Algoritmo de
Sutherland-Hodgman
v1
v2
v3
v4
Vértices
v1 OUT
v2 IN v3 IN
v4 IN
v1’
v4’
Janela
39
● Exemplo 1
v1
Algoritmo de
Sutherland-Hodgman
v2
v3
v4
Vértices
v1’ IN v2 OUT v3 IN v4 IN v4' IN v1’
v4’
Algoritmo de
Sutherland-Hodgman
● Exemplo 1
v1
v2
v3
v4
Vértices
v1’ IN v2 OUT
v3 IN v4 IN v4' IN v1’
v1’’
v4’
Janela
Algoritmo de
Sutherland-Hodgman
● Exemplo 1
v1
v2
v3
v4
Vértices
v1’ IN
v2 OUT v3 IN
v4 IN v4' IN v1’
v1’’ v2’
v4’
Algoritmo de
Sutherland-Hodgman
● Exemplo 1
v1
v2
v3
v4
Vértices
v1’ IN v1’’ IN v2' IN
v3 OUT v4 IN v4' IN v1’
v1’’ v2’
v4’
Janela
Algoritmo de
Sutherland-Hodgman
● Exemplo 1
v1
v2
v3
v4
Vértices
v1’ IN v1’’ IN
v2' IN v3 OUT
v4 IN v4' IN v1’
v1’’ v2’
v2’ ’
v4’
Algoritmo de
Sutherland-Hodgman
● Exemplo 1
v1
v2
v3
v4
Vértices
v1’ IN v1’’ IN v2' IN
v3 OUT v4 IN
v4' IN
45
v1’
v1’’ v2’
v2’ ’
v3’ v4’
Algoritmo de
Sutherland-Hodgman
● Exemplo 1
v1
v2
v3
v4
Vértices
v1’ IN v1’’ IN v2' IN v2'' IN v3' IN
v4 OUT v4' IN v1’
v1’’ v2’
v2’ ’
v4’
Janela
Algoritmo de
Sutherland-Hodgman
● Exemplo 1
v1
v2
v3
v4
Vértices
v1’ IN v1’’ IN v2' IN v2'' IN
v3' IN v4 OUT
v4' IN v1’
v1’’ v2’
v2’ ’
v3’ v3’’
v4’
Janela
Algoritmo de
Sutherland-Hodgman
● Exemplo 1
v1
v2
v3
v4
Vértices
v1’ IN v1’’ IN v2' IN v2'' IN v3' IN
v4 OUT v4' IN
v1’
v1’’ v2’
v2’’
v3’ v3’’
v4’’ v4’
Algoritmo de
Sutherland-Hodgman
● Exemplo 1
v 1 v 2 v 3 v4 Vértices
v1’ IN v1’’ IN v2' IN v2'' IN v3' IN v4' IN v4'' IN v1’
v1’’ v2’
v2’ ’
v3’ v3’’
v4’’ v4’
Janela
Algoritmo de
Sutherland-Hodgman
● Exemplo 2
v1
v3
Algoritmo de
Sutherland-Hodgman
● Exemplo 2
Vértices
v1 OUT v2 IN v3 IN v1
v3
v2
Janela
Algoritmo de
Sutherland-Hodgman
● Exemplo 2
Vértices
v1 OUT v2 IN
v3 IN v1
v3
v2
v1’
Algoritmo de
Sutherland-Hodgman
● Exemplo 2
Vértices
v1 OUT
v2 IN
v3 IN
v1
v3
v2 v3’
v1’
Janela
Algoritmo de
Sutherland-Hodgman
● Exemplo 2
Vértices
v1' IN v2 IN v3 IN v3' IN v1
v3
v2 v3’
Algoritmo de
Sutherland-Hodgman
● Exemplo 2
Vértices
v1' IN v2 OUT v3 IN v3' IN v1
v3
v2 v3’
v1’
Janela
Algoritmo de
Sutherland-Hodgman
● Exemplo 2
Vértices
v1' IN v2 OUT
v3 IN v3' IN v1
v3
v2 v3’
v1’
v1’
Algoritmo de
Sutherland-Hodgman
● Exemplo 2
Vértices
v1' IN
v2 OUT v3 IN
v3' IN v1
v3
v2 v3’
v1’
v1’ v2’
Janela
Algoritmo de
Sutherland-Hodgman
● Exemplo 2
Vértices
v1' IN v1'' IN v2' IN V3 OUT v3' IN v1
v3
v2 v3’
v1’
v1’’ v2’
Algoritmo de
Sutherland-Hodgman
● Exemplo 2
Vértices
v1' IN v1'' IN
v2' IN V3 OUT
v3' IN v1
v3
v2 v3’
v1’
v1’’ v2’ v2’’
Janela
Algoritmo de
Sutherland-Hodgman
● Exemplo 2
Vértices
v1' IN v1'' IN v2' IN
V3 OUT v3' IN
v1
v3
v2 v3’
v1’
v1’’ v2’ v3’’ v2’’
Algoritmo de
Sutherland-Hodgman
● Exemplo 2
Vértices
v1' IN v1'' IN v2' IN v2'' IN v3' IN v3'' IN v1
v
3
v
2
v3’
v1’
v1’’ v2’ v3’’ v2’’
Janela
Algoritmo de
Sutherland-Hodgman
● Exemplo 3
v
v
2
v2
v3
v5
v v1
Algoritmo de
Sutherland-Hodgman
● Exemplo 3
Vértices
v1 IN v2 OUT v3 OUT v4 IN v5 IN v
v
2
v2
v3
v5
v4 v1
Janela
Algoritmo de
Sutherland-Hodgman
● Exemplo 3
Vértices
v1 IN v2 OUT
v3 OUT v4 IN v5 IN v
2
v2
v3
v5
v4 v1
v1’
Algoritmo de
Sutherland-Hodgman
● Exemplo 3
Vértices
v1 IN v2 OUT
v3 OUT v4 IN
v5 IN v
v
2
v2
v3
v5
v4 v1
v1’
v3’
Janela
Algoritmo de
Sutherland-Hodgman
● Exemplo 3
Vértices
v1 IN v1' IN v3' OUT
v4 OUT v5 IN v
v
2
v2
v3
v5
v4 v1
v1’
v3’
Algoritmo de
Sutherland-Hodgman
● Exemplo 3
Vértices
v1 IN
v1' IN v3' OUT
v4 OUT v5 IN v
v
2
v2
v3
v5
v4 v1
v1’
v3’ v3’
Janela
Algoritmo de
Sutherland-Hodgman
● Exemplo 3
Vértices
v1 IN v1' IN v3' OUT
v4 OUT v5 IN
v
v
2
v2
v3
v5
v4 v1
v1’
v3’
v1’’ v
4’
Algoritmo de
Sutherland-Hodgman
● Exemplo 3
Vértices
v1 IN v1' IN v1'' IN
v4' OUT v5 OUT v v 2 v2 v3 v5 v4 v1
v1’
v3’
v1’’ v
4’
Janela
Algoritmo de
Sutherland-Hodgman
● Exemplo 3
Vértices
v1 IN v1' IN
v1'' IN v4' OUT
v5 OUT v v 2 v2 v3 v5 v4 v1
v1’
v3’
v1’’ v
4’
Algoritmo de
Sutherland-Hodgman
● Exemplo 3
Vértices
v1 IN
v1' IN v1'' IN
v4' OUT
v5 OUT
v v 2 v2 v3 v5 v4 v1
v1’
v3’
v1’’ v
4’
v1’’’ v5’
Janela
Algoritmo de
Sutherland-Hodgman
● Exemplo
Vértices
v1 OUT v1' OUT v1'' IN v1''' IN
v5' OUT v v 2 v2 v3 v5 v4 v1
v1’
v3’
v1’’ v4’
v1’’’ v5’
Algoritmo de
Sutherland-Hodgman
● Exemplo 3
Vértices
v1 OUT
v1' OUT v1'' IN
v1''' IN v5' OUT v v 2 v2 v3 v5 v4 v1
v1’
v3’
v1’’ v4’
v1’’’ v5’
v1’’’’
Janela
Algoritmo de
Sutherland-Hodgman
Vértices
v1 OUT v1' OUT v1'' IN
v1''' IN v5' OUT
v v 2 v2 v3 v5 v4 v1
v1’
v3’
v1’’ v
4’
v1’’’ v5’
v1’’’’ v1’’’’’
Algoritmo de
Sutherland-Hodgman
Vértices
v1'''' IN v1'' IN v1''' IN v1''''' IN v 1 v 3 v 2 v 2 v 3 v 5 v4 v 1 v1 ’
v1’’ v
4
’ v1’’’
v5 ’
v1’’’’ v1’’’’’
Janela
75
Algoritmo de
Sutherland-Hodgman
● Este algoritmo recorta corretamente qualquer
polígono, mas somente contra janelas convexas!
● Existem algoritmos mais genéricos, que
podem ser utilizados para recorte contra janelas côncavas, mas possuem um custo computacional maior. Exemplo:
Recorte – Aplicação
● Normalmente cenas são renderizadas em uma
janela retangular
● Neste cenário, os algoritmos vistos nesta aula
podem ser aplicados para remover objetos ou parte de objetos que estiverem fora desta
janela
● Após o recorte, o próximo passo na
visualização dos objetos em uma cena é
definir em que parte da janela (física) estes objetos serão representados
● Essa porção da janela é chamada Viewport
Entidades de Visualização
● Window (Janela de Recorte)
● É área do mundo a ser visualizada e é definida em
coordenadas do mundo
● Exemplo de comando: glOrtho
● Viewport
● Área a ser visualizada na janela do dispositivo ● É a área onde a window definida é mapeada. ● Exemplo de comando: glViewport
●
Janela
● Janela do dispositivo de saída (janela física)
81
Saiba mais!
● Computer Graphics, C Version
● Capítulo 7
Este capítulo trata dos algoritmos de recorte visto nesta aula
acrescidos de uma visão detalhada de outros algoritmos correlatos. Há também uma explicação teórica
Saiba mais!
● OpenGL Programming Guide
Seventh Edition
● Capítulo 3
Você encontrará muita informação a respeito da criação de janelas e
Resumo
●
Nesta aula vimos
●
Algoritmos de recorte de linhas.
●
Algoritmos de recorte de polígonos.
●
Entidades de visualização em OpenGL.
Exercício – Relação Window x Viewport
● Para os exercícios a seguir, utilize como base o
projeto Viewport
● Verifique o código e entenda o seu funcionamento
Exercício – Relação Window x Viewport
1. Desenvolva um programa que crie a ilustração do
slide a seguir. Nesse programa, serão desenhadas 4 viewports, e para cada viewport será projetada uma Window com parâmetros diferentes.
Desenvolva uma função para criar a ilustração do canto superior esquerdo desta janela e visualize
esta ilustração por esses quatro pontos de vista
diferentes. Lembre-se de criar uma window e uma
viewport para cada um dos quadrantes da imagem ao lado. Utilize as constantes GL_PROJECTION (para utilizar o comando glOrtho) e
GL_MODELVIEW (para viewport e desenhos) corretamente.
Exercício – Relação Window x Viewport
2. Baseado no exercício anterior faça uma modificação na
qual as viewports sejam visíveis e selecionáveis. A ideia encontra-se ilustrada no próximo slide. Basicamente as viewports passarão a estar visíveis por uma caixa envoltória branca (os parâmetros dos comandos glOrtho utilizados em cada ilustração podem ajudar a definir essas caixas). Deve-se criar um código que identifique qual viewport foi clicada. Para essa identificação, faça uso das coordenadas das viewports. Ao clicar e arrastar dentro da viewport selecionada com o botão esquerdo do mouse, a representação do mundo visualizado por ela mudará de posição (Essa mudança será realizada através de modificações do comando glOrtho correspondente).