Se um ponto é um vértice do casco convexo

7

O exercício é

Dado um conjunto de pontos e um ponto . Decidir em de tempo, se P é um vértice do polígono convexo formado a partir de pontos de S .SpO(n)pS

O problema é que estou um pouco confuso com a complexidade do tempo O(n) . A solução mais ingênua seria construir polígono convexo em O(nlogn) e testar se p é um dos vértices.

com
fonte

Respostas:

8

Dica: o ponto é um vértice do salão convexo se houver duas meias linhas dele, de modo que todos os pontos caiam dentro do ângulo criado por eles.p

Aqui está uma idéia para um algoritmo baseado nesta dica:

Projete um algoritmo com duas variáveis e (pontos de entrada). O algoritmo examinará cada um dos pontos de entrada e atualizará e para que todos os pontos verificados até agora caiam dentro da cunha .qrqrqpr

Kaveh
fonte
@ Jeff, há algum erro na minha ideia? Você pode vê-lo se passar o mouse sobre a parte abaixo do segundo parágrafo.
Kaveh
Eu descobri. (Eu tinha uma solução diferente em mente.)
Jeffe
@JeffE, eu deveria ter escrito um no lugar do o , vai corrigi-lo em um segundo. :)
Kaveh
2
@ Jeff, estou curioso, qual foi a sua ideia?
com
7

O problema é encontrar uma linha que atravessa p e tem todos os outros pontos em Sde um lado. Este é um problema bidimensional de programação linear, para que possa ser resolvido emO(n)tempo usando algoritmos geométricos de livros didáticos . Mas deixe-me descrever uma solução independente.


Para simplificar a notação, traduza todos os pontos para que p é a origem (0,0), e deixar Q=S{p}. Então queremos determinar se existe um número realm de modo que (1) y<mx para todos (x,y)Q ou (2) y>mx para todos (x,y)Q. No primeiro caso,p é um vértice do casco superior de S; no segundo caso,p é um vértice do casco inferior de S. Vou descrever um algoritmo para o primeiro caso; o outro caso é simétrico.

Se algum ponto Q encontra-se diretamente acima p (ou seja, se algum ponto Q tem coordenadas (0,y) para alguns y>0), então pnão pode ficar no casco superior. É fácil verificar esta condição emO(n) Tempo.

Portanto, não assuma pontos Q deite-se diretamente acima p. oy-axis splits Q em dois subconjuntos L (esquerda) e R(direita). Pontos emL tem negativo x-coordenadas e aponta R tem positivo x-coordenadas. (Pontos diretamente abaixopnão importa; apenas ignore-os.)

mL=min(x,y)Lyx,MR=max(x,y)Ryx,andm=mL+MR2.
Agora, existem três casos a serem considerados:
  • E se mL<MR, então todos os pontos Q está estritamente abaixo da linha y=mx, tão p é um vértice do casco superior.

  • E se mL=MR, então a linha y=mx passa por um ponto em L e um ponto em Re nenhum ponto Qestá estritamente acima dessa linha. assimp fica em uma borda do casco superior, mas não é um vértice.

  • E se mL>MR, pelo menos um ponto em L e pelo menos um ponto R estão estritamente acima da linha y=mx. assimp encontra-se estritamente abaixo do casco superior.

É fácil calcular mL e MR no O(n)Tempo. Na verdade, não precisamos calcularm.

JeffE
fonte