运用python画光刻板版图
第二章 函数讲解
1、Matrix函数:用来对图形进行变换
本章介绍一些数学对象——向量和矩阵。在学习一些理论背景后,你将应用这些知识来创建一个矩阵类,它将是操纵几何对象的位置和方向的基础。
1.1线性函数
一个线性向量<x,y>函数F的公式可以用列的形式写成
F
(
[
x
y
]
)
=
[
a
⋅
x
+
b
⋅
y
c
⋅
x
+
d
⋅
y
]
F(\left[\begin{matrix}x \\y\end{matrix} \right])=\left[\begin{matrix}a\cdot x+b\cdot y \\c \cdot x+d\cdot y\end{matrix} \right]
F([xy])=[a⋅x+b⋅yc⋅x+d⋅y]
式中a,b,c,d可以写在矩阵中,于是函数F可以重写
F
(
[
x
y
]
)
=
[
a
b
c
d
]
[
x
y
]
F(\left[\begin{matrix}x \\y\end{matrix} \right])=\left[\begin{matrix}a & b\\c & d\end{matrix} \right]\left[\begin{matrix}x \\y\end{matrix} \right]
F([xy])=[acbd][xy]
单位矩阵I如下所示:
I
=
[
1
0
0
1
]
I=\left[\begin{matrix}1 & 0\\0 & 1\end{matrix} \right]
I=[1001]
其python代码如下:
def makeIdentity(): # 单位矩阵
return numpy.array([[1, 0, 0],
[0, 1, 0],
[0, 0, 1]]).astype(float)
满足线性方程的向量函数的操作,可以用矩阵乘法表示。计算机图形中所需的几何变换(平移、旋转、缩放)是线性函数,下面将说明对应的矩阵公式。
1.2 缩放
缩放变换将一个向量的每个分量乘以一个常数。对于二维向量,矩阵乘法表示如下(其中r和s是常数):
F
(
[
x
y
]
)
=
[
r
⋅
x
s
⋅
y
]
=
[
r
0
0
s
]
[
x
y
]
F(\left[\begin{matrix}x \\y\end{matrix} \right])=\left[\begin{matrix}r\cdot x \\s\cdot y\end{matrix} \right]=\left[\begin{matrix}r & 0\\0 & s\end{matrix} \right]\left[\begin{matrix}x \\y\end{matrix} \right]
F([xy])=[r⋅xs⋅y]=[r00s][xy]
其python代码如下:
def makeScale(s): # 缩放矩阵
return numpy.array([[s, 0, 0],
[0, s, 0],
[0, 0, 1]]).astype(float)
1.3 对称变化
对于x轴执行对称变化,只需将其他轴数据取反即可,矩形乘法表示如下:
F
(
[
x
y
]
)
=
[
1
0
0
−
1
]
[
x
y
]
F(\left[\begin{matrix}x \\y\end{matrix} \right])=\left[\begin{matrix}1 & 0\\0 & -1\end{matrix} \right]\left[\begin{matrix}x \\y\end{matrix} \right]
F([xy])=[100−1][xy]
对x轴和y轴执行对称变换的python代码如下:
def makeSymmetricX(): # x轴对称变换
return numpy.array([[1, 0, 0],
[0, -1, 0],
[0, 0, 1]]).astype(float)
def makeSymmetricY(): # y轴对称变换
return numpy.array([[-1, 0, 0],
[0, 1, 0],
[0, 0, 1]]).astype(float)
1.4 旋转
在此基础上,给出了二维空间中θ角θ围绕原点旋转的矩阵:
F
(
[
x
y
]
)
=
[
c
o
s
(
θ
)
−
s
i
n
(
θ
)
s
i
n
(
θ
)
c
o
s
(
θ
)
]
[
x
y
]
F(\left[\begin{matrix}x \\y\end{matrix} \right])=\left[\begin{matrix}cos(\theta) & -sin(\theta)\\sin(\theta) & cos(\theta)\end{matrix} \right]\left[\begin{matrix}x \\y\end{matrix} \right]
F([xy])=[cos(θ)sin(θ)−sin(θ)cos(θ)][xy]
其python代码如下:
def makeRotation(angle): # 顺时针选择矩阵
c = cos(angle)
s = sin(angle)
return numpy.array([[c, s, 0],
[-s, c, 0],
[0, 0, 1]]).astype(float)
1.5 平移
平移转换将常数值添加到向量的每个分量中。对于二维向量,它有以下形式(其中m和n是常数):
F
(
[
x
y
]
)
=
[
x
+
m
y
+
n
]
F(\left[\begin{matrix}x \\y\end{matrix} \right])=\left[\begin{matrix}x +m\\y+n\end{matrix} \right]
F([xy])=[x+my+n]
我们的目标是建立一个矩阵,该矩阵对空间中的所有点集执行平移。为了将平移表示为矩阵变换,被平移的空间需要扩展一维,扩展的坐标集为1。
[
1
0
m
0
1
n
0
0
1
]
[
x
y
1
]
=
[
x
+
m
y
+
n
1
]
\left[\begin{matrix}1 & 0 &m\\0 &1& n\\0&0&1\end{matrix} \right]\left[\begin{matrix}x \\y\\1\end{matrix} \right]=\left[\begin{matrix}x+m \\y+n\\1\end{matrix} \right]
⎣
⎡100010mn1⎦
⎤⎣
⎡xy1⎦
⎤=⎣
⎡x+my+n1⎦
⎤
其python代码如下:
def makeTranslation(x, y): # 移动矩阵
return numpy.array([[1, 0, x],
[0, 1, y],
[0, 0, 1]]).astype(float)
1.6 局部变换与全局变化
为了将点集T作为全局变换,让新的模型矩阵等于T·M。为了将T作为局部变换,设新的模型矩阵等于M·T。
def applyMatrix(self, matrix, localCoord=True):
if localCoord:
self.transform = self.transform @ matrix
else:
self.transform = matrix @ self.transform
2、Object2D二维图形基类
2.1图形建立规则
图形的建立采用“树”的数据结构,一个图形可以有多个子图形。若需要对一块区域的图形进行变换操作,只需建立一空图形,将该区域所有图形以空图行为父节点,对空图形做变换即可。
2.2 内部函数讲解
在建立图形时会建立一个单位矩阵,父节点为None,子节点为空。
- 增删操作:内部有add和remove操作,用来增加、去除子节点。
- 单图形操作:对单个图形执行移动、旋转、缩放、对称操作
- 多图形操作:对整个图形块的移动、旋转、放大、对称操作
- 查找操作:能得到单个图形的局部坐标、操作矩阵、全局坐标及全部子节点
3、Layout版图绘制类
导入pya库用来绘制版图,绘制前需要确定版图层数。具有增加、描点和绘图操作。