Tartalom: lineáris és homgén transzformációk pyhonban
Szükséges előismereketek: python, matplotlib, numpy, opencv, lineáris algebra
Érdemes megnézni témában a következő videót: https://www.youtube.com/watch?v=kYB8IZa5AuE (3blue1brown Linear transformations and matrices | Essence of linear algebra, chapter 3) a lecke példáit követik a feldolgozást.
A lineáris transzformációkat 2x2-es, míg a 2D-s geometriai transzformációkat 3x3-as mátrixok segítségével írhatjuk fel. Egy pont transzformáció utáni koordinátáit a pont homogén koordinátás vektora és a transzformációs mátrix szorzata adja. De nézzük ezt inkább példán.
Kiindulásképp rajzoljunk ki pár koordinátát:
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
a0 = np.array([[0, 2], [0, 5], [3, 5], [3, 2], [0, 2], [0, 5], [1.5, 7],
[0.45, 5.6], [0.45, 6.5], [0.6, 6.5], [0.6, 5.8], [1.5, 7], [3, 5]])
plt.plot(a0[:, 0], a0[:, 1], "*-", label="a0")
plt.grid(True)
plt.axis("equal")
plt.legend()
plt.show()
Vegyük a következő t1
transzformációs mátrixot.
Szorozzuk össze a0
-val, , így a1
-et kapjuk, figyeljük meg az ereményt.
t1 = np.array([[0, 1], [-1, 0]])
a1 = np.dot(a0, t1)
plt.plot(a0[:, 0], a0[:, 1], "*-", label="a0")
plt.plot(a1[:, 0], a1[:, 1], "*-", label="a1")
plt.grid(True)
plt.axis("equal")
plt.legend()
print("t1 = \n", np.transpose(t1))
plt.show()
t1 = [[ 0 -1] [ 1 0]]
Vegyük a következő t2
transzformációs mátrixot.
t2 = np.array([[1, 0], [1, 1]])
a2 = np.dot(a0, t2)
plt.plot(a0[:, 0], a0[:, 1], "*-", label="a0")
plt.plot(a2[:, 0], a2[:, 1], "*-", label="a2")
plt.grid(True)
plt.axis("equal")
plt.legend()
print("t2 = \n", np.transpose(t2))
plt.show()
t2 = [[1 1] [0 1]]
A t4
transzformációs mátrixot a vízszintes tengelyre tükröz:
A t5
transzformációs mátrixot 2xes méretűre nagyítja az alakzatot:
t3 = np.array([[1, 2], [3, 1]])
t4 = np.array([[1, 0], [0, -1]])
t5 = np.array([[2, 0], [0, 2]])
a3 = np.dot(a0, t3)
a4 = np.dot(a0, t4)
a5 = np.dot(a0, t5)
plt.plot(a0[:, 0], a0[:, 1], "*-", label="a0")
plt.plot(a3[:, 0], a3[:, 1], "*-", label="a3")
plt.plot(a4[:, 0], a4[:, 1], "*-", label="a4")
plt.plot(a5[:, 0], a5[:, 1], "*-", label="a5")
plt.grid(True)
plt.axis("equal")
plt.legend()
print("\nt3 = \n", np.transpose(t3))
print("\nt4 = \n", np.transpose(t4))
print("\nt5 = \n", np.transpose(t5))
plt.show()
t3 = [[1 3] [2 1]] t4 = [[ 1 0] [ 0 -1]] t5 = [[2 0] [0 2]]
Az origó körüli α szöggel történő forgatás mátrixa:
plt.plot(a0[:, 0], a0[:, 1], "*-", label="a0")
for rot in range(12):
rot /= 2
t6 = np.array([[np.cos(rot), np.sin(rot)], [-np.sin(rot), np.cos(rot)]])
a6 = np.dot(a0, t6)
plt.plot(a6[:, 0], a6[:, 1], "*-", label=str(rot))
plt.grid(True)
plt.axis("equal")
plt.legend()
plt.show()