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)βyovyoatan2
β i = α i + 1 - α i + { 0 si α i + 1 ≥ α i 2 π si α i + 1 < α i
αyo= atan2 ( yi + 1- yyo, xi + 1- xyo)
βyo= αi + 1- αyo+ { 02 π si αi + 1≥ αyo si αi + 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- 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
( δ < α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 , π )πδ
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