云霄一羽

V1

2022/07/13阅读:27主题:自定义主题1

结构分析底层原理(4):坐标系是怎样表示的?

对于所有结构分析问题来说,所有节点、单元都有其局部坐标系统,结构整体也有其整体坐标系统。因此首要问题是空间直角坐标系的计算。

要确定一个三维空间下的直角坐标系,最简单的方法是通过三点

第一个点作为原点

第二个点确定 轴的方向,具体来说是单位向量

第三个点确定 平面,从而根据右手坐标系法则,就可以定出 轴的方向,具体来说就是

需要注意的是,向量的外积不满足交换律,因此注意前后顺序:

由右手定则就可以进一步确定 轴方向

这样的操作产生的坐标系满足右手定则,依次伸出右手拇指、食指、中指大致就对应 [公式] 三轴方向。

三点确定的坐标系 需要注意的是,如此构造坐标系的方式要求三点不能共线,这个可以通过计算 的夹角余弦确定,即要求:

更简单的方法是通过计算两者的外积

这里稍微说明一下,从时间复杂度来说,外积计算更快,如果希望进一步提高速度,可以用最大值代替模来进行判断,避免开方计算。

当三点一线时,抛出异常。

由于浮点数计算中存在数值误差,所以实际计算中并不要求严格相等,而是相差不超过一个小的阈值 即可:

在python中向量相关的具体计算可以使用科学计算包numpy,StructEngPy在csys.py模块中,在Cartesian类中的实现:

        tol=Tolerance.abs_tol()
        self.__O=np.array(O)    
        OA = np.array(A)-np.array(O)
        OB = np.array(B)-np.array(O)
        if np.max(np.abs(np.cross(OA,OB)))<tol:
            raise Exception("Three points should not be in a line!!")        
        x = OA/np.linalg.norm(OA)
        z = np.cross(OA, OB)
        z = z / np.linalg.norm(z)
        y = np.cross(z, x)

坐标系最重要的功能是各种坐标变换,对结构分析来说主要是旋转变换,通常通过3x3的坐标旋转矩阵来实现,上面计算中方向向量 已经归一化,旋转矩阵仅需要将三个列向量排在一起后转置即可。

某坐标系的旋转矩阵作用在3维空间点 (以列向量表示)上,将得到点在该坐标系下的3个坐标分量

与一般数学列向量优先的习惯不同,numpy是行优先存储,因此代码实现直接将三个分量并列即可:

self.__T=np.array([x,y,z])

从数据存储的角度,通过原点和方向足以表示一个空间直角坐标系。Cartesian类仅存储原点和变换矩阵 ,其余 的方向分量在需要的时候进行计算即可,这是因为坐标转换矩阵是最频繁使用的数据,成块紧凑地存储有利于提高读写效率。

上面就是三维空间中直角坐标系的核心计算内容。在具体代码实现上,Cartesian类还有一些方便操作的其他方法。类似方法也可以用于构造柱坐标系、球坐标等其他坐标系类型,方便建模操作,但所有计算最后都会还原到笛卡尔直角坐标系以进行三维空间计算。

分类:

数学

标签:

数学编程

作者介绍

云霄一羽
V1