MayaFlux 0.4.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
MatrixTransforms.cpp
Go to the documentation of this file.
2
3namespace MayaFlux::Kinesis {
4
5Eigen::MatrixXd create_rotation_matrix(double angle, uint32_t axis, uint32_t dimensions)
6{
7 if (dimensions == 2) {
8 Eigen::Matrix2d rotation;
9 rotation << std::cos(angle), -std::sin(angle),
10 std::sin(angle), std::cos(angle);
11 return rotation;
12 }
13
14 if (dimensions == 3) {
15 Eigen::Matrix3d rotation = Eigen::Matrix3d::Identity();
16
17 switch (axis) {
18 case 0:
19 rotation << 1, 0, 0,
20 0, std::cos(angle), -std::sin(angle),
21 0, std::sin(angle), std::cos(angle);
22 break;
23 case 1:
24 rotation << std::cos(angle), 0, std::sin(angle),
25 0, 1, 0,
26 -std::sin(angle), 0, std::cos(angle);
27 break;
28 case 2:
29 default:
30 rotation << std::cos(angle), -std::sin(angle), 0,
31 std::sin(angle), std::cos(angle), 0,
32 0, 0, 1;
33 break;
34 }
35 return rotation;
36 }
37
38 return Eigen::MatrixXd::Identity(dimensions, dimensions);
39}
40
41Eigen::MatrixXd create_scaling_matrix(const std::vector<double>& scale_factors)
42{
43 if (scale_factors.empty()) {
44 return Eigen::MatrixXd::Identity(1, 1);
45 }
46
47 Eigen::MatrixXd scaling = Eigen::MatrixXd::Zero(
48 scale_factors.size(), scale_factors.size());
49
50 for (size_t i = 0; i < scale_factors.size(); ++i) {
51 scaling(i, i) = scale_factors[i];
52 }
53
54 return scaling;
55}
56
57Eigen::MatrixXd create_uniform_scaling_matrix(double scale, uint32_t dimensions)
58{
59 return Eigen::MatrixXd::Identity(dimensions, dimensions) * scale;
60}
61
62Eigen::VectorXd create_translation_vector(const std::vector<double>& offsets)
63{
64 Eigen::VectorXd vec(offsets.size());
65 for (size_t i = 0; i < offsets.size(); ++i) {
66 vec(static_cast<Eigen::Index>(i)) = offsets[i];
67 }
68 return vec;
69}
70
72 double angle,
73 const std::vector<double>& scale_factors,
74 uint32_t axis,
75 uint32_t dimensions)
76{
77 return create_scaling_matrix(scale_factors) * create_rotation_matrix(angle, axis, dimensions);
78}
79
80} // namespace MayaFlux::Kinesis
Eigen::MatrixXd create_rotation_scaling_matrix(double angle, const std::vector< double > &scale_factors, uint32_t axis, uint32_t dimensions)
Compose rotation then scaling: S * R.
Eigen::MatrixXd create_uniform_scaling_matrix(double scale, uint32_t dimensions)
Create uniform scaling matrix.
Eigen::VectorXd create_translation_vector(const std::vector< double > &offsets)
Create translation vector (not a matrix; affine embedding is caller's concern)
Eigen::MatrixXd create_scaling_matrix(const std::vector< double > &scale_factors)
Create diagonal scaling matrix from per-axis factors.
Eigen::MatrixXd create_rotation_matrix(double angle, uint32_t axis, uint32_t dimensions)
Create N-dimensional rotation matrix.
Tendency< D, float > scale(const Tendency< D, float > &t, float factor)
Uniform scaling of a scalar-output tendency.
Definition Tendency.hpp:97