Computação
Gráfica
Trabalho I
Aceleração de Testes de Interseção
Objetivo
Avaliar algoritmos de aceleração do processo de detecção de intersecções entre
linhas.
Descrição
Devem ser implementados dois
algoritmos:
· Envelopes AABB;
· Subdivisão Regular do
espaço.
O trabalho deve ser desenvolvido com
base no código que está disponível a seguir.
C/C++ |
Python |
Java |
Este código gera um conjunto aleatório
de segmentos de reta e exibe-os na tela.
Quando existe uma colisão entre dois
segmentos, estes são exibidas na cor vermelha. Do contrário, estes são exibidos
em verde.
A figura a seguir mostra um exemplo
de execução, no qual foram gerados 100 segmentos de reta.
Pressionando ESPAÇO, o programa gera
um novo conjunto de segmentos de reta e atualiza a imagem exibida. Além disto,
o programa informa, no console, quantas intersecções ocorreram entre os
segmentos gerados.
Figura - Exemplo de Execução do Programa
Deve ser produzido um relatório que
demonstre como o algoritmo se comporta na medida em que:
· aumenta a quantidade
de segmentos de reta do cenário;
· aumenta a quantidade
de subdivisões do espaço;
· aumenta o tamanho
dos segmentos de reta que compõem o cenário.
O comportamento dos algoritmos deve
ser medido com base no número de chamadas da função apresentada a seguir
//
**********************************************************************
//
//
**********************************************************************
bool HaInterseccao(Ponto k, Ponto l, Ponto m, Ponto n)
{
int ret;
double s,t;
ret = intersec2d( k, l, m, n,
s, t);
if (!ret) return false;
if (s>=0.0 && s <=1.0 && t>=0.0 && t<=1.0)
return true;
else return false;
}
O tamanho dos segmentos de reta é
controlado na função init, apresentada a seguir,
que executa as chamadas do método geraLinha. O
primeiro parâmetro deste método define o valor máximo das coordenadas (X,Y) dos extremos do segmento e o segundo parâmetro define o
tamanho máximo do segmento.
void init(void)
{
//
Define a cor do fundo da tela (BRANCO)
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
srand(unsigned(time(NULL)));
for(int
i=0;
i< N_LINHAS; i++)
Linhas[i].geraLinha(MAX_X, 10);
}
Requisitos
Deve ser possível fazer entre 2 e 50
subdivisões, tanto na horizontal quanto na vertical, sem a necessidade de
recompilar o código.
As estruturas de envelopes e de
subdivisão devem ser geradas apenas uma vez, logo após a geração dos segmentos
de reta.
No caso do algoritmo de subdivisão
do espaço:
· não devem ser feitas
busca para localizar que célula se encontra um segmento;
· não devem ser feitas
cópias das retas que compõem o cenário. A estrutura deve armazenar apenas o
número do segmento, no vetor de todos os segmentos.
Entrega
FIM.