Вращение в пространстве: различия между версиями

Содержимое удалено Содержимое добавлено
Нет описания правки
Нет описания правки
Строка 20:
Шесть степеней свободы тела описываются тремя координатами точки О (центр в системе <math>xyz</math>) и тремя углами однозначно определяющие положение системы <math>xyz</math> относительно <math>x_0y_0z_0</math>. Эти углы называются ''углами Эйлера'' (они будут рассмотрены позже).
 
== Векторное произведение двух векторов ==
[[Файл:Cross product vector.svg|100px|right]]
 
* [[w:Ортогональный базис|Ортогональный базис]] - базис <math>e_1, e_2, ... e_n</math> евклидова пространства называется ортогональным, если векторы базиса попарно ортогональны, если кроме того, все векторы базиса имеют единичную длину (''нормализованы''), то базис называется ''ортонормированным''.
 
* '''Нормализация''' — приведение к единичному размеру; нормализация в трехмерном пространстве - по сути является масштабированием в куб единичного размера
* '''Нормализация вектора''' — преобразование заданного вектора в вектор в том же направлении, но с единичной длиной. Для нормализации вектора нужно каждую компоненту поделить на длину вектора. Длина вектора в трёхмерном евклидовом пространстве определяется следующей формулой: <math>length = \sqrt {(x*x + y*y + z*z)}</math>
* [[w:Векторное произведение|'''Векторное произведение двух векторов''']] - если два вектора <math>\mathbf a</math> и <math>\mathbf b</math> представлены в [[w:ортонормированный базис|ортонормированном базисе]], то их ''векторное произведение'' имеет вид
 
: <math> [ \mathbf a,\; \mathbf b ] = (a_y b_z - a_z b_y,\; a_z b_x - a_x b_z,\; a_x b_y - a_y b_x) </math>
 
 
{{Hider| |title = Программный код нормализации 3-х мерного вектора
|content-style = text-align: left;
|content =
<source lang="csharp">
public float length()
{
return (float)Math.Sqrt((X * X) + (Y * Y) + (Z * Z));
}
 
public xyzVector normalize()
{
float locLength = length();
float inv_length = (1 / locLength);
x *= inv_length;
y *= inv_length;
z *= inv_length;
return this;
}
</source>
}}
 
{{Hider| |title = Программный код векторного произведение двух 3-х мерных векторов
|content-style = text-align: left;
|content =
<source lang="csharp">
public static xyzVector cross(xyzVector v1, xyzVector v2)
{
return new xyzVector(
(v1.Y * v2.Z) - (v1.Z * v2.Y),
(v1.Z * v2.X) - (v1.X * v2.Z),
(v1.X * v2.Y) - (v1.Y * v2.X)
);
}
</source>
}}
 
== Матрицы поворотов в трёхмерном пространстве ==
 
* [[w:Матрица поворота|Матрицами вращения]] вокруг оси декартовой правой системы координат на угол ''&alpha;'' в трёхмерном пространстве являются:
 
* Вращение вокруг оси x:
: <math>
\begin{pmatrix}
1 & 0 & 0 \\
0 & \cos \alpha & -\sin \alpha \\
0 & \sin \alpha & \cos \alpha
\end{pmatrix}
</math>,
 
* Вращение вокруг оси y:
: <math>
\begin{pmatrix}
\cos \alpha & 0 & \sin \alpha \\
0 & 1 & 0 \\
-\sin \alpha & 0 & \cos \alpha
\end{pmatrix}
</math>,
 
* Вращение вокруг оси z:
: <math>
\begin{pmatrix}
\cos \alpha & -\sin \alpha & 0 \\
\sin \alpha & \cos \alpha & 0 \\
0 & 0 & 1
\end{pmatrix}
</math>,
 
{{Hider| |title = Программный код вращения на угол ''&alpha;'' в трёхмерном пространстве
|content-style = text-align: left;
|content =
<source lang="csharp">
public static xyzMatrix X_rot_rad(float alpha) // radians
{
float cosA = (float)Math.Cos(alpha);
float sinA = (float)Math.Sin(alpha);
return new xyzMatrix(
1.0f, 0.0f, 0.0f,
0.0f, cosA, -sinA,
0.0f, sinA, cosA);
}
 
public static xyzMatrix Y_rot_rad(float alpha) // radians
{
float cosA = (float)Math.Cos(alpha);
float sinA = (float)Math.Sin(alpha);
return new xyzMatrix(
cosA, 0.0f, sinA,
0.0f, 1.0f, 0.0f,
-sinA, 0.0f, cosA);
}
 
public static xyzMatrix Z_rot_rad(float alpha) // radians
{
float cosA = (float)Math.Cos(alpha);
float sinA = (float)Math.Sin(alpha);
 
return new xyzMatrix(
cosA, -sinA, 0.0f,
sinA, cosA, 0.0f,
0.0f, 0.0f, 1.0f);
}
</source>
}}
 
== Матрица переходов ==
 
* [[w:Матрица перехода|Матрица перехода]] — это композиция поворотов
 
== Повороты ==