二次元の剛体変換に非可換な双対複素数1を導入することを目的とする。
複素数2と双対数3についての予備知識だけで概ね事足りる。
後者についてはテイラー展開が重要になるので簡単に触れる。
※ 四元数4や双対四元数5にも関連があるのでそれらの知識もあるとなお良い。
双対数は二重数とも訳されるが前者で統一する。
双対数#
双対数(Dual numbers)の環は次式で定義される剰余環。
R^:=R[ϵ]/(ϵ2)={a+bϵ∣a,b∈R}(a+bϵ)+(c+dϵ)=(a+c)+(b+d)ϵ(a+bϵ)(c+dϵ)=ac+(ad+bc)ϵ乗法の逆元#
(a+bϵ)−1=a−1(1−a−1bϵ)(a=0)a+bϵ=a−bϵ絶対値#
∣a+bϵ∣2∣a+bϵ∣=(a+bϵ)(a−bϵ)=a2=a2=∣a∣テイラー展開#
f(a+bϵ)=n=0∑∞n!f(n)(a)(bϵ)n=f(0)(a)+f(1)(a)bϵ+2!f(2)(a)(bϵ)2+⋯=f(0)(a)+f(1)(a)bϵ例えば sin(a+bϵ) なら
sin(a+bϵ)=sin(a)+cos(a)bϵ双対複素数#
双対複素数(Dual Complex Numbers)の環は次式で定義される剰余環。
C^:=C[ϵ]/(ϵ2)={p0+p1ϵ∣p0,p1∈C}C^ の乗算について非可換な双対複素数を Cˇ と定義する。
p^∈Cˇ は
p^=p0+p1ϵ=(pa+pbi)+(pc+pdi)ϵ=pa+pbi+pcϵ+pdiϵここで pa,pb,pc,pd∈R
p^+q^∈Cˇp^+q^=(p0+p1ϵ)+(q0+q1ϵ)=(p0+q0)+(p1+q1)ϵ
結合性#
p^+(q^+r^)=(p^+q^)+r^p^+(q^+r^)(p^+q^)+r^=(p0+p1ϵ)+((q0+q1ϵ)+(r0+r1ϵ))=(p0+p1ϵ)+((q0+r0)+(q1+r1)ϵ)=(p0+q0+r0)+(p1+q1+r1)ϵ=((p0+q0)+(p1+q1)ϵ)+(r0+r1ϵ)=(p0+q0+r0)+(p1+q1+r1)ϵ
可換性#
p^+q^=q^+p^p^+q^q^+p^=(p0+p1ϵ)+(q0+q1ϵ)=(p0+q0)+(p1+q1)ϵ=(q0+q1ϵ)+(p0+p1ϵ)=(q0+p0)+(q1+p1)ϵ
中立元の存在性#
p^+0=p^p^+0=(p0+p1ϵ)+(0+0ϵ)=(p0+0)+(p1+0)ϵ=p^
反数の存在性#
p^+(−p^)=0p^+(−p^)=(p0+p1ϵ)+(−(p0+p1ϵ))=(p0−p0)+(p1−p1)ϵ=0
p^⊗q^∈Cˇp^⊗q^=(p0+p1ϵ)⊗(q0+q1ϵ)=p0⊗q0+(p0⊗q1+p1⊗q0)ϵ
乗法のルール#
乗積表(iϵ=−ϵi に注意)は
L\R1iϵiϵ11iϵiϵii−1−iϵϵϵϵiϵ00iϵiϵ−ϵ00順序に注意し展開
p^⊗q^=(p0+p1ϵ)⊗(q0+q1ϵ)=p0⋅q0+p0⋅q1ϵ+p1ϵ⋅q0+p1ϵ⋅q1ϵ第3項は
ϵ⋅q0=ϵ⋅(qa+qbi)=qaϵ+qbϵi=qaϵ−qbiϵ=(qa−qbi)ϵ=q0ϵ第4項は
ϵ⋅q1ϵ=ϵ⋅(qcϵ+qdiϵ)=qcϵϵ+qdϵiϵ=qcϵ2−qdiϵ2=(qc−qdi)ϵ2=q1ϵ2これらから左側から ϵ を掛けると右側の複素数の複素共役を取り順序が入れ替わる。
結合性#
p^⊗(q^⊗r^)=(p^⊗q^)⊗r^p^⊗(q^⊗r^)(p^q^)⊗r^=(p0+p1ϵ)⊗(q0r0+(q0r1+q1r0)ϵ)=p0q0r0+(p0q0r1+p0q1r0+p1q0r0)ϵ=(p0q0+(p0q1+p1q0)ϵ)⊗(r0+r1ϵ)=p0q0r0+(p0q0r1+p0q1r0+p1q0r0)ϵ
可換性#
p^⊗q^=q^⊗p^p^⊗q^q^⊗p^=p0q0+(p0q1+p1q0)ϵ=q0p0+(q0p1+q1p0)ϵ
中立元の存在#
p^⊗1=p^p^⊗1=(p0+p1ϵ)⊗(1+0ϵ)=p0+p1ϵ=p^
分配性#
p^⊗(q^+r^)=p^⊗q^+p^⊗r^p^⊗(q^+r^)=(p0+p1ϵ)⊗((q0+r0)+(q1+r1)ϵ)=p0q0+p0r0+(p0q1+p0r1+p1q0+p1r0)ϵ=p^⊗q^+p^⊗r^
(p^+q^)⊗r^=p^⊗r^+q^⊗r^(p^+q^)⊗r^=((p0+q0)+(p1+q1)ϵ)⊗(r0+r1ϵ)=p0r0+q0r0+(p0r1+q0r1+p1r0+q1r0)ϵ=p^⊗r^+q^⊗r^
乗法の逆元#
p^−1=p^1=∣p0∣2p0−p1ϵp0+p1ϵ1=p0+p1ϵ1p0−p1ϵp0−p1ϵ=p0p0+(p1p0−p0p1)ϵp0−p1ϵ
p^⊗p^−1=p^−1⊗p^=1p^⊗p^−1p^−1⊗p^=(p0+p1ϵ)⊗∣p0∣2p0−p1ϵ=∣p0∣2p0p0−p0p1ϵ+∣p0∣2p1p0ϵ=∣p0∣2p0p0=1=∣p0∣2p0−p1ϵ⊗(p0+p1ϵ)=∣p0∣2p0p0−p1p0ϵ+∣p0∣2p0p1ϵ=∣p0∣2p0p0=1
絶対値#
∣p^∣2∣p^∣=(p0+p1ϵ)(p0−p1ϵ)=∣p0∣2=∣p0∣単位双対複素数#
単位双対複素数の定義は
Cˇ1:={p^∈Cˇ∣∣p^∣=1}={eθi+p1ϵ∈Cˇ∣θ∈R,p1∈C}乗法の逆元は
(eθi+p1ϵ)−1=e−θi−p1ϵ補足
eθi=cos(θ)+sin(θ)i=cos(θ)−sin(θ)i=cos(−θ)+sin(−θ)i=e−θi
共役による Cˇ 上の Cˇ1 の作用#
C=R2 とし v∈C を 1+vϵ∈Cˇ と同一視すると p^=p0+p1ϵ∈Cˇ1 が剛体変換として作用する。
p^⋄(1+vϵ)=(p0+p1ϵ)(1+vϵ)(p0+p1ϵ)=(p0+p1ϵ)(p0+(p1+vp0)ϵ)=p0p0+(p0p1+p0vp0+p1p0)ϵ=∣p0∣2+(p02v+2p0p1)ϵ=1+(p02v+2p0p1)ϵ- p1=0
v∈C は p02v に写像される。 ∣p0∣=1 なので原点を中心に 2arg(p0) 回転をする。 - p0=1
v+2p1 の変位をする。
回転と変位の表現#
回転の表現は θ∈R とすると
p^rot=e2θi+0ϵp^rot⋄(1+vϵ)=(e2θi+0ϵ)⊗(1+vϵ)⊗(e2θi+0ϵ)=(e2θi+0ϵ)⊗(1+vϵ)⊗(e−2θi+0ϵ)=1+eθivϵ複素数の半角形式(スピノル表現)での回転について
eθiv=(e2θi)2v=e2θive2θiまた符号を反転しても同じ回転を表現する
(−e2θi)2=eθi
変位の表現は d∈C とすると
p^disp=1+2dϵp^disp⋄(1+vϵ)=(1+2dϵ)⊗(1+vϵ)⊗(1+2dϵ)=1+(v+d)ϵ
例
原点を中心に θ∈R 回転後に d∈C の変位を表現する変換
p^=p^disp⊗p^rot∈Cˇ1
d∈C の変位後に原点を中心に θ∈R 回転を表現する変換
p^=p^rot⊗p^disp∈Cˇ1
階層構造
p^=P^disp⊗P^rot⊗C^disp⊗C^rot∈Cˇ1
符号を反転した変換は符号を反転した回転による変換と同じになる。
+(p^disp⊗p^rot)=p^disp⊗p^−rot−p^disp⊗p^rotp^disp⊗p^−rot=−(1+2dϵ)⊗(e2θi+0ϵ)=−(e2θi+2de−2θiϵ)=(1+2dϵ)⊗(−e2θi+0ϵ)=−e2θi−2de−2θiϵ=−(e2θi+2de−2θiϵ)
−(p^rot⊗p^disp)=p^−rot⊗p^disp−(p^rot⊗p^disp)p^−rot⊗p^disp=−(e2θi+0ϵ)⊗(1+2dϵ)=−(e2θi+e2θi2dϵ)=(−e2θi+0ϵ)⊗(1+2dϵ)=−e2θi−e2θi2dϵ=−(e2θi+e2θi2dϵ)
よって符号を反転した変換は、元と同じ変換を表現する。
Dual complex number Linear Blending#
p^i∈Cˇ1,wi∈R とした補間を次のように定義。
DLB(p^1,⋯,p^n;w1,⋯,wn)=∣w1p^1+⋯+wnp^n∣w1p^1+⋯+wnp^n加重平均の正規化なので分母が 0 の場合は定義ができない。
正規化#
∣p^∣p^=∣p0∣p0+p1ϵ∣p^∣p^=∣p0∣p0=1
Spherical Linear interpolation#
p^∈Cˇ1 から q^∈Cˇ1 への h∈R での補間を次のように定義。
SLERP(p^,q^;h)=p^⊗(p^−1⊗q^)h=p^⊗exp(hlog(p^−1⊗q^))指数関数と対数関数#
指数関数
exp(p^)=exp(p0+p1ϵ)=exp(p0)+exp(p0)p1ϵ=exp(p0)(1+p1ϵ)対数関数
log(p^)=log(p0+p1ϵ)=log(p0)+p0p1ϵ性質
log(exp(p^))=exp(log(p^))=p^log(exp(p^))exp(log(p^))=log(exp(p0))+exp(p0)exp(p0)p1ϵ=p0+p1ϵ=p^=exp(log(p0))⊗(1+p0p1ϵ)=p0⊗(1+p0p1ϵ)=p0+p1ϵ=p^
回転と変位の表現で合成された変換を p^,q^∈Cˇ1 とする。
- なす角が180度を超えても最短円弧で補間をしない。
⟨p0,q0⟩<0 の時に一方の符号を反転 (SLERP(p^,−q^;h)) すると最短円弧での補間となる。
変換の行列表現#
積の行列表現#
p^=p0+p1ϵ,q^=q0+q1ϵ∈Cˇ の積は
p^⊗q^=(p0+p1ϵ)⊗(q0+q1ϵ)=p0⊗q0+(p0⊗q1+p1⊗q0)ϵ=(paqa−pbqb)+(paqb+pbqa)i+(paqc−pbqd+pcqa+pdqb)ϵ+(paqd+pbqc−pcqb+pdqa)iϵ成分計算は p^=(pa+pbi)+(pc+pdi)ϵ とした。
q^ に対し左から p^ をかける行列は
PLq=papbpcpd−pbpapd−pc00papb00−pbpaqaqbqcqdp^ に対し右から q^ を掛ける行列は
QRp=qaqbqcqd−qbqa−qdqc00qa−qb00qbqapapbpcpd変換の行列表現#
p^∈Cˇ1 での変換に対する次のような行列を考える。
p^⋄(1+vϵ)=(p0+p1ϵ)⊗(1+vϵ)⊗(p0+p1ϵ)=Mv=MLMRvM=MLMR=papbpcpd−pbpapd−pc00papb00−pbpapa−pbpcpdpbpa−pdpc00papb00−pbpa=papa+pbpbpbpa−papbpcpa−pdpb+papc−pbpdpdpa+pcpb+pbpc+papdpapb−pbpapbpb+papapcpb+pdpa−papd−pbpcpdpb−pcpa−pbpd+papc00papa−pbpbpbpa+papb00−papb−pbpa−pbpb+papa=pa2+pb202(papc−pbpd)2(papd+pbpc)0pa2+pb20000pa2−pb22papb00−2papbpa2−pb2=102(papc−pbpd)2(papd+pbpc)010000pa2−pb22papb00−2papbpa2−pb2=10Re(2p0p1)Im(2p0p1)010000Re(p02)Im(p02)00−Im(p02)Re(p02)ここで pa2+pb2=∣p0∣2=1 を利用した。
また Re,Im は実部と虚部とする。
Mv=10Re(2p0p1)Im(2p0p1)010000Re(p02)Im(p02)00−Im(p02)Re(p02)10xy=10Re(2p0p1)+Re(p02)x−Im(p02)yIm(2p0p1)+Im(p02)x+Re(p02)y
同次変換行列#
4次正方行列では都合が良くない場合もあるので2次元の同次変換行列にする。
M=Re(p02)Im(p02)0−Im(p02)Re(p02)0Re(2p0p1)Im(2p0p1)1Mv=Re(p02)Im(p02)0−Im(p02)Re(p02)0Re(2p0p1)Im(2p0p1)1xy1=Re(p02)x−Im(p02)y+Re(2p0p1)Im(p02)x+Re(p02)y+Im(2p0p1)1