C'est possible.
Considérez votre polygone et considérez les sommets "concaves". Ils définissent exactement les lignes qui intersecteront le polygone plus de deux fois. Dans la figure suivante, j'ai marqué les intervalles (en rouge) des angles interdits. Si vous les assemblez et voyez un trou dans le disque rouge, alors il y a des angles autorisés (en bleu). Le polygone est alors monotone par rapport à toute ligne de pente - 1 / tan δ (en vert).δ−1/tanδ
Maintenant l'algorithme.
Soit le i ème sommet du polygone. Calculez d'abord l'angle absolu α i du bord ( v i v i + 1 ) et l'angle intérieur β i du sommet v i . Utilisez la fonction disponible dans tous les bons langages de programmation.vi=(xi,yi)iαi(vivi+1)βiviatan2
β i = α i + 1 - α i + { 0 si α i + 1 ≥ α i 2 π si α i + 1 < α i
αi=atan2(yi+1−yi,xi+1−xi)
βi=αi+1−αi+{02π if αi+1≥αi if αi+1<αi
Inversez l'ordre des sommets s'ils ne sont pas dans le sens antihoraire, c'est-à-dire si n'est pas négatif. ( s = - 2 π : dans le sens antihoraire, s = 2 π : dans le sens horaire).s=∑iβi−nπs=−2πs=2π
Ce qui suit ne concerne que les angles intérieurs supérieurs à π, c'est-à-dire β j > π . Les rouges sur ma photo. Le but est de trouver un angle δ qui n'est pas dans ∪ j [ α j + 1 , α j ] modulo π . A savoir tel que pour tout j tel que β j > π :mπβj>πδ∪j[αj+1,αj]πjβj>π
( α j < δ < α j + 1 ) si α j < α j + 1
(δ<αj+1∨αj<δ) if αj+1<αj
(αj<δ<αj+1) if αj<αj+1
où est ici la valeur normalisée de α j dans [ 0 , π ) . Le deuxième cas correspond à un intervalle qui dépasse π (donc cette fois δ doit être "à l'intérieur").αjαj[0,π)πδ
Il existe probablement un moyen plus rapide de le faire, mais l'un dans consiste à trier les valeurs α j mod π en γ 1 , … γ m et à tester pour δ ∈ { γ 1O(n2)αj mod πγ1,…γmδ∈{γ12,γ1+γ22,…,γm−1+γm2,γm+π2}
δL−1/tanδP