Question

J'essaie de créer un triangle (triangle isocèle) pour déplacer l'écran et le faire légèrement pivoter lorsqu'un utilisateur appuie sur une touche directionnelle (comme à droite ou à gauche).

Je voudrais que le nez (sommet) du triangle soit toujours en tête du triangle. (Comme ce vieux jeu d’astéroïdes).

Mon problème vient du calcul derrière cela. À chaque intervalle de temps X, je souhaite que le triangle se déplace dans & "; Une direction &"; J'ai besoin d'aide pour trouver cette direction (incréments / décréments x et y).

Je peux trouver le point central (centre de gravité) du triangle et j'ai le plus haut x et y points. J'ai donc un vecteur de ligne sur lequel travailler, mais pas un indice sur & "comment < !> quot; travailler avec elle.

Je pense que cela a quelque chose à voir avec les anciennes méthodes Sin and Cos et avec la quantité (angle) de rotation du triangle, mais je suis un peu rouillé à ce sujet.

Toute aide est grandement appréciée.

Était-ce utile?

La solution

L'arctangente (tangente inverse) de vy / vx, où vx et vy sont les composants de votre vecteur (centroïde - > tip), vous donne l'angle auquel le vecteur fait face.

L'arctangent classique vous donne un angle normalisé à -90 & # 176; < r < +90 & # 176; Cependant, vous devez donc ajouter ou soustraire 90 degrés au résultat en fonction du signe du résultat et du signe de vx.

Heureusement, votre bibliothèque standard devrait proposer une fonction atan2 () qui prend vx et vy séparément comme paramètres et vous renvoie un angle compris entre 0 & # 176; et 360 & # 176 ;, ou -180 & # 176; et +180 & # 176; degrés. Il traitera également le cas particulier où vx = 0, ce qui entraînerait une division par zéro si vous ne faisiez pas attention.

Voir http://www.arctangent.net/atan.html ou simplement rechercher pour & "; arctangent &";.

Modifier: j’ai utilisé les diplômes dans mon article pour plus de clarté, mais Java et de nombreux autres langages / bibliothèques fonctionnent en radians où 180 & # 176; = & # 960;.

