Math (en WPF): Obtention de nouvelles coordonnées x, y, après une traduction
-
22-08-2019 - |
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);
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.