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.