Это широко известное матричное преобразование в 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