// 2007年2月2日に作成する
// Excelで学ぶ物理数学(ナツメ社) 245ページを参考にしました。
// 中田 亨様のホームページを参考にしました。
// http://staff.aist.go.jp/toru-nakata/index-j.html
// 素粒子の新謎解き(リーベル出版)仁平群治著の67ページを参考にしました。

// 四元数を用いて、三次元空間で、回転操作を行ってspin回転動作を描く

#  t=δ, a=α, b = β, c = γ, s=θ, p=ψ

i@; // 単位変数であることを宣言する
j@;
k@;

// 回転軸(α, β, γ)
α=0;
β=1;
γ=0;

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

// 座標(x, y, z)

r=1; // 半径
θ0 = 0;
θ16;
dθ=π()/16;

ψ0 = 0.0;
ψ40;
dψ = 2π()/40;

IF(1) { // Y10 Y20 では必要、極点近くでは細かく刻む
  ALL(θ) {
    θ(θ) = (1-COS(θ(θ)))/2*π();
  };
};

X3;

QUATERNION() { // 四元数の演算を宣言する
  Q(i) = QUARTER(COS(δ/2), αSIN(δ/2), βSIN(δ/2), γSIN(δ/2));
};

∀(ψ,θ) {
  x=rSIN(θ(θ))COS(ψ(ψ));
  y=rSIN(θ(θ))SIN(ψ(ψ));
  z=rCOS(θ(θ));

// 回転角度(δ)反時計回り

  QUATERNION() { // 四元数の演算を宣言する
    P(i) = QUARTER(0,x,y,z); // 四元数を生成する
R(i) = QUARTER(COS(θ(θ)/2), 0, 0, SIN(θ(θ)/2));
P(i) = ~R(i)P(i)R(i);// θのπ当たりz軸を中心に2πだけ回転させる
// P(i) = ~R(i)P(i)R(i);
    A(i) = ~Q(i)P(i)Q(i); // y軸を中心にδ/2を2回だけ回転させる
  };
  ∀(X) {
    Z(ψ,θ,X:0) = ELEMENT(A(i), 0); // 要素を取り出す
    Z(ψ,θ,X:1) = ELEMENT(A(i), 1);
    Z(ψ,θ,X:2) = ELEMENT(A(i), 2);
    Z(ψ,θ,X:3) = ELEMENT(A(i), 3);
  };

};
MPRT(Z(ψ,θ,X)); // csvファイルに出力する