Математика (в WPF): получение новых координат x, y после перевода - PullRequest
4 голосов
/ 11 февраля 2009

Применительно к этой программируемой игре Я сейчас строю.

Я использую WPF для анимации холстов и использую метод BeginAnimation для перевода (перемещения) холста через другой холст.

В BeginAnimation мне нужно указать координаты From и To для x и y, и этот метод я использую следующим образом:

//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);

Теперь холст нужно перевести, используя заданный угол, который я получил из метода.

Итак, мой вопрос: учитывая угол (0-359), на котором холст в настоящее время вращается, начиная с координат x и y (от того, где холст находится в данный момент) и расстояние (в пикселях), как мне это сделать? вычислить до конечных координат? то есть туда, куда холст будет окончательно переведен.

альтернативный текст http://img244.imageshack.us/img244/4794/canvastranspositionmi5.jpg

На изображении выше я нарисовал пример того, чего я хочу достичь.

Предположим, что холст (прямоугольник со сплошной рамкой) имеет текущий курс (угол), равный 130 градусам, и его необходимо перевести (следуя пути вниз по этому углу; т. Е. В зависимости от того, где он в данный момент обращен) на 200 пикселей. ... какие будут новые координаты (где он прекратит анимацию: рамка с пунктирной границей) холста? Как рассчитать эти новые координаты того, где он остановится?

[ОБНОВЛЕНИЕ] Решение:

Благодаря помощи обоих Энди и Камерона , он наконец-то работает как задумано.

А вот и рабочий код:

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);

Ответы [ 4 ]

3 голосов
/ 11 февраля 2009

Предполагая, что вы вращаетесь по часовой стрелке с 12 часов, ваша новая x-координата будет:

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

И ваша новая y-координата будет

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

Как показано ниже, обратите внимание, что, например, в C # sin и cos принимают радианы, а не градусы - умножьте на Math.PI/180, чтобы сначала получить значение в радианах.

2 голосов
/ 11 февраля 2009

Вы можете использовать cos и sin, чтобы определить величину движения в координатах x и y. Это основано на единичном круге .

Круг юнитов имеет углы, начинающиеся с правой стороны и идущие против часовой стрелки. Таким образом, в круговой единице ваш угол 130 градусов на самом деле составляет 320 градусов.

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

Следует также отметить, что функции cos и sin используют радиан вместо градусов.

angleInRadians = 320 * pi / 180 (about 5.59)
x = cos(angleInRadians) * 200 + 300 (about 453.21)
y = sin(angleInRadians) * 200 + 400 (about 271.44)
0 голосов
/ 11 февраля 2009

Я подробно расскажу, как можно обойтись без математики:

Обратите внимание, что я не пытаюсь сказать то, что говорю, поэтому, возможно, есть некоторые ошибки.

Я назову квадрат, на котором вы движетесь. Visual B,

Я назову контейнер квадрата Visual A.

Теперь вы хотите иметь возможность выполнить перевод B из B в начало координат и получить B 'координаты из A origin.

Если ваш перевод равен (200,0), то координата B 'от источника B равна (200,0). Вы хотите эти координаты из источника. Так что вы должны сделать.

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

pointFromAOrigin отражает то, что вы хотите.

0 голосов
/ 11 февраля 2009

посмотрите на TransformToVisual , если у вас есть координата вашего объекта из источника Visual A и вы хотите получить координаты вашего объекта из источника Visual B, тогда вы делаете

   var transformation = A.TransformToVisual(B);

Вы можете при необходимости преобразовать преобразование из GeneralTransform в Transform. Затем вы можете использовать метод Transform вашего объекта GeneralTransform.

...