Projeto de Geometria Computacional - ano 2000



Integrantes
N. USP
e-mail
Bitwise
Cláudio Seidi Takamiya
2869604
cst@linux.ime.usp.br
Estressado
Fábio Pará D' Incecco
3021187
incecco@linux.ime.usp.br
CyberCop
Wu Chen Lung
2231931
wlung@linux.ime.usp.br

Nesta página você poderá acompanhar como foi o desenvolvimento do projeto que escolhemos:

Problema do Par mais Próximo no R²
Arquivos Fontes
Execut�vel (linkado estaticamente)

Observa��es:

Como este projeto foi feito em C, h� alguns requisitos b�sicos para o funcionamento:

- GLUT/Mesa

- GTK e GDK

- Biblioteca GTK GLArea Arquivo para instala��o



� poss�vel entrar com os pontos do conjunto no formato arquivo texto, ou atrav�s de cliques do mouse.
O formato do arquivo texto deve ser:

3 --------------------> N�mero de pontos do conjunto
5.36 -5----------------> Coordenadas (x,y) dos pontos, um por linha
0 -1.2
1 2.04

Maiores informa��es podem ser encontradas no menu Ajuda do programa execut�vel.

Relatório do desenvolvimento:


O objetivo desse relat�rio � descrever as tomadas de decis�es que tivemos 
que fazer durante o desenvolvimento do projeto de Geometria Computacional, 
intitulado Problema do Par mais Pr�ximo, realizado no ano de 2000. 
(Data de cria��o [in�cio] do projeto: 23/05/2000)

23/05/2000:
        Ao pensarmos melhor no problema e na interface que teria que ser feita
com o usu�rio, decidimos alterar a biblioteca que usar�amos. Ao inv�s de se
utilizar a Mesa/GLUT, precisaremos usar a GTK, pois esta cont�m intrinsicamente
fun��es usadas para controle de janelas, bot�es e caixas de di�logo.
        Quanto ao problema de desenho, vimos que todas as fun��es que 
usar�amos no Mesa, possuem equivalentes no GTK, n�o alterando muito o que 
tinhamos planejado. Pelo que vimos, h� uma biblioteca chamada GDK, que pode
ser usada em conjunto com o GTK, usada para desenhos.

20/06/2000:
        Retomamos o projeto, ainda pensando nas estruturas que teremos que 
        utilizar para desenvolvermos o Problema do Par mais Pr�ximo.
         Precisaremos ter:
         Estrutura para guardar os n pontos do R� : 
         Lista duplamente ligada: P ={0,...,n-1}

         (D1,p1,p2) = ParProximo(P):  
         Se #elementos <= 3, use for�a bruta e devolva (Dmin,pmin1,pmin2).
         Caso contr�rio: /* Divis�o, conquista e combina��o */
              2 PR�-PROCESSAMENTOS:
              - Ordena��o dos pontos segundo as x-coordenadas (em caso de 
              empate, use como decis�o a coordenada y). [O(n.logn)] 
              Coloque o resultado em um vetor X.
              - Ordena��o dos pontos segundo as y-coordenadas (em caso de 
              empate, use como decis�o a coordenada x). [O(n.logn)]
              Coloque o resultado em um vetor Y.
              
              ALGORITMO de Divis�o e Conquista [O(n)]
              Dividir:
              * Pegue o elemento do meio em X e considere-o como mediana do
                conjunto, chame-o de med.
              * Tome Pl o conjunto {0,...,med} de pontos.       
              * Tome Pr o conjunto {med+1,...,n-1} de pontos.   
                      
              Conquistar: Resolver recursivamente para os dois conjuntos.
              * (Dl,pl1,pl2) = ParProximo(Pl).        
              * (Dr,pr1,pr2) = ParProximo(Pr).        
              * onde: Dr = dist(pr1, pr2);
              *       Dl = dist(pl1, pl2);

              Combinar: 
              * D = min(Dl, Dr);
              * Calcula-se todos os pontos de Pl a uma dist. <= D da reta 
              vertical dada pela mediana em X (reta: x = med). => Conj. Pl'
              * Calcula-se todos os pontos de Pr a uma dist. <= D da reta 
              vertical dada pela mediana em X (reta: x = med). => Conj. Pr'.
              *  Para cada ponto p em Pl' fa�a:
                      Encontre os pontos em Pr' a uma dist. m�xima D de p:
                      Para isso, projete p em y:
                       Percorra Pr' e tome apenas os pontos q cujo c�lculo:
                        |q.y - p.y| <= D. O n�mero m�ximo de q ser� 6.
                       Calcule a dist�ncia entre p e cada q.
                 No final encontraremos um par (p3,q3) que dever� ser o
                 que tem menor dist�ncia nessa faixa entre Pl' e Pr'.
              * Para determinar o par mais pr�ximo, teremos que determinar
              quem � o m�nimo entre Dl = dist(pl1, pl2), 
                                    Dr = dist(pr1, pr2),
                                    Dm = dist(p3, q3).
                                    Chame-os de Dmin, pmin1, pmin2
              RETORNE: (Dmin, pmin1,pmin2).     
