affine_map¶
ソースコード¶
from titan_pylib.math.affine_map import AffineMap
展開済みコード¶
1# from titan_pylib.math.affine_map import AffineMap
2from typing import Union
3from math import sin, cos, radians
4
5
6class AffineMap:
7
8 # 平面のアフィン変換クラス
9 #
10 # 使い方:
11 # mat = AffineMap.new()
12
13 @classmethod
14 def _matmul3(
15 cls, a: list[list[Union[int, float]]], b: list[list[Union[int, float]]]
16 ) -> list[list[Union[int, float]]]:
17 res: list[list[Union[int, float]]] = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
18 for i in range(3):
19 for k in range(3):
20 for j in range(3):
21 res[i][j] += b[k][j] * a[i][k]
22 return res
23
24 @classmethod
25 def new(cls) -> list[list[Union[int, float]]]:
26 return [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
27
28 @classmethod
29 def shift(
30 cls,
31 a: list[list[Union[int, float]]],
32 shift_x: Union[int, float] = 0,
33 shift_y: Union[int, float] = 0,
34 ) -> list[list[Union[int, float]]]:
35 b = [[1, 0, shift_x], [0, 1, shift_y], [0, 0, 1]]
36 return cls._matmul3(b, a)
37
38 @classmethod
39 def expand(
40 cls,
41 a: list[list[Union[int, float]]],
42 ratio_x: Union[int, float] = 1,
43 ratio_y: Union[int, float] = 1,
44 ) -> list[list[Union[int, float]]]:
45 b = [[ratio_x, 0, 0], [0, ratio_y, 0], [0, 0, 1]]
46 return cls._matmul3(b, a)
47
48 @classmethod
49 def rotate(
50 cls, a: list[list[Union[int, float]]], theta: Union[int, float] = 0
51 ) -> list[list[Union[int, float]]]:
52 if theta == 90:
53 b = [[0, -1, 0], [1, 0, 0], [0, 0, 1]]
54 elif theta == -90:
55 b = [[0, 1, 0], [-1, 0, 0], [0, 0, 1]]
56 else:
57 theta = radians(theta)
58 b: list[list[Union[int, float]]] = [
59 [cos(theta), -sin(theta), 0],
60 [sin(theta), cos(theta), 0],
61 [0, 0, 1],
62 ]
63 return cls._matmul3(b, a)
64
65 @classmethod
66 def x_symmetrical_move(
67 cls, a: list[list[Union[int, float]]], p: Union[int, float]
68 ) -> list[list[Union[int, float]]]:
69 b = [[-1, 0, 2 * p], [0, 1, 0], [0, 0, 1]]
70 return cls._matmul3(b, a)
71
72 @classmethod
73 def y_symmetrical_move(
74 cls, a: list[list[Union[int, float]]], p: Union[int, float]
75 ) -> list[list[Union[int, float]]]:
76 b = [[1, 0, 0], [0, -1, 2 * p], [0, 0, 1]]
77 return cls._matmul3(b, a)
78
79 @staticmethod
80 def get(
81 a: list[list[Union[int, float]]], x: float, y: float
82 ) -> tuple[float, float]:
83 a0, a1, _ = a
84 x, y = a0[0] * x + a0[1] * y + a0[2], a1[0] * x + a1[1] * y + a1[2]
85 return x, y
仕様¶
- class AffineMap[source]¶
Bases:
object
- classmethod expand(a: list[list[int | float]], ratio_x: int | float = 1, ratio_y: int | float = 1) list[list[int | float]] [source]¶
- classmethod rotate(a: list[list[int | float]], theta: int | float = 0) list[list[int | float]] [source]¶
- classmethod shift(a: list[list[int | float]], shift_x: int | float = 0, shift_y: int | float = 0) list[list[int | float]] [source]¶