如何让任意矢量绕着任意轴旋转一定角度,得到新的矢量,在NX中,通过矩阵运算,可以直接得到目标向量。
直接上代码:
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;
}
欢迎交流与讨论,欢迎留言或者私信我寻求帮助,谢谢。