Définition : Un polygone dans le plan est appelé monotone par rapport à une droite , si chaque ligne orthogonale à coupe au plus deux fois.
Étant donné un polygone , est-il possible de déterminer s'il existe une ligne telle que le polygone soit monotone par rapport à ? Si oui, comment?
Auparavant, j'ai posé une question connexe (où j'ai demandé comment déterminer si un polygone est monotone par rapport à une ligne particulière), mais maintenant je m'intéresse au cas où n'est pas donné ou spécifié à l'avance.
Réponses:
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) βi vi
atan2
β i = α i + 1 - α i + { 0 si α i + 1 ≥ α i 2 π si α 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
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}
la source