Vous pouvez aussi simplement ajouter vx et vy aux points du triangle pour le faire avancer dans le & "Forward &"; direction, mais assurez-vous que le vecteur est normalisé (vx & # 178; + vy & # 178; = 1), sinon la vitesse dépend de la taille de votre triangle.

Autres conseils

@Marque:

J'ai essayé d'écrire une introduction sur les vecteurs, les coordonnées, les points et les angles dans cette boîte de réponses à deux reprises, mais j'ai changé d'avis à deux reprises car cela prendrait trop de temps et je suis sûr qu'il existe de nombreux tutoriels expliquant le sujet. mieux que je ne peux jamais.

Votre centre de gravité et " tip " les coordonnées ne sont pas des vecteurs; c’est-à-dire qu’il n’ya rien à gagner à les considérer comme des vecteurs.

Le vecteur souhaité, vForward = pTip - pCentroid, peut être calculé en soustrayant les coordonnées du & "tip &"; coin du point du centre de gravité. Le atan2 () de ce vecteur, c’est-à-dire atan2 (tipY-centY, tipX-centX), vous donne l’angle que votre triangle forme & "En regard de &";

.

Pour ce qui est relatif, peu importe. Votre bibliothèque utilisera probablement la convention selon laquelle l'axe X croissant (--- & Gt; la direction droite / est sur tous les graphiques 2D que vous avez vus) est égal à 0 & # 176; ou 0 & # 960 ;. La direction croissante en Y (haut, nord) correspond à 90 & # 176; ou (1/2) & # 960;.

Il me semble que vous devez enregistrer l'angle de rotation du triangle et éventuellement sa vitesse actuelle.

x' = x + speed * cos(angle)
y' = y + speed * sin(angle)

Notez que l'angle est en radians et non en degrés!

Radians = Degrees * RadiansInACircle / DegreesInACircle

RadiansInACircle = 2 * Pi

DegressInACircle = 360

Pour les emplacements des sommets, chacun est situé à une certaine distance et à un certain angle du centre. Ajoutez l'angle de rotation actuel avant d'effectuer ce calcul. C'est la même chose que pour calculer le mouvement.

En voici d'autres:

Les vecteurs représentent le déplacement. Le déplacement, la traduction, le mouvement ou ce que vous voulez appeler, n'a pas de sens sans un point de départ, c'est pourquoi j'ai fait référence à la & "Transmettre &"; vecteur ci-dessus comme " du centre de la droite, " et c’est pourquoi le " vecteur centroïde, " le vecteur avec les composantes x / y du point du centre de gravité n'a pas de sens. Ces composants vous donnent le déplacement du point centroïde par rapport à l'origine. En d'autres termes, pOrigin + vCentroid = pCentroid. Si vous partez du point 0, puis ajoutez un vecteur représentant le déplacement du point centroïde, vous obtenez le point centroïde.

Notez que:

vecteur + vecteur = vecteur
(l'ajout de deux déplacements vous donne un troisième déplacement différent)

point + vecteur = point
(déplacer / déplacer un point vous donne un autre point)

point + point = ???
(Ajouter deux points n'a pas de sens, cependant:)

point - point = vecteur
(la différence de deux points est le déplacement entre eux)

Maintenant, ces déplacements peuvent être envisagés de deux manières (au moins) différentes. Celui que vous connaissez déjà est le système rectangulaire (x, y), où les deux composantes d’un vecteur représentent le déplacement dans les directions x et y, respectivement. Cependant, vous pouvez également utiliser les coordonnées polaires , (r, & # 920;). Ici, & # 920; représente la direction du déplacement (en angles par rapport à un angle zéro arbitraire) et r, la distance.

Prenez le vecteur (1, 1), par exemple. Cela représente un mouvement d'une unité à droite et d'une unité vers le haut dans le système de coordonnées que nous sommes tous habitués à voir. L'équivalent polaire de ce vecteur serait (1.414, 45 & # 176;); le même mouvement, mais représenté par un déplacement de 1,414 unité dans la direction de l'angle & # 176; (Encore une fois, utilisez un système de coordonnées polaires pratique où la direction est est 0 & # 176; et les angles augmentent dans le sens anti-horaire.)

La relation entre les coordonnées polaires et rectangulaires est la suivante:

& # 920; = atan2 (y, x)
r = sqrt (x & # 178; + y & # 178;) (voyez-vous maintenant où le triangle rectangle entre?)

et inversement,

x = r * cos (& # 920;)
y = r * sin (& # 920;)

Maintenant, depuis un segment de droite tiré du centre de votre triangle jusqu'au & "tip &"; corner représenterait la direction dans laquelle votre triangle est & «en face, &»; si nous devions obtenir un vecteur parallèle à cette ligne (par exemple, vForward = pTip - pCentroid ), le & # 920; -cordon de ce vecteur correspondrait à l'angle que fait votre triangle.

Prenez à nouveau le vecteur (1, 1). S'il s'agissait de vForward, cela aurait alors signifié que votre & "Tip &"; Les coordonnées x et y du point étaient toutes deux 1 de plus que celles de votre centre de gravité. Disons que le centre est sur (10, 10). Cela met la & Quot; astuce & Quot; corner over à (11, 11). (Rappelez-vous, pTip = pCentroid + vForward en ajoutant & Quot; + pCentroid & Quot; aux deux côtés de l'équation précédente.) Dans quelle direction ce triangle fait-il face? 45 & # 176 ;, n'est-ce pas? C’est le & # 920; - coordonné de notre vecteur (1, 1)!

conservez le centroïde à l'origine. utilisez le vecteur du centroïde au nez comme vecteur de direction. http://fr.wikipedia.org/wiki/Coordinate_rotation#Two_dimensions alternera cette rotation vecteur. construire les deux autres points de ce vecteur. traduire les trois points à l'endroit où ils se trouvent à l'écran et dessiner.

double v; // velocity
double theta; // direction of travel (angle)
double dt; // time elapsed

// To compute increments
double dx = v*dt*cos(theta);
double dy = v*dt*sin(theta);

// To compute position of the top of the triangle
double size; // distance between centroid and top
double top_x = x + size*cos(theta);
double top_y = y + size*sin(theta);

Je vois bien que je dois appliquer les formules de rotation 2d communes à mon triangle pour obtenir mon résultat. Je ne fais que poser quelques problèmes avec les relations entre les différents composants.

aib , a déclaré ce qui suit:

  

L’arctangente (tangente inverse) de   vy / vx, où vx et vy sont les   composants de votre (centroïde - > astuce)   vecteur, vous donne l'angle le vecteur   fait face.

Est-ce que vx et vy sont les coordonnées x et y du centriod ou de la pointe? Je pense que je suis confus quant à la terminologie d'un & "Vecteur"! " ici. J'avais l'impression qu'un vecteur n'était qu'un point dans l'espace 2d (dans ce cas) qui représentait la direction.

Dans ce cas, comment calcule-t-on le vecteur du centroïde - > tip? Est-ce juste le centriod?

meyahoocomlorenpechtel a déclaré:

  

Il me semble que vous devez stocker   l'angle de rotation du triangle et   c'est peut-être la vitesse actuelle.

Quel est l'angle de rotation par rapport à? L'origine du triangle ou la fenêtre du jeu elle-même? En outre, pour les rotations futures, l’angle correspond-il à la dernière rotation ou à la position initiale du triangle?

Merci à tous pour l'aide apportée jusqu'à présent, je l'apprécie vraiment!

vous voudrez que le sommet le plus haut soit le centre de la droite pour obtenir l'effet souhaité.

Premièrement, je commencerais par le centre de gravité plutôt que de le calculer. Vous connaissez la position du centroïde et l'angle de rotation du triangle, je l'emploierais pour calculer les emplacements des vertices. (Je m'excuse par avance pour toute erreur de syntaxe, je viens de commencer à barboter en Java.)

// point de départ

double tip_x = 10;
double tip_y = 10;

should be

double center_x = 10;
double center_y = 10;

// détails du triangle

int width = 6; //base
int height = 9;

devrait être un tableau de 3 paires angle / distance.

angle = rotation_angle + vertex[1].angle;
dist = vertex[1].distance;    
p1_x = center_x + math.cos(angle) * dist;
p1_y = center_y - math.sin(angle) * dist;
// and the same for the other two points

Notez que je suis soustrayant la distance en Y. Vous êtes pris de court par le fait que l’espace de l’écran est inversé. Dans notre esprit, Y augmente à mesure que vous montez - mais les coordonnées de l'écran ne fonctionnent pas de cette façon.

Le calcul est beaucoup plus simple si vous suivez les éléments en tant que position et angle de rotation plutôt que de dériver l'angle de rotation.

De plus, dans votre dernier morceau de code, vous modifiez l'emplacement par l'angle de rotation. Le résultat sera que votre navire tourne selon l'angle de rotation à chaque cycle de mise à jour. Je pense que l'objectif est quelque chose comme les astéroïdes, pas un chat chassant sa queue!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top