cp_library_rs/algebraic_structure/
affine2d.rs1#![allow(clippy::needless_range_loop)]
6
7#[derive(Debug, Clone, Copy)]
10pub struct AffineMatrix {
11 pub arr: [[isize; 3]; 3],
12}
13
14impl AffineMatrix {
15 pub fn e() -> Self {
16 Self {
17 arr: [[1, 0, 0], [0, 1, 0], [0, 0, 1]],
18 }
19 }
20
21 pub fn rotate90() -> Self {
22 Self {
23 arr: [[0, -1, 0], [1, 0, 0], [0, 0, 1]],
24 }
25 }
26
27 pub fn rotate270() -> Self {
28 Self {
29 arr: [[0, 1, 0], [-1, 0, 0], [0, 0, 1]],
30 }
31 }
32
33 pub fn mirror_x(p: isize) -> Self {
34 Self {
35 arr: [[-1, 0, 2 * p], [0, 1, 0], [0, 0, 1]],
36 }
37 }
38
39 pub fn mirror_y(p: isize) -> Self {
40 Self {
41 arr: [[1, 0, 0], [0, -1, 2 * p], [0, 0, 1]],
42 }
43 }
44
45 pub fn dot(&self, other: &Self) -> Self {
46 let mut arr = [[0, 0, 0], [0, 0, 0], [0, 0, 0]];
47 for i in 0..3 {
48 for j in 0..3 {
49 for k in 0..3 {
50 arr[i][j] += self.arr[i][k] * other.arr[k][j];
51 }
52 }
53 }
54 Self { arr }
55 }
56
57 pub fn apply(&self, vec: (isize, isize)) -> (isize, isize) {
58 (
59 self.arr[0][0] * vec.0 + self.arr[0][1] * vec.1 + self.arr[0][2],
60 self.arr[1][0] * vec.0 + self.arr[1][1] * vec.1 + self.arr[1][2],
61 )
62 }
63}