Como testar se um polígono é monótono em relação a uma linha arbitrária?

16

Definição : Um polígono no plano é chamado monotônico em relação a uma linha reta , se todas as linhas ortogonais a cruzarem no máximo duas vezes.L L PPLLP

Dado um polígono , é possível determinar se existe alguma linha modo que o polígono seja monótono em relação a ? Se sim, como?L P LPLPL

Antes, eu fazia uma pergunta relacionada (onde perguntava como determinar se um polígono é monótono em relação a uma linha específica), mas agora estou interessado no caso em que não é fornecido ou especificado com antecedência.eu

com
fonte
Por que não apenas girar / mudar o sistema de coordenadas de modo que se torne o eixo e execute o algoritmo antigo novamente? O trabalho adicional deve ser gerenciado em . x O ( 1 )euxO(1)
HDM
4
@HdM: A linha L não é fornecida como parte da entrada.
Tsuyoshi Ito

Respostas:

16

É possível.

Considere seu polígono e considere os vértices "côncavos". Eles definem exatamente quais linhas cruzarão o polígono mais de duas vezes. Na figura a seguir, marquei os intervalos (em vermelho) dos ângulos proibidos. Se você juntá-las e vir um buraco no disco vermelho, existem ângulos autorizados δ (em azul). O polígono é então monótono em relação a qualquer linha de inclinação -1/bronzeadoδ (em verde).

Asteroids

Agora o algoritmo.

Seja o ésimo vértice do polígono. Primeiro calcule o ângulo absoluto da aresta e o ângulo interno do vértice . Use a função disponível em todas as boas linguagens de programação.i α i ( v i v i + 1 ) β i v ivEu=(xEu,yEu)EuαEu(vEuvEu+1)βEuvEuatan2

αEu=atan2(yEu+1-yEu,xEu+1-xEu)
βEu=αEu+1-αEu+{0 0 E se αEu+1αEu2π E se αEu+1<αEu

Inverta a ordem dos vértices se eles não estiverem no sentido anti-horário, ou seja, se não for negativo. ( : sentido anti-horário, : sentido horário).s=EuβEu-nπs=-2πs=2π

O seguinte é apenas para os ângulos internos maiores que ou seja, . Os vermelhos na minha foto. O objectivo é encontrar um ângulo que não é em módulo . Nomeadamente tal que para todos os tais que :mπβj>πδj[αj+1,αj]πjβj>π

(δ<αj+1αj<δ) E se αj+1<αj
(αj<δ<αj+1) E se αj<αj+1

onde é aqui o valor normalizado de em . O segundo caso corresponde a um intervalo que vai além de (portanto, esse tempo deve estar "dentro").αjαj[0 0,π)πδ

Provavelmente existe uma maneira mais rápida de fazer isso, mas uma em é classificar os valores em e testar .O(n2)αj mod πγ1,...γmδ{γ12,γ1+γ22,...,γm-1+γm2,γm+π2}

Se você encontrar algum então existe e é da inclinação . Caso contrário, não é monótono.δeu-1/bronzeadoδP

jmad
fonte
Qual software você usou para fazer essa ilustração?
jojman
@ jojman Não me lembro, mas tinha que ser o GIMP, não me lembro de nenhum outro programa que eu teria usado naquela época.
Jmad