¿Cómo pruebo si un polígono es monótono con respecto a una línea arbitraria?

16

Definición : Un polígono P en el plano se llama monótono con respecto a una línea recta L , si cada línea ortogonal a L cruza con PAG como máximo dos veces.

Dado un polígono PAG , ¿es posible determinar si existe alguna línea L tal que el polígono P sea ​​monótono con respecto a L ? Si es así, ¿cómo?

Anteriormente, he hecho una pregunta relacionada (en la que le pregunté cómo determinar si un polígono es monótona con respecto a una línea particular), pero ahora estoy interesado en el caso en que L es no da o se especifica de antemano.

com
fuente
¿Por qué no simplemente rotar / desplazar el sistema de coordenadas de modo que L convierta en el eje X luego vuelva a ejecutar el algoritmo anterior? El trabajo adicional debe ser manejable en O(1) .
HdM
44
@HdM: la línea L no se proporciona como parte de la entrada.
Tsuyoshi Ito

Respuestas:

16

Es posible.

Considere su polígono y considere los vértices "cóncavos". Definen exactamente qué líneas intersectarán el polígono más de dos veces. En la siguiente figura marqué los intervalos (en rojo) de los ángulos prohibidos. Si los junta y ve un agujero en el disco rojo, entonces hay ángulos autorizados (en azul). El polígono es entonces monótono con respecto a cualquier línea de pendiente - 1 / tan δ (en verde).δ-1/ /bronceadoδ

Asteroides

Ahora el algoritmo.

Sea el i ésimo vértice del polígono. Primero calcule el ángulo absoluto α i del borde ( v i v i + 1 ) y el ángulo interno β i del vértice v i . Use la función disponible en todos los buenos lenguajes de programación.vyo=(Xyo,yyo)yoαyo(vyovyo+1)βyovyoatan2

β i = α i + 1 - α i + { 0  si  α i + 1α i 2 π  si  α i + 1 < α i

αyo=atan2(yyo+1-yyo,Xyo+1-Xyo)
βyo=αyo+1-αyo+{0 0 Si αyo+1αyo2π Si αyo+1<αyo

Invierta el orden de los vértices si no están en el sentido contrario a las agujas del reloj, es decir, si no es negativo. ( s = - 2 π : en sentido antihorario, s = 2 π : en sentido horario).s=yoβyo-norteπs=-2πs=2π

Lo siguiente es solo para los ángulos internos más grandes que π , es decir, β j > π . Los rojos en mi foto. El objetivo es encontrar un ángulo δ que no esté en j [ α j + 1 , α j ] módulo π . A saber, tal que para todo j tal que β j > π :metroπβj>πδj[αj+1,αj]πjβj>π

( α j < δ < α j + 1 )  si  α j < α j + 1

(δ<αj+1αj<δ) Si αj+1<αj
(αj<δ<αj+1) Si αj<αj+1

donde es aquí el valor normalizado de α j en [ 0 , π ) . El segundo caso corresponde a un intervalo que va más allá de π (por lo que esta vez δ debe estar "dentro").αjαj[0 0,π)πδ

Probablemente haya una forma más rápida de hacer esto, pero una en es clasificar los valores α j  mod  π en γ 1 , ... γ my probar δ{ γ 1O(norte2)αj modificación πγ1,...γmetro.δ{γ12,γ1+γ22,...,γmetro-1+γmetro2,γmetro+π2}

Si ha encontrado algo de entonces L existe y es de pendiente - 1 / tan δ . De lo contrario, P no es monótono.δL-1/ /bronceadoδPAG

jmad
fuente
¿Qué software usaste para hacer esa ilustración?
jojman
@jojman No lo recuerdo pero tenía que ser GIMP, no recuerdo ningún otro programa que hubiera usado en ese entonces.
jmad