Pythonによる回転行列と法線ベクトルの実装

More than 1 year has passed since last update.

1. 回転行列

python 3.6を用いた。回転行列の数式は以下を参考にした。
http://1st.geocities.jp/shift486909/program/spin.html

2次元

{$$\begin{vmatrix} X' \\ Y' \\ \end{vmatrix} = \begin{vmatrix} \cos\theta &-\sin\theta \\ \sin\theta &\cos\theta \\ \end{vmatrix} \times \begin{vmatrix} X \\ Y \\ \end{vmatrix}$$
}


3次元 (Z軸周り= x -> y)

{$$\begin{vmatrix} X' \\ Y' \\ Z' \\ \end{vmatrix} = \begin{vmatrix} \cos\theta z &-\sin\theta z &0 \\ \sin\theta z &\cos\theta z &0 \\ 0 &0 &1 \\ \end{vmatrix} \times \begin{vmatrix} X \\ Y \\ Z \\ \end{vmatrix}$$
}


# -*- coding: utf-8 -*-
import numpy as np

if __name__ == '__main__':

# matrix
a = np.matrix([2.5, 2.5]).A1
b = np.matrix([5, 5]).A1
print("a=" + str(a))
print("b=" + str(b))
# AB = AC = r
pythagoras = b - a
r = np.sqrt( (pythagoras[0] * pythagoras[0]) + (pythagoras[1] * pythagoras[1] ))
print("r=" + str(r))

# tan theta (Inclination)
tant = (b[1] - a[1]) / (b[0] - a[0])
# theta
tan = np.arctan(tant)
# BD = r*sin α
BD = r * np.sin(tan)
print("BD=" + str(BD))

rotateMat = np.matrix([
[np.cos(theta), -np.sin(theta)],
[np.sin(theta), np.cos(theta)],
])

print(rotateMat)

cxy = (rotateMat * xy)
cxy = cxy.A1 + a
print("cxy=" + str(cxy) )

print("------------------")
# cx = AD*cos θ-BD*sin θ+ax
# cy = AD*sin θ+BD*cos θ+ay
BD2 = b[1] - a[1]
cx = ((AD2 * np.cos(theta)) - (BD2 * np.sin(theta))) + a[0]
print(cx)
cy = ((AD2 * np.sin(theta)) + (BD2 * np.cos(theta))) + a[1]
print(cy)



1.1. 回転行列 - 関数化

def calcRot(_posxy, _orgxy, _rad):
rotateMat = np.matrix([
])
cxy = (rotateMat * ADBD).A1 + _orgxy

return  cxy


こんな感じに使えばおｋ

 _posxy = np.matrix([_x, _y]).A1
_orgxy = np.matrix([_x, _y]).A1



1.2. 回転行列 - 複素数

コメントで教えて貰いましたが、回転行列は複素数でも表現できるらしい。

# -*- coding: utf-8 -*-
import numpy as np

if __name__ == '__main__':

A = 2.5 + 2.5j
B = 5.0 + 5.0j
print('A=' + str(A))
print('B=' + str(B))

rotate = np.cos(theta) + 1j * np.sin(theta) # = np.exp(1j * theta)

AB = B - A
AC = rotate * AB
C  = AC + A
print('C=' + str(C))


2. 法線ベクトル

もちろん他にもやり方は沢山ある。私は同じ関数(回転行列)を使いまわせるのでこれを使っている。

def calcNorm_vec(_posxy, _orgxy):