Повернуть вектор радианами, сохраняя при этом величину - PullRequest
0 голосов
/ 23 февраля 2019

В этой конкретной мини-игре мне нужно иметь возможность вращать машину влево или вправо, сохраняя при этом скорость в любом направлении.Это кусок кода, с которым у меня возникают проблемы:

private void turn(float angleDelta)
    {
        double r = Math.Sqrt(Math.Pow(carPosition.X, 2) + Math.Pow(carPosition.Y, 2));
        double theta = Math.Atan2(carPosition.Y, carPosition.X);

        carPosition = new Vector2((float)(r * Math.Cos(theta)), (float)(r * Math.Sin(theta)));


    }

    protected override void Update(GameTime gameTime)
    {
        base.Update(gameTime);
        float angularVelocity = MathHelper.ToRadians(3);
        if (Keyboard.GetState().IsKeyDown(Keys.Left))
        {
            turn(-angularVelocity);
        }
        if (Keyboard.GetState().IsKeyDown(Keys.Right))
        {
            turn(angularVelocity);
        }
        carPosition += carVelocity;
    }

В частности, в методе turn (float angleDelta) я чувствую, что правильно ввел код, но я не уверен, гдеangleDelta будет вписываться в это.Я попытался добавить angleDelta к carPosition, но это просто выдает ошибки.

1 Ответ

0 голосов
/ 23 февраля 2019

Это широко известное матричное преобразование в 2D:

u' = A*u

, где

u = (ux, uy) as a column vector
u' = (ux', uy') as a column vector
A = | cos(theta) -sin(theta) |
    | sin(theta)  cos(theta) |

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

Это простая проблема, если вы понимаете векторы и как их преобразовывать.

Вот как я могу кодировать их на Java.Вы должны быть в состоянии легко конвертировать его в C #.Как вы можете видеть, двумерное плоское вращение является унитарным процессом - величина сохраняется, как вы пожелаете.

/**
 * Created by Michael
 * Creation date 2/23/2019.
 * @link /12366333/povernut-vektor-radianami-sohranyaya-pri-etom-velichinu
 */
public class VectorDemo {

    public static final int VECTOR_2D_SIZE = 2;

    public static void main(String[] args) {
        double [] u = { 4.0, 0.0 };
        double umag = magnitude(u);
        System.out.println(print(u));
        System.out.println(String.format("u magnitude: %10.4f", umag));
        double angle = Math.toRadians(45.0);
        double [] v = rotate2D(u, angle);
        double vmag = magnitude(v);
        System.out.println(print(v));
        System.out.println(String.format("v magnitude: %10.4f", vmag));
    }

    public static double magnitude(double [] u) {
        if (u == null) throw new IllegalArgumentException("Vector u cannot be null");
        double magnitude = 0.0;
        for (int i = 0; i < u.length; ++i) {
            magnitude += u[i]*u[i];
        }
        return Math.sqrt(magnitude);
    }

    public static double [] rotate2D(double [] u, double angleRadians) {
        if (u == null) throw new IllegalArgumentException("Vector u cannot be null");
        if (u.length != VECTOR_2D_SIZE) throw new IllegalArgumentException("2D vectors only");
        double [] v = new double[VECTOR_2D_SIZE];
        double [][] a = new double[VECTOR_2D_SIZE][VECTOR_2D_SIZE];
        a[0][0] = +Math.cos(angleRadians);
        a[0][1] = -Math.sin(angleRadians);
        a[1][0] = +Math.sin(angleRadians);
        a[1][1] = +Math.cos(angleRadians);
        for (int i = 0; i < VECTOR_2D_SIZE; ++i) {
            v[i] = 0.0;
            for (int j = 0; j < VECTOR_2D_SIZE; ++j) {
                v[i] += a[i][j]*u[j];
            }
        }
        return v;
    }

    public static String print(double [] v) {
        return String.format("(%10.4f, %10.4f)", v[0], v[1]);
    }
}

Вот мой вывод:

(    4.0000,     0.0000)
u magnitude:     4.0000
(    2.8284,     2.8284)
v magnitude:     4.0000
...