首页/文章/ 详情

ANSA二次开发:节点旋转坐标计算

7月前浏览449

在几何变换中,开发者经常要面对的一种情况:已知一个点A的坐标(x, y, z),该点基于一个旋转轴[轴向量为(a, b, c),基点O坐标为(x0, y0, z0)]旋转一个角度θ,需要知道旋转后A点的坐标。计算A点的新坐标,主要用到罗德里格斯旋转公式,下面对该公式进行介绍及推导以加深理解。

罗德里格斯旋转公式:任意三维向量v,已知旋转轴k是单位向量,旋转角为θ,按照右手法则(即逆时针)旋转,则旋转后的向量vrot为:

vrot=vcosθ+(1−cosθ)(k⋅v)k+k×vsinθ

旋转公式推导过程:向量v可以分解为平行于k的分量v∥和正交于k的分量v⊥(如图1),即:v=v∥+v⊥,其中

v∥=(v⋅k)k                                                                               (1)

v⊥=v−v∥=v−(k⋅v)k=−k×(k×v)                                               (2)

从图1还可以看出,v的平行分量v∥不会因为旋转而改变,旋转后的向量vrot的平行分量依然等于v∥,即v∥rot=v∥。而v的正交分量v⊥在旋转过程中大小不变,方向会发生变化,即:

|v⊥rot|=|v⊥|                                                                           (3)

v⊥rot=v⊥cosθ+k×v⊥sinθ=v⊥cosθ+k×vsinθ                           (4)

则vrot=v∥rot+v⊥rot

        =v∥+v⊥cosθ+k×vsinθ

        =v∥+(v−v∥)cosθ+k×vsinθ

        =vcosθ+(1−cosθ)v∥+k×vsinθ

        =vcosθ+(1−cosθ)(k⋅v)k+k×vsinθ

罗德里格斯旋转公式注意事项:

1. 罗德里格斯旋转公式旋转对象为向量,对于点A需要先相对于基点O进行相关转换;

2. 旋转角存在方向,当前为逆时针,在实际使用过程中需要特别注意。

python实现:




























































from ansa import calcfrom ansa import baseimport math

class Vector(object):  @staticmethod  def point2Point(cls, point1:List[float], point2:List[float], unit:bool=True)->List[float]:    '''    计算两点构成的向量. 向量由point1指向point2,即point2-point1    '''
    if isinstance(point1, base.Entity): point1 = point1.position    if isinstance(point2, base.Entity): point2 = point2.position    vect:List[float] = [p2-p1 for p1, p2 in zip(point1, point2)]    return cls.unit(vect) if unit else vect    @staticmethod  def move(point:Union[base.Entity, Iterable[float]], vector:Iterable[float], distance:float=1.0)->Tuple[float]:    '''    将点point沿向量vector平移distance距离得到新的坐标点    '''
    if isinstance(point, base.Entity): point = point.position    return [p+distance*v for p, v in zip(point, vector)]    @staticmethod  def unit(vector:List[float])->List[float]:    '''    将一个向量单位化    '''
    return calc.Normalize(vector)    @class method  def rotate(cls, vector:Iterable[float], axis:Iterable[float], theta:float)->Tuple[float]:    '''    计算将向量vector绕旋转轴axis旋转theta角后的向量    '''
    thetaRadian:float = math.radians(theta)    cosTheta:float = math.cos(thetaRadian)    sinTheta:float = math.sin(thetaRadian)        unitAxis:List[float] = cls.unit(axis)    dot:float = calc.DotProduct(unitAxis, vector)    cross:List[float] = calc.CrossProduct(unitAxis, vector)    return[(v1*cosTheta+v2*sinTheta+v3*dot*(1-cosTheta)) for v1, v2, v3 in zip(vector, cross, unitAxis)]    def main():  initPoint:List[float] = [1, 1, 1] # 旋转轴基点  axis:List[float] = [2, 3, 4] # 旋转轴向量  pointA:List[float] = [10, 5, 3] # 待旋转点坐标  vector = Vector.point2Point(initPoint, pointA, unit=False) #   rotateVect = Vector.rotate(vector, axis, 50) # 旋转50度  newPointA = Vector.move(pointA, rotateVect)
if __name__ == '__main__':  main()

未经作者同意,不得转载该文!!!

来源:檐苔
二次开发ANSApython
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2026-02-26
最近编辑:7月前
青瓦松
硕士 签名征集中
获赞 46粉丝 13文章 63课程 0
点赞
收藏
作者推荐

预备知识1-数据操作学习笔记

数据的两种基本操作:(1) 数据获取;(2) 将数据读入计算机后对其进行处理。张量(tensor):N维数组。在MXNet中为ndarray,在PyTorch和TensorFlow中为Tensor,都与numpy中的ndarray相似。但深度学习框架比Numpy的ndarray多一些重要功能:(1) GPU很好地支持加速计算,而NumPy仅支持CPU计算;(2) 张量类支持自动微分。 一、入门torch的基本操作二、运算符对于任意具有相同形状的张量,常见的标准算术运算符(+、 -、 *、 /和**)都可以被升级为按元素运算。多个张量连结(concatenate)张量的逻辑运算元素求和三、广播机制形状不同,通过调用广播机制(broadcasting mechanis m)来执行按元素操作,工作机制如下:1. 通过适当复 制元素来扩展一个或两个数组,以便在转换之后,两个张量具有相同的形状;2. 对生成的数组执行按元素操作。大多数情况下,我们将沿着数组中长度为1的轴进行广播四、索引和切片 五、节省内存 运行一些操作可能会导致为新结果分配内存。例如,如果我们用Y=X+Y,我们将取消引用Y指向的张量,而是指向新分配的内存处的张量。返回值为False,说明以上操作导致Y内存地址进行重新分配。这是不可取的,原因有两个:1. 首先,我们不想总是不必要地分配内存。在机器学习中,可能有数百兆的参数,且在一秒内多次更新所有参数。通常情况下,我们希望原地执行这些更新;2. 若不原地更新,其他引用仍指向旧的内存地址而出现错误。六、转换为其他Python对象torch张量和numpy数组将共享它们的底层内存,就地操作更改一个张量也会同时更改另一个张量。来源:檐苔

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