arm/WindowsFormsApp1/Normal2Quaternion.cs
2025-02-04 20:09:10 +08:00

56 lines
2.3 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}
}
}