Question

En ce qui concerne href="https://stackoverflow.com/questions/505040/developing-a-robocode-type-game-with-net-for-a-school-assignment"> cet Je suis en train de construire.

J'utilise WPF pour animer des toiles, et je suis en utilisant la méthode BeginAnimation pour translater (déplacer) une toile sur une autre toile.

Avec le BeginAnimation, je dois préciser le From et To coordonnées pour x et y, ce qui est la méthode que je me sers de cela comme par exemple:

//X 
Animator_Body_X.From = Translate_Body.X; //Current x-coordinate
Animator_Body_X.To = //The end X-coordinate
Translate_Body.BeginAnimation(TranslateTransform.XProperty, Animator_Body_X);

//Y
Animator_Body_Y.From = Translate_Body.Y; //Current y-coordinate
Animator_Body_Y.To = //The end Y-coordinate
Translate_Body.BeginAnimation(TranslateTransform.YProperty, Animator_Body_Y);

Maintenant, la toile doit être traduit en utilisant un angle donné, que j'ai disponible à partir de la méthode.

Alors ma question est, étant donné l'angle (0-359) la toile est actuellement mis en rotation à, à partir coordonnées x et y (où la toile est actuellement situé) et distance (en px), comment puis-je calculer les coordonnées pour mettre fin? à-dire à l'endroit où la toile sera finalement traduite.

texte alt http://img244.imageshack.us/img244/4794/canvastranspositionmi5 .jpg

Dans l'image ci-dessus, je tire un exemple de ce que je veux atteindre.

Supposons que la toile (boîte solide frontière) a une position de courant (angle) de 130 degrés, et il doit être traduit (en suivant un chemin vers le bas de cet angle, à savoir en fonction de l'endroit où il est actuellement confronté) par 200 pixels. ..Qu'est seront les nouvelles coordonnées (où il arrêtera: animant des lignes pointillées-frontière) de la toile? Comment puis-je calculer ces nouvelles coordonnées de l'endroit où il arrêtera?

[Mise à jour] Solution:

Merci à l'aide des deux Andy et Cameron , il travaille enfin comme prévu.

Et voici le code de travail:

double headingRadians = Heading * (Math.PI / 180);

Animator_Body_X.From = Translate_Body.X;
Animator_Body_X.To = Math.Sin(headingRadians) * pix + Translate_Body.X;
Translate_Body.BeginAnimation(TranslateTransform.XProperty, Animator_Body_X);

Animator_Body_Y.From = Translate_Body.Y;
Animator_Body_Y.To = ((Math.Cos(headingRadians) * pix) * -1) + Translate_Body.Y;
Translate_Body.BeginAnimation(TranslateTransform.YProperty, Animator_Body_Y);
Était-ce utile?

La solution

En supposant que vous tourner dans le sens horaire de 12 heures, vos nouvelles coordonnées x sera:

sin(130) * 200 = 153 + original x-coordinate

Et votre nouvelle coordonnée y sera

cos(130) * 200 = -129 + original y-coordinate (assuming negative 'y' is down)

Comme ci-dessous, notez que C #, par exemple, sin et cos prennent radians, pas en degrés -. Multiplier par Math.PI/180 pour obtenir la valeur en radians premier

Autres conseils

Vous pouvez utiliser cos et sin pour travailler la quantité de mouvement dans les coordonnées x et y. Ceci est basé sur le de .

Le cercle unité a des angles à partir de la droite, en allant dans le sens antihoraire. Ainsi, dans le cercle de l'unité de votre angle de 130 degrés est en fait 320 degrés.

actualAngle = 90 - 130 = -40 
(which is the same as 320 degrees when used in sin/cos)

L'autre chose à noter est que les fonctions de cos et sin utilisent radians au lieu de degrés.

angleInRadians = 320 * pi / 180 (about 5.59)
x = cos(angleInRadians) * 200 + 300 (about 453.21)
y = sin(angleInRadians) * 200 + 400 (about 271.44)

regard sur le TransformToVisual si vous avez les coordonnées de votre objet à partir d'une origine visuelle et vous voulez que les coordonnées de votre objet d'origine Visual B, alors vous faire

   var transformation = A.TransformToVisual(B);

vous pouvez lancer la transformation de GeneralTransform pour transformer si nécessaire. Ensuite, vous pouvez utiliser la méthode de transformation de votre objet GeneralTransform.

Je détaillerai comment vous pouvez le faire sans utiliser les mathématiques:

Notez que, je ne cherche pas ce que je dis, alors peut-être il y a quelques erreurs.

Je vais appeler la place que vous déplacez visuel B,

Je vais appeler le conteneur de Visual carré A.

Maintenant, vous voulez être en mesure de faire une traduction de B d'origine B à B «et récupérer B » coordonnées d'une origine.

Si votre traduction est (200,0) puis la coordonnée de B » d'origine B est (200,0). Vous voulez que ces coordonnées d'une origine. Donc, vous devez faire.

var transform = B.TransformToVisual(A);
var pointFromAOrigin  = transform.Transform(new Point(200,0));

pointFromAOrigin reflètent ce que vous voulez.

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