Sie sind auf Seite 1von 4

Fecho convexo 2D

O fecho convexo de um conjunto de pontos em duas dimenses definido como o menor polgono convexo que contm todos os pontos. Cada ponto do conjunto ou um vrtice desse polgono (o fecho) ou est no seu interior. A figura apresenta o fecho convexo de um conjunto de 10 pontos no plano. Apresentamos aqui alguns algoritmos para computar o fecho convexo de um conjunto de pontos no plano.

Algoritmo Incremental Um primeiro algoritmo para o clculo do fecho convexo de um conjunto de pontos o algoritmo incremental. Algoritmos incrementais resolvem um dado problema para um subconjunto e, passo a passo, calculam a soluo inserindo novos elementos do conjunto inicial. No caso do fecho convexo de um conjunto de n pontos, o algoritmo calcula o fecho convexo para n-1 pontos e compe esse resultado com o novo ponto. Basta decidir se o novo ponto est dentro ou fora do fecho convexo atual. Se estiver dentro, um ponto interno ao fecho e no preciso atualizar nada. Se estiver fora, ento necessrio "consertar" o fecho atual de forma a inclu-lo entre os vrtices. Nesse processo, pode acontecer de algum(s) dos antigos vrtices deixar de ser um vrtice passando a ser mais um ponto interior. Utilizamos as primitivas Esquerda-Direita para saber a posio de um dado ponto em relao a um lado do fecho convexo atual. A idia simplificada se assumirmos que o polgono tem a seqncia de seus vrtices orientada em um sentido (anti-horrio, por exemplo). Assim, basta verificar se um novo ponto est a esquerda (se o sentido adotado for anti-horrio) de todos os lados do fecho. Se isso for verdade, ento trata-se de um ponto interno ao fecho, seno um ponto externo que ser colocado como um vrtice. Analisando a sua complexidade, podemos gastar tempo O(logn) para decidir se o novo ponto est dentro ou fora do fecho convexo dos n-1 pontos anteriores (para maiores detalhes consulte o tpico "Posio de um ponto em relao a um polgono"). Em seguida temos que "consertar" o fecho anterior com o novo ponto, o que pode levar-nos a mexer em (n-1)-1 arestas do fecho anterior (as arestas que "enxergam" o novo ponto). Portanto, esse passo gasta

tempo O(n). Assim, a complexidade da insero de um ponto dominada pelo segundo passo, levando tempo O(n) para ser executado. Como vamos executar esse passo n vezes, ento a complexidade total do algoritmo O(n2). Algoritmo do Embrulho Outro algoritmo que nos d o fecho convexo o algoritmo do Embrulho. Inicialmente, determine o ponto P do conjunto com menor coordenada y. Em seguida encontre o ponto Q, dentre os que outros pontos, com menor ngulo em relao a P e a linha horizontal. Esse um ponto que certamente vrtice do fecho convexo, e mais, a aresta PQ pertence ao fecho convexo. A partir da, basta encontrar o prximo ponto com menor ngulo em relao a aresta PQ, e assim por diante. A execuo termina quando o ponto P inicial encontrado novamente. O nmero de operaes primitivas executadas por esse algoritmo O(n*k), onde n o nmero de vrtices no conjunto e k o nmero de vrtices no fecho convexo. No pior caso, k pode ser igual a n, resultando em um algoritmo que executa em tempo quadrtico. O nome do algoritmo vem da idia por trs dele. Imagine que cada ponto uma estaca pregada no cho. Encontramos a estaca do conjunto que est mais ao sul e amarramos nela um barbante. Agora vamos desenrolando o barbante at bater na prxima estaca do fecho, e assim por diante, parecendo que estamos embrulhando o conjunto de pontos com o barbante. QuickHull O QuickHull um algoritmo que calcula o fecho convexo de pontos num plano, com complexidade mdia O(n*logn), tornando-se um equivalente geomtrico do algoritmo de ordenao QuickSort. Ele divide o plano em 5 regies, utilizando-se dos pontos mais extremos (isto , pontos com menor e maior coordenada x e maior e menor coordenada y) do conjunto. A regio interna a este quadriltero desprezada, pois obviamente no far parte do fecho convexo dos pontos (so todos pontos interiores). A seguir aplica-se a cada uma das regies restantes um algoritmo recursivo, que calcula o ponto P mais distante do segmento correspondente (na primeira vez um segmento do quadriltero) e divide o problema local em duas partes, como se o segmento da iteracao atual fosse dividido em outros dois, tendo o ponto P em comum. A recurso aplicada at uma parte possuir somente dois pontos, que so ento conectados. Analisando a sua complexidade, esse algoritmo quadrtico no pior caso, mas equivalentemente ao quicksort, podemos perceber sua eficincia: em

