1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2025-10-23 09:57:41 +00:00

rotations are now represented as matrices, not angles

This commit is contained in:
Zeno Rogue
2023-08-08 16:27:52 +02:00
parent c896b3ecd6
commit 1554caa7b4
11 changed files with 244 additions and 172 deletions

View File

@@ -203,6 +203,25 @@ constexpr transmatrix Id = diag(1,1,1,1);
/** zero matrix */
constexpr transmatrix Zero = diag(0,0,0,0);
/** a transmatrix with 2D and 3D version, useful for configuration */
struct trans23 {
transmatrix v2, v3;
transmatrix& get() { return MDIM == 3 ? v2 : v3; }
trans23() { v2 = Id; v3 = Id; }
trans23(const transmatrix& T) { v2 = T; v3 = T; }
trans23(const transmatrix& T2, const transmatrix& T3) { v2 = T2; v3 = T3; }
trans23 operator * (trans23 T) {
trans23 t;
auto& dim = cginf.g.homogeneous_dimension;
dynamicval<int> d1(dim, dim);
dim = 3; t.v2 = v2 * T.v2;
dim = 4; t.v3 = v3 * T.v3;
return t;
}
};
inline trans23 *gen_trans23() { return new trans23; }
/** mirror image */
constexpr transmatrix Mirror = diag(1,-1,1,1);
@@ -1167,6 +1186,16 @@ EX transmatrix iso_inverse(const transmatrix& T) {
return inverse(T);
}
/** inverse a guaranteed rotation */
EX transmatrix rot_inverse(const transmatrix& T) {
return transpose(T);
}
/** inverse a guaranteed rotation */
EX trans23 rot_inverse(const trans23& T) {
return trans23(rot_inverse(T.v2), rot_inverse(T.v3));
}
/** \brief T inverse a matrix T = O*S, where O is isometry and S is a scaling matrix (todo optimize) */
EX transmatrix z_inverse(const transmatrix& T) {
return inverse(T);