// 三次元格子を三次元空間の中で回転する

# t=δ, a=α, b = β, c = γ, e=θ

// 回転軸(α, β, γ)、 α^2+β^2+γ^2=1である必要がある
α=1/√(3);
β=1/√(3);
γ=1/√(3);

δ = 0.2; // 回転角度(ラジアン)

x0 = 0.5;
x5;
dx = -0.2;

y0 = -0.5;
y5;
dy = 0.2;

z0 = -0.5;
z5;
dz = 0.2;

u3;

QUATERNION() { // 四元数の演算を宣言する
  Q() = QUARTER(COS(δ/2), αSIN(δ/2), βSIN(δ/2), γSIN(δ/2));
};
∀(u,x,y,z) {
// 回転角度(δ)反時計回り

  QUATERNION() { // 四元数の演算を宣言する
    P() = QUARTER(0,x(x),y(y),z(z)); // 四元数を生成する
    A() = ~Q()P()Q(); // δ/2を2回だけ回転させる
  };
  R(u:0,x,y,z) = ELEMENT(A(), 0); // 要素を取り出す
  R(u:1,x,y,z) = ELEMENT(A(), 1);
  R(u:2,x,y,z) = ELEMENT(A(), 2);
  R(u:3,x,y,z) = ELEMENT(A(), 3);
};

TITLE(x,"\n%s=%.1f","VAL");
TITLE(y,"%s=%.1f","VAL");
TITLE(z,"%s=%.1f","VAL");
OUT(R(u,y,x,z),R(u,x,y,z));
TITLE(x,"%s=%.1f","VAL");
TITLE(y,"\n%s=%.1f","VAL");
SKIPTITLE();
OUT(R(u,x,y,z),R(u,x,y,z));
TITLE(y,"%s=%.1f","VAL");
TITLE(x,"\n%s=%.1f","VAL");
SKIPTITLE();
OUT(R(u,z,x,y),R(u,x,y,z));
p@;
r0 = -0.6;
r1;
dr = 1.2;

∀(u,r,p,p) {
// 回転角度(δ)反時計回り

  QUATERNION() { // 四元数の演算を宣言する
    P() = QUARTER(0,r(r),r(r),r(r)); // 四元数を生成する
    A() = ~Q()P()Q(); // δ/2を2回だけ回転させる
  };
  S(u:0,r,p,p) = ELEMENT(A(), 0); // 要素を取り出す
  S(u:1,r,p,p) = ELEMENT(A(), 1);
  S(u:2,r,p,p) = ELEMENT(A(), 2);
  S(u:3,r,p,p) = ELEMENT(A(), 3);
};
TITLE(p,"\n%s%d","SEQ");
SKIPTITLE();
OUT(S(u,r,p,p));