exemplos com pontos aleatoriamente distribudos, muitos pontos estaro dentro do quadriltero inicial e sero descartados logo na primeira fase do algoritmo. Aps diversos testes percebe-se que o QuickHull se iguala ao algoritmo de Graham em relaco a tempo, quando nao possui desempenho melhor. Como no Quicksort, o QuickHull possui no "caso mdio" tempo O(n*logn). Aqui a primitiva utiizada continua sendo a primitiva Esquerda.

Algoritmo de Graham O algoritmo de Graham calcula o fecho convexo de pontos num plano, com complexidade de tempo O(n*logn). Ele encontra o ponto P com menor coordenada y e ento ordena os pontos restantes pelo ngulo em relao linha horizontal que passa pelo ponto P. Agora, com ajuda de uma pilha, o algoritmo trabalha em tempo linear. Empilhamos os dois primeiros pontos e ento basta percorrermos os pontos ordenados fazendo o seguinte:

se o ponto X em questo est a esquerda do vetor penltimo-ltimo elemento da pilha (ltimo elemento da pilha o topo) ento empilhamos e olhamos o prximo; se o ponto X em questo est a direita deste mesmo vetor, ento desempilhamos e voltamos a analisar X.

Ao final temos na pilha uma lista de pontos que forma o fecho convexo dos pontos. A complexidade do algoritmo O(n*logn) porque precisamos gastar esse tempo para orden-los. J o processamento aps os pontos estarem ordenados linear, nao alterando a complexidade final. O algoritmo de Graham um algoritmo timo para o clculo do fecho convexo. Aqui a primitiva pode ser considerada a operao Esquerda que verifica se um ponto est a esquerda de um vetor. Convm ressaltar que tudo funciona desse modo obedecendo a definio de que um polgono seja definido como uma lista de vrtices ordenados em um sentido. Assim, um ponto fora do polgono estar a esquerda de todas as arestas orientadas do polgono se o sentido escolhido for o sentido antihorrio. Se definirmos o polgono ordenado no sentido horrio, um ponto estar fora do polgono se estiver a direita das arestas orientadas.

MergeHull O algoritmo MergeHull o anlogo geomtrico do MergeSort. Trata-se de um algoritmo Diviso-e-Conquista para obter o fecho convexo. A idia, como

em todos os algoritmos do tipo Diviso-e-Conquista, dividir o problema ao meio, resolver recursivamente as duas metades, e "colar" as duas metades. A base da recurso quando temos 2 ou 3 pontos. A parte da conquista consiste em descobrir as duas arestas tangentes (superior e inferior) s duas metades. Isso pode ser feito em tempo O(n) da seguinte forma: encontre o ponto mais a direita da metade da esquerda e o ponto mais a esquerda da metade da direita, em seguida "suba" a aresta que liga esses dois pontos at que ela seja a tangente superior e a inclua no fecho (retirando as arestas interiores que esto nos subfechos). Analogamente "desa" a aresta inicial at que ela seja a tangente inferior. A complexidade do algoritmo O(n*logn) porque estamos sempre quebrando o problema na metade e gastando O(n) na fase da conquista. Os mais escolados em anlise de algoritmos sabem que essa a soluo da recorrncia que aparece na recurso: T(n) = 2*T(n/2) + O(n) que quer dizer que o tempo para resolver o problema para n pontos o tempo de resolver dois problemas de tamanho n/2 mais o custo da fase da conquista do algoritmo.

Fonte: http://www.ime.usp.br/~freitas/gc/fecho.html

Das könnte Ihnen auch gefallen