有限元分析后处理涉及计算机图形学,以二维梁单元为例,其变形和内力是基于杆的位置 的函数 ,由一系列的离散点组成矩阵
绘制平面刚架的变形图和内力图的过程是:以划分的单元为基础逐个完成。在画某一单元的变形或内力图时,通常是以该单元起点为总体坐标系的坐标原点,杆轴沿着总体坐标系的 轴正方向,杆轴上的离散点便是矩阵A的第一行,离散点对应的函数值 便是矩阵A的第二行。
▲图1
矩阵A要通过缩放、旋转、平移操作,使之回到对应的位置上去,即图形与局部坐标一致。对于图1中的单元1,则需要作旋转操作(RA),而单元2则需要作平移操作(TA)。缩放操作则根据图形是否协调适当考虑。
定义缩放矩阵
旋转矩阵
import matplotlib.pyplot as plt
import numpy as np
def main():
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 这个字体能够支持中英文字符
plt.rcParams['axes.unicode_minus'] = False # 正常显示负号
# 平面刚架
x = [0, 3, 6]
y = [0, 4, 4]
xx = np.linspace(0, 5, 10) # 梁划分为10个小段
# 每一个离散点的弯矩值
m = [0.0,-0.395, -0.690, -0.887, -0.985,-0.985,-0.887, -0.690, -0.395, -0.0]
# 旋转矩阵
R = np.array([[0.6, -0.8],[0.8, 0.6]])
# 旋转变换
Rxy = R @ np.vstack( (xx,m) )
# 绘制刚架图
fig, (ax0,ax1) = plt.subplots(nrows=1, ncols=2, sharex=True,
figsize=(8, 4))
# 绘制刚架图
ax0.plot(x, y)
# 绘制单元1未旋转时的弯矩图
ax0.plot(xx,m)
ax0.set( title='旋转前的弯矩图')
# 绘制单元1旋转后的弯矩图
ax1.plot(x, y)
ax1.plot(Rxy[0,:], Rxy[1,:])
ax1.set( title='旋转后的弯矩图')
fig.savefig("z1.png",dpi=300)
plt.show()
if __name__ == "__main__":
main()
▲图2
对于平移来说,按照上述思路,定义平移矩阵
却达不到预期效果。比如将一个点 往右平移2,往上平移2,得到新的位置 ,但是,通过平移矩阵计算
也就是说,仅凭一个 矩阵是做不到的。
▲图3a
▲图3b
▲图3c
如图3a所示,将平面矩形增加一个维度,成为长方体。这个长方体发生剪切变形,如图3b所示。这个过程在数学上称为剪切变换,所用到的矩阵称为剪切矩阵。然后将三维图形投影到二维平面,即实现了原图像的平移,如图3c所示
因此,需要扩充A矩阵,即增加一行
则二维图形的平移矩阵
经过矩阵乘法运算
import matplotlib.pyplot as plt
import numpy as np
def main():
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 这个字体能够支持中英文字符
plt.rcParams['axes.unicode_minus'] = False # 正常显示负号
# 平面刚架
x = [0, 3, 6]
y = [0, 4, 4]
xx = np.linspace(0, 3, 10) # 梁划分为10个小段
# 每一个离散点的弯矩值
m = [0.0,-0.395, -0.690, -0.887, -0.985,-0.985,-0.887, -0.690, -0.395, -0.0]
ones = np.ones(10)
# 矩阵A增加维度,即第三行全为1
A = np.vstack( (xx,m, ones) )
# 平移矩阵
T = np.array([[1, 0,3],[0, 1, 4], [0,0,1] ])
# 平移变换
Txy = T @ A
# 绘制刚架图
fig, (ax0,ax1) = plt.subplots(nrows=1, ncols=2, sharex=True,
figsize=(8, 4))
# 绘制刚架图
ax0.plot(x, y)
# 绘制单元2未平移时的弯矩图
ax0.plot(xx,m)
ax0.set( title='平移前的弯矩图')
# 绘制单元2平移后的弯矩图
ax1.plot(x, y)
ax1.plot(Txy[0,:], Txy[1,:])
ax1.set( title='平移后的弯矩图')
fig.savefig("z2.png",dpi=300)
plt.show()
if __name__ == "__main__":
main()
▲图4
为了方便编程,将三种矩阵统一定义成
缩放矩阵
旋转矩阵
如果是三维图形,则需要将三种矩阵统一定义成