运用python画光刻板版图-2函数讲解

运用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])=[ax+bycx+dy]
式中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])=[rxsy]=[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])=[1001][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库用来绘制版图,绘制前需要确定版图层数。具有增加、描点和绘图操作。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

skyer_lhb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值