É 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 / castanhoδ (em verde).
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( vEuvi + 1)βEuvEuatan2
αEu= atan2 ( yi + 1- yEu, xi + 1- xEu)
βEu= αi + 1- αEu+ { 02 π se αi + 1≥ αEu se αi + 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< δ ) se αj + 1< αj
( αj< δ < αj + 1) 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 , π )πδ
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 / castanhoδP