2009-02-10 5 views
2

J'essaie de trouver un algorithme pour calculer où placer n'importe quel nombre d'icônes pour un menu circulaire sur un périphérique avec un écran qui est 240x320. Les icônes sont 48x48 mais peuvent être mises à l'échelle à n'importe quelle taille. Je voudrais proposer un algorithme générique qui prendra n'importe quel nombre d'icônes dans n'importe quelle taille et calculera la meilleure échelle pour eux et le meilleur placement (c.-à-d. Rayon et diviseur de radian).Meilleure façon de dessiner des icônes sur un menu circulaire (circulaire)?

mon code ressemble actuellement à ceci:

int iconWidth = icon.Width;//this is a poor approximation. 
int radius = iconWidth + iconWidth/2;//defines spacing between square icons 
double factor = ((2 * Math.PI)/menuEntries.Count); 

//transition is a value that describes the animation curve for the menu 
float transitionOffsetR = (float)Math.Pow(TransitionPosition, 2) * radius; 
float transitionOffsetP = (float)Math.Pow(TransitionPosition, 2) * (float)factor; 

// menuEntries is a collection of objects that describe the menu items 
// it has fields like icon and title and callback, things like that. 
foreach (MenuEntry entry in menuEntries.Values) 
{ 
    int i = menuEntries.IndexOfValue(entry); 

    iconPos.X = ((float)radius - transitionOffsetR) * 
       (float)Math.Cos((factor - transitionOffsetP) * i + 1); 
    iconPos.Y = ((float)radius - transitionOffsetR) * 
       (float)Math.Sin((factor - transitionOffsetP) * i + 1); 

    Vector2 finalPos = Vector2.Add(iconPos, origin); 

    entry.Draw(this, finalPos, isSelected, worldTime, TransitionPosition); 
} 

Ce qui se passe ici est ce, d'abord je calcule les largeurs des icônes et faire quelques calculs pour trouver un rayon raisonnable et facteur. puis en utilisant la valeur TransitionPosition qui provient de l'appelant de cette méthode, je modifie à la fois le rayon et le diviseur pour calculer les valeurs X et Y de la position de l'icône. Ajout d'iconPos et d'origine ensemble (où origine est la coordonnée (screen.Width/2, screen.Height/2)) J'obtiens la position finale correcte dans les coordonnées du monde.

J'envisage également de le dessiner comme un graphique similaire à circo ou twopi du package graphviz.

Des questions ou des problèmes s'il vous plaît faites le moi savoir.

Merci!

Répondre

1

De nombreuses ressources sur les menus de secteurs, y compris diverses implémentations, peuvent être trouvées au Pie Menu Central.

Un autre lien, plus récent mais basé sur Cocoa et basé sur du texte, est JMPieMenu.

+0

Oui, j'ai lu la plupart de ces informations et cela ne fournit pas beaucoup d'aide. La plupart des bons liens sont cassés et ça parle surtout de deux gars qui jouent avec leurs TRS-80 dans le sous-sol de leur grand-mère qui frappe le bong et qui écoutent Pink Floyd. –

+0

Aussi tout ce qui y est référencé a plus de 20 ans. –

+0

+1 pour votre commentaire Malk0lm! –

0

Peut-être bon d'essayer l'une des bibliothèques de graphiques libres disponibles. Je pourrais suggérer ceci one, mais il y a beaucoup de bons. De cette façon, vous pouvez vous concentrer sur la logique métier et ne pas avoir à vous soucier de réinventer la roue avec la fonctionnalité graphique.

+0

Non, vous n'avez pas lu la question. Je n'essaie pas de dessiner un graphique, je parle d'une représentation abstraite d'un ensemble d'objets où certaines paires d'objets sont reliées par des liens. Dans ce cas, ce serait l'origine connectée à chaque nœud d'icône de menu. –

Questions connexes