// 理論物理学のための幾何学とトポロジーU(Pearson Education Japan) 中原幹夫著 2900円+税

// 底空間が螺旋の場合のファイバー束の例 3ページ

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

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

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

u0 = 0;
u50; // 100 -> 50 -> 25
du = 2π()/35; // 25 -> 35

r@;

x3;

QUATERNION() { // 四元数の演算を宣言する
  Q() = QUARTER(COS(δ/2), αSIN(δ/2), βSIN(δ/2), γSIN(δ/2));
};
_X(u) { // 円柱座標
  RETURN(COS(u));
};
_Y(u) {
  RETURN(SIN(u));
};
_Z(u) {
  RETURN(u);
};
∀(x,u,r) {
// 回転角度(δ)反時計回り

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

TITLE(u,"%s=%.1f","VAL");
OUT(M(x,u,r));

f0 = -2;
f10;
df = 0.4;
h = 0.001;

p?;
t?;
∀(u) {
  u = u(u);
  p0 = _X(u); // 接点の位置(p)を求める
  p1 = _Y(u);
  p2 = _Z(u);
  t0 = (_X(u+h)-_X(u))/h; // x/∂u
  t1 = (_Y(u+h)-_Y(u))/h; // y/∂u
  t2 = (_Z(u+h)-_Z(u))/h; // z/∂u

  ∀(x,f) {
// 回転角度(δ)反時計回り

    QUATERNION() { // 四元数の演算を宣言する
      P() = QUARTER(0,p0+t0*f(f),p1+t1*f(f),p2+t2*f(f)); // 四元数を生成する
      A() = ~Q()P()Q(); // δ/2を2回だけ回転させる
    };
    F(x:0,f,u) = ELEMENT(A(), 0); // 要素を取り出す
    F(x:1,f,u) = ELEMENT(A(), 1);
    F(x:2,f,u) = ELEMENT(A(), 2);
    F(x:3,f,u) = ELEMENT(A(), 3);
  };
};
SKIPTITLE();
TITLE(x,"%s=%.1f","VAL");
TITLE(f,"%s=%.1f","VAL");
TITLE(u,"\n%s=%.1f","VAL");
OUT(F(x,f,u));

q0 = 0;
q1;
dq = 1;

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

  QUATERNION() { // 四元数の演算を宣言する
    P() = QUARTER(0,q(q),0,0); // 四元数を生成する
    A() = ~Q()P()Q(); // δ/2を2回だけ回転させる
  };
  L(x:0,q,r) = ELEMENT(A(), 0); // 要素を取り出す
  L(x:1,q,r) = ELEMENT(A(), 1);
  L(x:2,q,r) = ELEMENT(A(), 2);
  L(x:3,q,r) = ELEMENT(A(), 3);
};
SKIPTITLE();
TITLE(x,"\n%s=%.1f","VAL");
TITLE(q,"%s=%.1f","VAL"); // x座標軸を描く
OUT(L(x,q,r));

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

  QUATERNION() { // 四元数の演算を宣言する
    P() = QUARTER(0,0,q(q),0); // 四元数を生成する
    A() = ~Q()P()Q(); // δ/2を2回だけ回転させる
  };
  L(x:0,q,r) = ELEMENT(A(), 0); // 要素を取り出す
  L(x:1,q,r) = ELEMENT(A(), 1);
  L(x:2,q,r) = ELEMENT(A(), 2);
  L(x:3,q,r) = ELEMENT(A(), 3);
};
SKIPTITLE();
TITLE(x,"\n%s=%.1f","VAL");
TITLE(q,"%s=%.1f","VAL");
OUT(L(x,q,r)); // y座標軸を描く

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

  QUATERNION() { // 四元数の演算を宣言する
    P() = QUARTER(0,0,0,q(q)); // 四元数を生成する
    A() = ~Q()P()Q(); // δ/2を2回だけ回転させる
  };
  L(x:0,q,r) = ELEMENT(A(), 0); // 要素を取り出す
  L(x:1,q,r) = ELEMENT(A(), 1);
  L(x:2,q,r) = ELEMENT(A(), 2);
  L(x:3,q,r) = ELEMENT(A(), 3);
};
SKIPTITLE();
TITLE(x,"\n%s=%.1f","VAL");
TITLE(q,"%s=%.1f","VAL");
OUT(L(x,q,r)); // z座標軸を描く