arm/WindowsFormsApp1/Normal2Quaternion.cs

56 lines
2.3 KiB
C#
Raw Normal View History

2025-02-04 20:09:10 +08:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RealSence_PathMove
{
class Normal2Quaternion
{
public double[] calculateQuaternion(double[] startaxis, double[] targetaxis)
{
double sita = calculateangle(startaxis, targetaxis);
double[] cross = calculatecross(startaxis, targetaxis);
double[] Quaternion = new double[4];
Quaternion[0] = Math.Cos(sita / 2);
Quaternion[1] = cross[0] * Math.Sin(sita / 2);
Quaternion[2] = cross[1] * Math.Sin(sita / 2);
Quaternion[3] = cross[2] * Math.Sin(sita / 2);
return Quaternion;
}
private double calculateangle(double[] s, double[] t)
{
double sita;
double dot;
double norm;
dot = s[0] * t[0] + s[1] * t[1] + s[2] * t[2];
norm = Math.Sqrt(s[0] * s[0] + s[1] * s[1] + s[2] * s[2]) * Math.Sqrt(t[0] * t[0] + t[1] * t[1] + t[2] * t[2]);
sita = Math.Acos(dot / norm);
return sita;
}
public double[] calculatecross(double[] s, double[] t)
{
double[] cross = new double[3];
cross[0] = s[1] * t[2] - s[2] * t[1];
cross[1] = s[2] * t[0] - s[0] * t[2];
cross[2] = s[0] * t[1] - s[1] * t[0];
double len = Math.Sqrt(Math.Pow(cross[0], 2) + Math.Pow(cross[1], 2) + Math.Pow(cross[2], 2));
cross[0] /= len;
cross[1] /= len;
cross[2] /= len;
return cross;
}
public double[] QuatMultiply(double[] QuatA, double[] QuatB)//將四元數相乘,代表將四元數旋轉 EX:A四元數乘以[0 0 0 1]代表此四元數沿著Z軸旋轉[0 0 0 1]為沿著Z軸旋轉180度的四元數
{
double[] Q = new double[4];
Q[1] = QuatA[0] * QuatB[1] - QuatA[3] * QuatB[2] + QuatA[2] * QuatB[3] + QuatA[1] * QuatB[0];
Q[2] = QuatA[3] * QuatB[1] + QuatA[0] * QuatB[2] - QuatA[1] * QuatB[3] + QuatA[2] * QuatB[0];
Q[3] = -QuatA[2] * QuatB[1] + QuatA[1] * QuatB[2] + QuatA[0] * QuatB[3] + QuatA[3] * QuatB[0];
Q[0] = -QuatA[1] * QuatB[1] - QuatA[2] * QuatB[2] - QuatA[3] * QuatB[3] + QuatA[0] * QuatB[0];
return Q;
}
}
}