2010-10-20 8 views
-1

Je crée un écran d'inventaire pour un jeu sur lequel je travaille, et j'aimerais pouvoir dessiner une série de panneaux représentant chaque élément de l'inventaire. Je veux pouvoir ajuster ces panneaux sur un chemin circulaire. Voici une maquette que je fait ce que je veux direDessiner des images pour ajuster le cercle

http://fc02.deviantart.net/fs70/f/2010/280/7/2/khmp_magic_menu_concept_by_magna_alphamon-d30a7em.png

fondamentalement, je voudrais pouvoir, donner un rayon, un point central, et y coordonner pour commencer à dessiner à, dessiner cette série de panneaux de sorte qu'ils s'alignent avec le chemin du cercle comme dans l'image.

Calculer la dimension y est facile, c'est juste l'index de panneau start + y hauteur du panneau *, mais je ne sais pas comment calculer le x pour un rayon variable/cercle de point central.

Toute aide serait appréciée.

Ceci est en C#, mais quelque chose de similaire en C/C++ sera bien aussi longtemps que je peux convertir

Merci à l'avance

EDIT: Pour calirify, la position de y est par rapport à la partie supérieure ou en bas de l'écran et est indépendant du cercle. Si un y donné ne correspond pas à un point sur le cercle, alors je jetterai ce point et ne dessinerai pas le panneau.

Alors idéalement, je voudrais être en mesure d'utiliser une forme elliptique (donné deux rayons), un cercle serait bien trop

+0

Maintenant vous voulez une ellipse, ce qui est une question complètement différente. C'est beaucoup plus délicat sur une ellipse, alors vous devriez choisir l'un ou l'autre. –

Répondre

-3

Vous pouvez utiliser une matrice de rotation pour cela. Voici un algorithme simple qui trouve le point suivant {x, y} tel qu'il est tourné thêta radians autour d'un cercle. Vous pouvez commencer avec le premier élément à x = rayon et y = rayon (partout où, vraiment, juste un point que vous savez contiendra un élément), puis continuez à incrémenter thêta que vous bouclez vos articles.

Point Rotate(int x, int y, float theta) 
    int x_p = (x * Math.Cos(theta)) - (y * Math.Sin(theta)); 
    int y_p = (y * Math.Cos(theta)) + (x * Math.Sin(theta)); 
    return new Point(x_p, y_p); 
end 

Sur une note de côté; J'ai toujours préféré "Bolt1, Bolt2, Bolt3" à "Thunder, Thundara, Thundaga" = P

+0

Il n'est pas simple de faire en sorte que cela émette uniformément y_p, un pour chaque panneau. (Le changement d'angle n'est pas constant.) –

+0

Ensuite, c'est une ellipse et non un cercle, donc la question est fausse. Si c'est un cercle et que theta n'est pas constant, cela ne fait pas de différence. La fonction renvoie un point {x, y} qui est thêta radians autour d'un cercle. le delta de thêta est sans importance. –

+0

Trouver des points équidistants autour d'une ellipse est beaucoup moins trivial que de faire la même chose autour d'un cercle. –

1

Soit cx, cy les coordonnées du point central. Soit r le rayon du cercle. Soit y le dessin y-coordonnée et x, la coordonnée x. Vous observez que y = cy + hauteur du panneau * indice du panneau. Par la magie des triangles droits, cela signifie que x^2 + y^2 = r^2. En résolvant pour x, nous obtenons x = cx + sqrt(r^2 - (y-cy)^2).

EDIT: Conversion de code:

 
#include <math> 
float ordinate(float cx, float cy, float r, float y) { 
    // assumes cx and cy are in the same coordinate system as x and y 
    // assumes the coordinate origin is in the lower left corner. 
    return cx + sqrtf(powf(r,2) - powf(y-cy,2)); 
} 
+0

@Ed: Je ne pensais pas que c'était. Vous êtes juste en train de pousser pour une solution équidistante en angle quand la question était (plus ou moins) équidistante verticalement. C'est à dire. vous ne convertissez pas ses entrées en sortie. Vous convertissez un angle qu'il ne connaît pas en une sortie dont il a déjà la moitié. –

+0

Je suppose que ma pensée est qu'il est facile d'obtenir l'angle entre chacun parce que vous connaissez la longueur de l'arc du cercle, donc c'est une simple division et la conversion en radians. –

+0

Mais vraiment, tout ce qui fonctionne et est le plus facile. Il est vrai que j'ai utilisé mon code pour peupler des objets sur toute la circonférence d'un cercle, pas seulement une partie de celui-ci. –

0

Je suis stupide. Après avoir vu la réponse d'Eric, je me suis souvenu que je pouvais juste réarranger et résoudre les équations d'un cercle ou d'une ellipse si nécessaire.

Merci

Questions connexes