Varredura de Graham: diferenças entre revisões

Conteúdo apagado Conteúdo adicionado
→‎O Algoritmo: Correcção da tradução.
→‎O Algoritmo: Correcção do português.
Linha 17:
Depois, o conjunto de pontos deve ser ordenado em ordem crescente do ângulo que ele com o ponto ''P'' formam com o eixo X. Qualquer [[algoritmo ordenação]] de uso geral é apropriado para isto, por exemplo, o [[heapsort]] (o qual é da ordem de O(''n'' log ''n'')). De forma a acelerar os cálculos, não é necessário calcular os ângulos que estes pontos formam com o eixo x; ao invés disto é suficiente calcular a [[função trigonométrica|tangente]] deste ângulo, que pode ser feito com simples aritmética.
 
O algoritmo procede considerando cada um dos pontos do array ordenado em seqüênciasequência. Para cada ponto, é determinado, se ao movendomover-se dedos dois pontos antesanteriores para este ponto ése forma uma "curva para esquerda" ou uma "curva para direita". Se é uma "curva para direita", isto significa que o ponto de partida não faz parte do envoltório convexo e deve ser removido da pesquisa. Este processo continua ao longo do conjunto até que o conjunto dos três últimos pontos seja uma curva para direita. TãoAssim logoque uma "curva apara esquerda" é encontrada, o algoritmo salta para o próximo ponto do array ordenado. ( Se em qualquer etapa três pontos são colineares, é indiferente se o ponto do meio é removido ou não. Removendo-o obteremos um envoltório convexo mínimo, mas o mantendo isto não o inválida).
 
Novamente, para determinar se três pontos constituem uma "curva a esquerda" ou "curva a direita" não é necessário calcular o ângulo existente entre os dois segmentos de retas, isto pode ser obtido simplesmente por aritmética inteira. Dado três pontos <math>(x_1,y_1)</math>, <math>(x_2,y_2)</math> e <math>(x_3,y_3)</math>, simplesmente calculando o [[produto vetorial]] <math>(x_2-x_1)(y_3-y_1)-(y_2-y_1)(x_3-x_1)</math> dos dois [[vetor]]es definidos definidos pelos pontos <math>(x_1,y_1)</math>, <math>(x_2,y_2)</math> e <math>(x_2,y_2)</math>, <math>(x_3,y_3)</math>. Se o resultado for Zero, os três pontos são colineares, se for positivo, os três pontos constituem uma "curva para esquerda", caso contrario uma "curva para direita".