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 P
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 L
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.
Respostas:
É 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) βEu vEu
atan2
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> π
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
fonte