affine_map

ソースコード

from titan_pylib.math.affine_map import AffineMap

view on github

展開済みコード

 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]
static get(a: list[list[int | float]], x: float, y: float) tuple[float, float][source]
classmethod new() 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]
classmethod x_symmetrical_move(a: list[list[int | float]], p: int | float) list[list[int | float]][source]
classmethod y_symmetrical_move(a: list[list[int | float]], p: int | float) list[list[int | float]][source]