27/06/2000:
        In�cio da implementa��o propriamente dita:
        Come�amos a desenvolver as estruturas para guardar os pontos e tamb�m
        o algoritmo de ordena��o dos pontos segundo suas x-coordenadas.
        Escolhemos o Quicksort como algoritmo de ordena��o, seguindo uma 
        implementa��o dada no livro do Sedgewick (Algorithms in C), que se o
        vetor a ser ordenado for menor que uma certa constante M, n�o se chama
        o Quicksort recursivamente. No final, � feita uma ordena��o 
        InsertionSort que rearruma os termos que n�o foram ordenados. Mesmo com
        essa passagem do vetor por um Insertionsort, o custo da ordena��o ainda
        � O(n.log n).
        O algoritmo ainda n�o est� perfeito, caso haja pontos com mesma 
        coordenada x. Ou seja, ainda n�o colocamos o desempate pela y-coordenada.

28/06/2000:
        O algoritmo para ordenar em rela��o � x-coordenada foi arrumado. 
        Ou seja, agora tamb�m est� funcionando quando h� empate na coordenada x
        dos pontos analisados.
        Tamb�m foi pensado uma forma r�pida de reaproveitar o c�digo e poder 
        us�-lo para ordena��o em rela��o � y-coordenada sem muitas altera��es.

29/06/2000:
        Foi implementado o algoritmo para ordena��o atrav�s das y-coordenadas 
        dos pontos. A id�ia foi tentar reaproveitar ao m�ximo o c�digo que j� 
        tinhamos feito para ordenar em rela��o � x-coordenada.
        Partindo desse princ�pio, foram necess�rios apenas alguns ajustes 
        nas fun��es que eram respons�veis pela compara��o das coordenadas 
        de dois pontos, que eram passados como par�metros.
        Sendo assim, � parte do projeto que corresponde ao pr�-processamento,
        que � a ordena��o dos pontos em termos das x-coordenadas e  
        y-coordenadas, j� est� feito. Resta apenas testar para quantidades
        realmente grande de n�meros (mais de 30 pontos, por exemplo).

04/07/2000:
        Retomamos o projeto. Nosso objetivo hoje � come�ar a implementar a 
        parte interna do programa, ou seja, a parte respons�vel pela 
        determina��o do par de pontos mais pr�ximo.
        Est�vamos com d�vida quanto ao real uso de 2 vetores ordenados (um em
        rela��o � X e outro em rela��o em Y), mas pensamos um pouco mais e 
        estamos quase certos que um s� ser� necess�rio.
        Tamb�m pensamos quanto � fun��o dist�ncia que ser� definida pelo 
        usu�rio. Definimos que:
                 - Precisa haver um arquivo cabe�alho, com nome: distancia.h
        que � o prot�tipo da fun��o que incluiremos no programa principal.
                 - O cabe�alho da fun��o deve ser:

                   double Distancia(double, double, double, double);
        onde cada double recebido como par�metro � na verdade uma coordenada
        do ponto ao qual queremos calcular a dist�ncia. Por exemplo, a 
        chamada:
                 Distancia(-5.6, 4.2 8.0, 0.33)

        Calcula a dist�ncia entre os pontos do R�: (-5.6, 4.2) e (8.0, 0.33). 

                 - O arquivo que cont�m a implementa��o da fun��o deve se
        chamar: distancia.c
        
        Implementamos mais algumas estruturas que usaremos para guardar os
        pontos mais pr�ximos e sua dist�ncia, um vetor de Pontos, que � a 
        cole��o onde armazenaremos os pontos do problema. Al�m disso, 
        escrevemos opera��es b�sicas que mexam com essas estruturas.

05/07/2000:
        Detalharemos uma estrutura que ser� muito usada:
        Estrutura ParProximo:
         valor double para a dist�ncia.
         vetor com 2 Pontos, que s�o os mais pr�ximos.
         
        Na parte da manh�, a fun��o para calcular a dist�ncia m�nima, Parproximo,
        foi codificada seguindo o pseudo-c�digo que foi escrito nesse relat�rio no
        dia 20/06. O c�digo s� foi compilado e corrigido no in�cio da tarde.

        A fun��o Parproximo, que � a parte principal do programa entre os pontos 
        do conjunto est� completada e, pelos testes realizados, parece estar
        funcionando corretamente, devolvendo a estrutura que corresponde ao
        verdadeiro par de pontos que minimiza a dist�ncia.

        Falta realizar mais testes, no sentido de comprovar a validade do programa
        desenvolvido.
        
        Pr�ximos passos: Interface gr�fica, que ainda estamos em d�vida se 
        utilizaremos GLUT/Mesa3D ou GTK (com GDK) ou ainda os dois juntos.

06/07 - 03/08:
        A Rede Linux ficou por duas semanas inoperante, o que nos for�ou a 
        trabalharmos na rede IME e tamb�m em casa.
        Tivemos que estudar o GTK e o GDK para fazermos a interface, o que 
        j� nos consumiu um bom tempo.
        Gastamos cerca de uma semana e meia ajustando o c�digo � interface.  
        No dia 03/08 o projeto j� estava conclu�do e apresentamos ao professor.      


Última atualização : Mon Aug 14 10:27:10 2000