// 三次元格子を三次元空間の中で回転する
# 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));