#include "FITKVec3DAlg.h" #include namespace Core { FITKPoint FITKCoreAPI Add(const FITKPoint& a, const FITKPoint& b, const double aFac, const double bFac) { double c[3] = { 0,0,0 }; c[1] = a.y()*aFac + b.y()*bFac; c[0] = a.x()*aFac + b.x()*bFac; c[2] = a.z()*aFac + b.z()*bFac; // 创建并返回新的FITKPoint对象,存储结果 return FITKPoint(c); } FITKPoint FITKCoreAPI Subtract(const FITKPoint& a, const FITKPoint& b, const double aFac, const double bFac ) { double c[3] = { 0,0,0 }; c[0] = a.x()*aFac - b.x()*bFac; c[1] = a.y()*aFac - b.y()*bFac; c[2] = a.z()*aFac - b.z()*bFac; // 创建并返回新的FITKPoint对象,存储结果 return FITKPoint(c); } /** * 计算两个三维点(FITKPoint类型)的向量叉积,并返回新的FITKPoint对象。 * * @param a 第一个输入向量(FITKPoint类型) * @param b 第二个输入向量(FITKPoint类型) * @return 叉积结果(FITKPoint类型) */ FITKPoint CrossProduct(const FITKPoint& a, const FITKPoint& b) { double c[3] = { 0,0,0 }; // 根据叉积定义计算各个分量 c[0] = a.y() * b.z() - a.z() * b.y(); c[1] = a.z() * b.x() - a.x() * b.z(); c[2] = a.x() * b.y() - a.y() * b.x(); // 创建并返回新的FITKPoint对象,存储叉积结果 return FITKPoint(c); } /** * 计算两个三维点(FITKPoint类型)的向量点积,并返回标量结果。 * * @param a 第一个输入向量(FITKPoint类型) * @param b 第二个输入向量(FITKPoint类型) * @return 点积结果(double类型) */ double DotProduct(const FITKPoint & a, const FITKPoint & b) { // 根据点积定义计算标量结果 return a.x() * b.x() + a.y() * b.y() + a.z() * b.z(); } /** * 将三维点P绕给定轴线Axis按指定角度Angle进行旋转,并返回旋转后的FITKPoint对象。 * * @param P 待旋转的三维点(FITKPoint类型) * @param Axis 旋转轴线 * @param Angle 旋转角度,以弧度为单位(double类型) * @return 旋转后的三维点(FITKPoint类型) */ FITKPoint RotateAroundAxis(const FITKPoint& P, FITKVec3D& Axis, double Angle) { Axis.normalize(); double cosTheta = std::cos(Angle); double sinTheta = std::sin(Angle); double kP = DotProduct(Axis, P); // 计算点P在旋转轴上的投影长度 FITKPoint kCrossP = CrossProduct(Axis, P); // 计算点P相对于旋转轴的垂直向量 // 应用罗德里格斯公式计算旋转后的点坐标 FITKPoint pt( P.x() * cosTheta + kCrossP.x() * sinTheta + Axis.x() * kP * (1.0 - cosTheta), P.y() * cosTheta + kCrossP.y() * sinTheta + Axis.y() * kP * (1.0 - cosTheta), P.z() * cosTheta + kCrossP.z() * sinTheta + Axis.z() * kP * (1.0 - cosTheta) ); return pt; // 返回旋转后的FITKPoint对象 } double FITKCoreAPI Distance(const FITKPoint& a, const FITKPoint& b) { double dx = a.x() - b.x(); double dy = a.y() - b.y(); double dz = a.z() - b.z(); return sqrt(dx*dx + dy * dy + dz * dz); } double FITKCoreAPI AngleBetweenVec(const FITKVec3D& v1, const FITKVec3D& v2) { //点乘 double dp = DotProduct(v1, v2); //角度余弦值 double arcAng = dp / (v1.getNorm()*v2.getNorm()); return std::acos(arcAng); } }