O Fecho Convexo (Convex Hull)
Definição:
O fecho convexo de um conjunto de pontos é o menor polígono convexo que contém todos os pontos de , como mostrado na figura 1. Aqui analisaremos especificamente o Convex Hull para um conjunto de pontos bidimensional. É importante, para fins de solução de vários problemas de geometria computacional, conseguirmos calcular o convex hull de um conjunto de pontos.
Observações importantes:
Seguem algumas observações importantes para conseguirmos um algoritmo que calcule o conjunto dos pontos no fecho convexo:
- Ao se ordenar os pontos de por suas abscissas, o primeiro ponto (ou seja, o mais a esquerda) estará em , e o mesmo também será verdade para o último.
- A mesma observação vale ao se ordenar os pontos de pelas ordenadas.
- Ao se ordenar de forma anti-horária, dois pontos consecutivos e , nessa ordem, em formarão um vetor à direita de qualquer outro vetor , onde é um ponto de , ou seja
O algoritmo:
Um algoritmo subótimo em pode ser visto da seguinte maneira:
- Seja o ponto o próximo ponto que sabemos que está em (inicialmente o de abcissa mínima em )
- Para cada outro ponto em que não está em , verifique o cross do vetor com todos os outros vetores , sendo um ponto de diferente de e .
- Se em nenhum caso , é o próximo ponto em .
- Quando retornar ao ponto inicial, ou encontrarmos um ponto que ja está em , terminamos o algoritmo.
Esse algoritmo, mesmo que funcional, não é muito eficiente. O algoritmo descrito abaixo tem complexidade , conhecido como monotone chain:
- Ordene os pontos por ordem crescente de abscissas, com desempate em ordenadas.
- Para simplificar o algoritmo, iremos separar o Convex Hull em duas partes: o Upper Hull e o Lower Hull, ou seja a parte de cima da envoltória, e a parte de baixo da envoltória.
- Para o Upper Hull:
- Assuma que estamos no ponto . Iremos manter uma pilha equivalente ao prefixo dos pontos a esquerda de .
- Enquanto o vetor entre e o penúltimo da pilha estiver a direita do vetor entre o último e o penúltimo, retiraremos o último da pilha.
- Adicionamos a pilha.
- Calculamos o Lower Hull de maneira semelhante, paralelamente ao Upper Hull, porém ao invés de checar esquerda no segundo passo, checamos se está a direita.
- O convex hull, ordenado no sentido anti-horário, será o upper hull que calculamos na ordem, até seu penúltimo ponto, seguido pelo Lower Hull na ordem reversa, até o segundo ponto.
Duas observações importantes:
- O segundo algoritmo só tem complexidade pois temos que ordenar os pontos, caso os pontos já estejam ordenados, ele é apenas
- Do modo mostrado, pontos colineares no fecho aparecerão. Para garantir que só haverão dois pontos por segmento do polígono, basta mudar as inequações para também removerem vetores paralelos na pilha.
Problemas:
Para praticar e fixar os algoritmos de convex hull, e para aplicarmos suas ideias recomendamos os 2 seguintes problemas: