3 pièce(s) jointe(s)
Répartition lissée de points sur un cercle
Bonjour,
Dans le cadre d'un projet d'application mobile j'ai besoin d'afficher sur un cercle des points d'intérêt (le centre du cercle représente la position de l'utilisateur). J'ai créé un système qui affiche les points d'intérêt le long du cercle en fonction de la position de ces derniers par rapport à la position de l'utilisateur. Ce qui nous donne ceci :
Pièce jointe 416143
Cela marche parfaitement pour des points éloignés les uns des autres mais si les angles des points sont trop proches alors ça devient très moche :
Pièce jointe 416147
J'aurais besoin d'un algorithme pour "lisser" les angles des différents points (espacer les angles de façon harmonieuse), de manière à ce qu'il y ait toujours un angle minimum entre les différents points (disons par exemple 5°).
Pièce jointe 416149
La liste des points est dynamique et après plusieurs essais je n'arrive pas à trouver le bon algorithme, auriez vous des pistes ?
Merci d'avance pour votre aide.
Répartition lissée de points sur un cercle
Bonjour, :D
Une solution consisterait à
1°) Lister les (N) points selon l'ordre croissant de leur angle polaire (a1, a2, ... , ak, ... , aN) ,
puis déterminer la moyenne correspondante M0 = (a1 + a2 + ... + aN)/N .
2°) Déterminer les (N - 1) écarts successifs (b1 = a2 - a1 , ... , bN - 1 = aN - aN - 1) ;
à chaque fois que l'on trouve un écart (bk = ak + 1 - ak) inférieur au seuil convenu (bmin = 5° , par exemple), augmenter toutes les positions ultérieures (ak + 1 , ak + 2 , ... , aN) de la quantité Da = bmin - bk ;
une fois l'opération terminée (k = 1, 2, ..., N - 1), toutes les positions successives présenteront un décalage mutuel satisfaisant.
3°) Afin d'éviter toute dérive de l'ensemble, calculer la nouvelle moyenne M1 = (a1 + a'2 + ... + a'N)/N ;
diminuer tous les angles de la même quantité (M1 - M0): a"k = a'k - (M1 - M0) ;
l'ensemble des points retrouvera ainsi son centrage initial sur le cercle.
Pour un point supplémentaire s'intercalant entre deux des précédents, il faut reprendre tous les calculs puisque leur point de départ est la liste des valeurs classées selon l'ordre croissant.
Il y aura saturation si de nombreux points se concentrent sur un secteur étroit (90/5 = 18 sur un angle droit); tu pourrais dans ce cas prévoir un second cercle, concentrique au précédent, et de plus grand rayon.