Как вытащить изображения ракет поверх строк?

Как вы можете видеть ниже, изображения маленьких ракет не переходят черту. Как я могу создать смещение, которое учитывает угол и поворот. Я использую линейную интерполяцию для извлечения координат x y между концами каждой прямой линии.

            float xDiff = end_xpos[i] - start_xpos[i];
            float yDiff = end_ypos[i] - start_ypos[i];
            double degrees = Math.Atan2(yDiff, xDiff) * 180.0 / Math.PI;
            double radians = (Math.PI / 180) * degrees;


            args.DrawingSession.DrawLine(start_xpos[i], start_ypos[i], end_xpos[i], end_ypos[i], Color.FromArgb(Alpha_line, 255, 255, 255), 2);

            pointX = Math.Round((start_xpos[i] + (end_xpos[i] - start_xpos[i]) * percent), 1);
            pointY = Math.Round((start_ypos[i] + (end_ypos[i] - start_ypos[i]) * percent), 1);

            Missle_ROT.TransformMatrix = Matrix3x2.CreateRotation((float)radians);
            args.DrawingSession.DrawImage(Missle_ROT, Convert.ToSingle(pointX), Convert.ToSingle(pointY));

введите здесь описание изображения


person Brett Ezra    schedule 18.07.2016    source источник
comment
а где ракетный спрайт? и описание системы координат?   -  person Spektre    schedule 18.07.2016
comment
Положительное вращение по часовой стрелке (по умолчанию для Windows) или против часовой стрелки?   -  person John Alexiou    schedule 18.07.2016


Ответы (2)


Я думаю, проблема в том, что вы устанавливаете угол своего изображения вот так Missle_ROT.TransformMatrix = Matrix3x2.CreateRotation((float)radians);.

Система координат такая:

введите здесь описание изображения

Поэтому, когда вы использовали метод Matrix3x2.CreateRotation (Single) чтобы повернуть изображение, оно вращается с центральной точкой по умолчанию, которая также является левой верхней точкой этого изображения. В качестве решения вы можете использовать Matrix3x2.CreateRotation Method (Single, Vector2), чтобы указать центр вращения, и для вашего сценария этот центр должен быть центром вашего изображения. Вы можете пройти такой тест:

var image = await CanvasBitmap.LoadAsync(sender, "Assets/solidimg.png");
var transform = new Transform2DEffect() { Source = image };
//draw image's left-top point (0,0) of the image
args.DrawingSession.DrawCircle(new Vector2(200, 200), 10, Colors.Black);
//draw image with no trasform effect
transform.TransformMatrix = Matrix3x2.CreateRotation(0);
args.DrawingSession.DrawImage(transform, 200, 200);
//draw image with trasform effect and center on the (0,0) point
transform.TransformMatrix = Matrix3x2.CreateRotation((float)(20 * Math.PI) / 180);
args.DrawingSession.DrawImage(transform, 200, 200);
//draw image's center point of the image
args.DrawingSession.DrawCircle(new Vector2((float)(200 + image.Size.Width / 2), (float)(200 + image.Size.Height / 2)), 10, Colors.Red);
//draw image with trasform effect and center on the image's center
transform.TransformMatrix = Matrix3x2.CreateRotation((float)(20 * Math.PI) / 180, new Vector2((float)image.Size.Width / 2, (float)image.Size.Height / 2));
args.DrawingSession.DrawImage(transform, 200, 200);

И для вашего последнего кода для рисования изображения args.DrawingSession.DrawImage(Missle_ROT, Convert.ToSingle(pointX), Convert.ToSingle(pointY)); он по-прежнему рисует изображение из точки (0,0), вы также должны вычислить центральную точку изображения до «pointX» и «pointY» следующим образом:

args.DrawingSession.DrawImage(Missle_ROT, Convert.ToSingle(pointX- (float)image.Size.Width / 2), Convert.ToSingle(pointY- (float)image.Size.Height / 2));
person Grace Feng    schedule 19.07.2016

Вы хотите нарисовать изображение (с размерами w,h в пикселях) на экране, повернув его с центром в указанных координатах px и py в пикселях. Вам нужно найти расположение левого верхнего угла изображения (с координатами x_A и y_A).

Это делается с помощью поворота координат относительного расположения центра изображения (h/2 и w/2).

x_A = px - (w/2)*cos(θ) + (h/2)*sin(θ)
y_A = py - (w/2)*sin(θ) - (h/2)*cos(θ)

рис

person John Alexiou    schedule 19.07.2016
comment
Спасибо за информацию, но я не уверен, что означает этот символ θ. Это радианы? - person Brett Ezra; 20.07.2016
comment
θ - угол поворота ракеты от горизонтали. При использовании в функциях sin или cos значение должно быть в радианах, но в вашей программе вы можете отслеживать его в градусах. Это тебе решать. - person John Alexiou; 20.07.2016
comment
Всегда помните греческий алфавит: α β γ δ ε ζ η θ ι κ λ μ ν ξ ο π ρ σ τ υ φ χ ψ ω - person John Alexiou; 20.07.2016