Definición : Un polígono en el plano se llama monótono con respecto a una línea recta , si cada línea ortogonal a cruza con como máximo dos veces.
Dado un polígono , ¿es posible determinar si existe alguna línea tal que el polígono sea monótono con respecto a ? 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 es no da o se especifica de antemano.
Respuestas:
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δ
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 ( vyovi + 1) βyo vyo
atan2
β i = α i + 1 - α i + { 0 si α i + 1 ≥ α i 2 π si α i + 1 < α i
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- n π 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
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 , π ) π δ
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 ( n2) αj mod π γ1, ... γmetro .δ ∈{ γ12, γ1+ γ22, ... , γm - 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
fuente