Математика (в WPF): получение новых координат x, y после перевода

Что касается этой игры по программированию Я сейчас занимаюсь строительством.

Я использую 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);

person Andreas Grech    schedule 10.02.2009    source источник


Ответы (4)


Предполагая, что вы вращаетесь по часовой стрелке с 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, чтобы сначала получить значение в радианах.

person Andy Mikula    schedule 10.02.2009
comment
С вашими уравнениями это почти работает. Но он движется назад, а не вперед. Что мне следует изменить в уравнении? - person Andreas Grech; 11.02.2009
comment
Да - отправные точки. Если ваши координаты «y» увеличиваются при перемещении вниз по странице, возможно, вам придется умножить результат cos (130) * 200 на -1. - person Andy Mikula; 11.02.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)
person Cameron MacFarland    schedule 10.02.2009
comment
Это почти работает, но координата y идет вверх, а не вниз. Что мне следует изменить в уравнении? - person Andreas Grech; 11.02.2009
comment
Кроме того, как мне получить правильный угол единичной окружности? например, вы получили 320 из 130. Какую формулу мне использовать? - person Andreas Grech; 11.02.2009

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

   var transformation = A.TransformToVisual(B);

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

person Nicolas Dorier    schedule 10.02.2009
comment
Но в этом случае B не существует, потому что холст не перемещается к другому объекту. Но спасибо за упоминание TransformToVisual; не знал об этом, и я воспользуюсь этим для чего-нибудь еще. - person Andreas Grech; 11.02.2009
comment
В этом случае B - это объект, который вы перемещаете, координаты которого на холсте равны (300 400). - person Nicolas Dorier; 11.02.2009
comment
Извините, я имел в виду, что B - это ваши окна, а A - квадрат (то, что вы называете Canvas). Смотрите мой другой ответ. - person Nicolas Dorier; 11.02.2009

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

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

Я назову квадрат, который вы перемещаете, Visual B,

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

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

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

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

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

person Nicolas Dorier    schedule 10.02.2009