【NX】NX二次开发中如何绕固定轴旋转矢量

如何让任意矢量绕着任意轴旋转一定角度,得到新的矢量,在NX中,通过矩阵运算,可以直接得到目标向量。

【NX】NX二次开发中如何绕固定轴旋转矢量_第1张图片

 

直接上代码:

AUTUMOON::AUTUMOONMathVector3d CAMToolPathToolkit::RotateVector(const AUTUMOONMathVector3d &ivecSrc,
                                                        const AUTUMOONMathVector3d ivecAxis,
                                                        const double &dAngle /*= 90.0*/)
{
    double rotation_axis[3] = {0};
    double rotation_angle = PAI * dAngle / 180.0;
    double mtx[9] = {0};

    ivecAxis.Array(rotation_axis);

    UF_MTX3_rotate_about_axis(rotation_axis, rotation_angle, mtx);

    double arrSrc[3] = {0};
    ivecSrc.Array(arrSrc);
    double arrDst[3] = {0};

    UF_MTX3_vec_multiply(arrSrc, mtx, arrDst);

    return AUTUMOONMathVector3d(arrDst[0], arrDst[1], arrDst[2]);
}

项目原因部分不重要的代码实现无法公开,可以自己考虑实现,或者查阅资料,调用UG自带的函数。

在知道可以调用UG函数之前,我实现了简单的平面上的绕固定点旋转,其基本思想就是二维上的三角函数运算,在这里也给出相关的代码吧,仅供参考:

AUTUMOON::AUTUMOONMathVector3d CAMToolPathToolkit::RotateVector(const AUTUMOONMathVector3d &ivecSrc,
                                                        const AUTUMOONMathVector3d ivecAxis,
                                                        const double &dAngle /*= 90.0*/)
{
    AUTUMOONMathVector3d vecDst(ivecSrc);

    double dVecLength = ivecSrc.Length();
    if (fabs(dVecLength) < 0.001)
    {
        return vecDst;
    }

    vecDst.UnitiZation();

    if (fabs(ivecSrc.Z) < 0.001 && ivecAxis.IsParallel(AUTUMOONMathVector3d::ZVector()))
    {
        // 计算原始的坐标
        double dX = vecDst.X;
        double dY = vecDst.Y;

        double dTheta = atan2(dY, dX);

        double dAddAngle = dAngle / 180.0 * PAI;

        double dNewAngle = dTheta + dAddAngle;

        double dNewX = dVecLength * cos(dNewAngle);
        double dNewY = dVecLength * sin(dNewAngle);

        vecDst = AUTUMOONMathVector3d(dNewX, dNewY, 0.0);
    }

    if (fabs(ivecSrc.X) < 0.001 && ivecAxis.IsParallel(AUTUMOONMathVector3d::XVector()))
    {
        double dX = vecDst.Y;
        double dY = vecDst.Z;

        double dTheta = atan2(dY, dX);

        double dAddAngle = dAngle / 180.0 * PAI;

        double dNewAngle = dTheta + dAddAngle;

        double dNewY = dVecLength * cos(dNewAngle);
        double dNewZ = dVecLength * sin(dNewAngle);

        vecDst = AUTUMOONMathVector3d(0.0, dNewY, dNewZ);
    }

    if (fabs(ivecSrc.Y) < 0.001 && ivecAxis.IsParallel(AUTUMOONMathVector3d::YVector()))
    {
        double dX = vecDst.X;
        double dY = vecDst.Z;

        double dTheta = atan2(dY, dX);

        double dAddAngle = dAngle / 180.0 * PAI;

        double dNewAngle = dTheta + dAddAngle;

        double dNewX = dVecLength * cos(dNewAngle);
        double dNewZ = dVecLength * sin(dNewAngle);

        vecDst = AUTUMOONMathVector3d(dNewX, 0.0, dNewZ);
    }

    return vecDst;
}

欢迎交流与讨论,欢迎留言或者私信我寻求帮助,谢谢。

你可能感兴趣的:(nx二次开发,c++)