public class Quaternion {
private final double x0, x1, x2, x3;
// 四元数构造函数
public Quaternion(double x0, double x1, double x2, double x3) {
this.x0 = x0;
this.x1 = x1;
this.x2 = x2;
this.x3 = x3;
}
// 转化
public String toString() {
return x0 + " + " + x1 + "i + " + x2 + "j + " + x3 + "k";
}
// 模
public double norm() {
return Math.sqrt(x0*x0 + x1*x1 +x2*x2 + x3*x3);
}
// 共轭
public Quaternion conjugate() {
return new Quaternion(x0, -x1, -x2, -x3);
}
// 加法
public Quaternion plus(Quaternion b) {
Quaternion a = this;
return new Quaternion(a.x0+b.x0, a.x1+b.x1, a.x2+b.x2, a.x3+b.x3);
}
// 乘法
public Quaternion times(Quaternion b) {
Quaternion a = this;
double y0 = a.x0*b.x0 - a.x1*b.x1 - a.x2*b.x2 - a.x3*b.x3;
double y1 = a.x0*b.x1 + a.x1*b.x0 + a.x2*b.x3 - a.x3*b.x2;
double y2 = a.x0*b.x2 - a.x1*b.x3 + a.x2*b.x0 + a.x3*b.x1;
double y3 = a.x0*b.x3 + a.x1*b.x2 - a.x2*b.x1 + a.x3*b.x0;
return new Quaternion(y0, y1, y2, y3);
}
// 逆
public Quaternion inverse() {
double d = x0*x0 + x1*x1 + x2*x2 + x3*x3;
return new Quaternion(x0/d, -x1/d, -x2/d, -x3/d);
}
// 除法
// 转化为乘法问题 a * b^-1 (b^-1 a)
public Quaternion divides(Quaternion b) {
Quaternion a = this;
return a.times(b.inverse());
}
// test
public static void main(String[] args) {
Quaternion a = new Quaternion(3.0, 1.0, 0.0, 0.0);
StdOut.println("a = " + a);
Quaternion b = new Quaternion(0.0, 5.0, 1.0, -2.0);
StdOut.println("b = " + b);
StdOut.println("norm(a) = " + a.norm());
StdOut.println("conj(a) = " + a.conjugate());
StdOut.println("a + b = " + a.plus(b));
StdOut.println("a * b = " + a.times(b));
StdOut.println("b * a = " + b.times(a));
StdOut.println("a / b = " + a.divides(b));
StdOut.println("a^-1 = " + a.inverse());
StdOut.println("a^-1 * a = " + a.inverse().times(a));
StdOut.println("a * a^-1 = " + a.times(a.inverse()));
}
}