Skip to content

*)各種変換

最終更新日時: 2025年08月25日 12:57

  • Ripple/Wave Distortionが理解できない

  • multiの変数のマッピング方法などが理解できていない

  • 実装確認

    • 射影変換
    • 指数変換・対数変換
    • 円反転
    • べき写像
    • リフレクション(つまらなそうなのでやらない)
    • スワール変換
    • ツワール変換
    • フィッシュアイ変換
    • ピンチ変換
    • リップル変換
    • ドロステ変換
    • ハウスホルダー反射
    • 双曲線回転/ローレンツ変換で現れる。拡張・ワープなどに応用。
    • ケイリー変換
    • バイリニア変換(メビウス変換)
    • Z変換
    • ラプラス変換
    • メルリン変換
    • ヒルベルト変換
    • パラメータせん断変換
    • 極座標変換
    • バイケル変換/カオス的混合を示す1次元写像
    • ヘノン写像/2次元力学系のカオスアトラクタを生む写像
    • ニュートン反復
    • [ ]

  • 実装あり
    • repository = g-sandbox
    • branch = multi

GLSLで uv (2D座標) を原点からの距離と角度の値をもとに図形を歪ませる際に便利な変換を10種挙げる。

極座標系での変換を念頭に現在のr,θr,\thetaを下記のように定義し、 変換先のr,θr', \theta'を新たに求める式を複数掲載する。

r=uv.x2+uv.y2θ=atan2(uv.y, uv.x),θ=f(r,θ)r=g(r,θ)uv=r(cosθ,sinθ)\begin{aligned} &r &=& \sqrt{uv.x^2 + uv.y^2}\\ &\theta &=& \mathrm{atan2}(uv.y,\ uv.x), \\ &\theta' &=& f(r, \theta)\\ &r' &=& g(r, \theta)\\ &\text{uv}' &=& r' \bigl(\cos \theta',\,\sin \theta'\bigr) \end{aligned}

f(r,θ),g(r,θ)f(r,\theta),g(r,\theta)を定義することがここで述べる変換の本質となる。 fragment shaderでは、直交座標系から極座標系に変換し、r,θr',\theta'を求めるため、 全ての変換は本質的に下記のプロセスで変換する

varying vec2 vUv; //vertex shaderのuvからfragment shaderに引き継ぐ
cartesianToPolar(uv, r, theta); //極座標変換
... //変換処理で、rPrime(r')とthetaPrime(theta')を求める
vec2 uvPrime = polarToCartesian(rPrime, thetaPrime); //直交座標変換
gl_FragColor = texture2D(uTexture, uvPrime); //書き込む
  • 原点付近を中心に回転とズームを同時に行う
  • k 回転の強さ
  • α スケール
  • ε 原点の0を避けている小さな値
  • ω,t\omega,t の項を入れるとアニメーション可能
f(θ,r)=θ=θ+k(log(r+ϵ)+ωt),g(θ,r)=r=αr,\begin{aligned} f(\theta,r) &= \theta' = \theta + k\,(\log(r + \epsilon) + \omega\,t),\\ g(\theta,r) &= r' = \alpha \cdot r, \\ \end{aligned}
  • 中心から離れるほど回転量を増やす渦巻き効果
  • \beta を調整すると非線形なねじれが生まれる
  • f(t,ω)f(t, \omega) の項を入れるとアニメーション可能(f(t,ω)=sin(ωt)f(t,\omega)=sin(\omega t)など)
f(θ,r)=θ=θ+amountrβf(t,ω)g(θ,r)=r=r\begin{aligned} f(\theta,r) &= \theta' = \theta + \mathrm{amount}\cdot r^\beta \cdot f(t,\omega) \\ g(\theta,r) &= r'=r \end{aligned}
  • 原点付近を引き絞る(Pinch)または膨らませる(Punch)
  • α>1\alpha>1 で中心付近縮小,α<1\alpha<1 で拡大
  • 例えば、α\alphaを時間の関数にするとアニメーションになる
f(θ,r)=θ=θg(θ,r)=r=rα\begin{aligned} f(\theta,r) &= \theta' = \theta\\ g(\theta,r) &= r' = r^\alpha \end{aligned}
  • 角度を sin -> cos でネストして非線形歪み
  • 例: cos(sin(\theta)) を振幅に掛けて,波打つようなパターンを作る
f(θ,r)=θ=cos(sin(θ)freq1)freq2g(θ,r)=r=rα\begin{aligned} f(\theta,r) &= \theta' = \cos(\sin(\theta)\cdot \mathrm{freq1}) \cdot \mathrm{freq2} \\ g(\theta,r) &= r' = r^\alpha \end{aligned}
  • A,B 振幅,\omega 周波数,\phi 位相
  • 格子全体が波打つような効果
x=uv.x+Asin(ωuv.y+ϕ),y=uv.y+Bsin(ωuv.x+ϕ)\begin{aligned} x' &= uv.x + A \cdot \sin(\omega \cdot uv.y + \phi), \\ y' &= uv.y + B \cdot \sin(\omega \cdot uv.x + \phi) \end{aligned}
  • 半径方向に正弦歪み,かつ回転を掛ける複合エフェクト
  • 中心付近でトリッキーなうねりを生む
r=r+αsin(βθ)θ=θ+kr\begin{aligned} r' &= r + \alpha \sin(\beta\,\theta) \\ \theta' &= \theta + k\,r \end{aligned}
  • 時間 t によるズーム + 回転を組み合わせ
  • アニメーション時に渦巻きが連続的に拡大・縮小
r=r(1+δt)θ=θ+kt\begin{aligned} r' &= r \cdot (1 + \delta \, t) \\ \theta' &= \theta + k \, t \end{aligned}
  • uv.x に対して sin を掛け足す,uv.y に対して cos を掛け足す
  • 縦横で違う周期や振幅を与えて歪みを作る
x=uv.x+ampXsin(freqXuv.x)y=uv.y+ampYcos(freqYuv.y)\begin{aligned} x' &= uv.x + \mathrm{ampX}\,\sin\bigl(\mathrm{freqX}\,uv.x\bigr) \\ y' &= uv.y + \mathrm{ampY}\,\cos\bigl(\mathrm{freqY}\,uv.y\bigr) \end{aligned}
  • 半径が大きいほど回転角が小さくなる (指数減衰)
  • 中心部を強くねじり,外側は緩やか
θ=θ+αexp(βr),\begin{aligned} \theta' &= \theta + \alpha \,\exp(-\,\beta\,r), \\ \end{aligned}
  • 距離に応じた2種類の回転要素 (線形 + 対数) を重ねる
  • さらに r' によるズーム因子 \gamma を導入
  • 中心付近と外側とで異なる渦のかかり方
θ=θ+k1r+k2log(r+ϵ)r=rγ\begin{aligned} \theta' &= \theta + k_1\,r + k_2\,\log(r + \epsilon) \\ r' &= r\,\gamma \\ \end{aligned}

行列 AA と並進ベクトル b\mathbf{b} による線形変換と平行移動の合成。拡大縮小、回転、せん断、平行移動

(xy)=A(xy)+b\begin{pmatrix} x' \\ y' \end{pmatrix} = A \begin{pmatrix} x \\ y \end{pmatrix} + \mathbf{b}

斜めに写された写真を正面から写したように変換する

(xy1)    H(xy1)\begin{pmatrix} x'\\ y'\\ 1 \end{pmatrix} \;\propto\; H \begin{pmatrix} x\\ y\\ 1 \end{pmatrix}

中心原点・半径 rr の円での反転 (複素数表現)。内側と外側が反転し、円周はそのまま

w  =  r2zw \;=\;\frac{r^2}{\overline{z}}
  • 指数変換は帯状領域を円環領域に、対数変換は円環領域を帯状領域へ
  • 対数関数は多価性を持つ
{w=ez=ex+iy=ex(cosy+isiny)w=logz=logz+iargz\left\{ \, \begin{aligned} w & = e^z = e^{x+iy} = e^x(\cos y + i \sin y)\\ w & = \log z = \log|z| + i\,\arg z \end{aligned}\right.

複素数の極座標表示 (r,θ)(rα,αθ)(r,\theta)\mapsto (r^\alpha,\alpha\theta)。フラクタル生成や歪みエフェクト

w=zαw = z^\alpha

実軸反射の例(複素共役)。円・直線に対する反射

z    zz \;\mapsto\; \overline{z}

渦巻き状の歪み。中心からの距離に応じて回転角を大きくする

{x=xcosϕysinϕ,y=xsinϕ+ycosϕ(ϕ=kr2,  r=x2+y2)\begin{cases} x' = x\cos\phi - y\sin\phi,\\ y' = x\sin\phi + y\cos\phi \end{cases} \quad (\phi = k\,r^2,\; r=\sqrt{x^2+y^2})

渦巻き状のねじれ。極座標で回転角を半径に比例させる。

θ=θ+kr\theta' = \theta + k\,r

2次元極座標における半径変換。中心付近拡大、周辺圧縮の魚眼レンズ効果

r=αtan(βr)r' = \alpha\,\tan(\beta\,r)

中心付近をつぶす・膨らませる歪み。p>1p>1 で収縮, p<1p<1 で拡大

r=rpr' = r^p {x=x+Asin(ωy),y=y+Bsin(ωx)\begin{cases} x' = x + A\sin(\omega y),\\ y' = y + B\sin(\omega x) \end{cases}

画像を波打たせる歪み 波動状の効果

  • 複素平面上でのzzz \rarr z'への変換
  • 三段階(対数変換・平行移動/回転・指数変換)を繰り返し適用することでフラクタル状の効果を生む変換
w=loge(z)w = \log_{e}(z)

step2. 平行移動と回転・スケーリング

Section titled “step2. 平行移動と回転・スケーリング”
w=a+bww' = a + b\,w
  • a=α+iβa = \alpha + i\,\beta
  • b=ρeiθb = \rho\,e^{i\,\theta}
  • ρ>0\rho > 0 は拡大縮小率、θ\theta は回転角

zz' をふたたび通常空間に戻す

z=ewz' = e^{\,w'}
  • a=0a = 0
  • b=0.9ei0.3b = 0.9\, e^{\,i\,0.3}
  • ρ=0.9, θ=0.3\rho = 0.9, \ \theta = 0.3
  • わずかに縮小しながら回転する自己相似パターンが出現

例2:中心をずらした自己相似形

Section titled “例2:中心をずらした自己相似形”
  • a=0.3+i0.2a = 0.3 + i\,0.2
  • b=0.8ei0.5b = 0.8\, e^{\,i\,0.5}
  • ρ=0.8, θ=0.5\rho = 0.8, \ \theta = 0.5
  • 中心をずらしつつ回転・縮小を繰り返し、ずれた中心を軸とする自己相似形が形成

ベクトルu\mathbf{u}に対する鏡映。任意の超平面に対する反射を実現

x=x2uTxuTuu\mathbf{x}' = \mathbf{x} - 2\,\frac{\mathbf{u}^\mathsf{T}\mathbf{x}}{\mathbf{u}^\mathsf{T}\mathbf{u}}\,\mathbf{u}

ローレンツ変換で現れる。拡張・ワープなどに応用。

(xy)=(coshαsinhαsinhαcoshα)(xy)\begin{pmatrix} x'\\ y' \end{pmatrix} = \begin{pmatrix} \cosh \alpha & \sinh \alpha\\ \sinh \alpha & \cosh \alpha \end{pmatrix} \begin{pmatrix} x\\ y \end{pmatrix}

上半平面と単位円を等角写像。双曲幾何などで重要

w=ziz+iw = \frac{z - i}{z + i}

制御理論やDSPで ss-zz変換に用いられる。メビウス変換の特別な形。

w=az+bcz+dw = \frac{a z + b}{c z + d}

スケーリング不変性をもつ積分変換 画像認識やスケール解析に応用例

M{f(x)}(s)=0xs1f(x)dx\mathcal{M}\{f(x)\}(s) = \int_{0}^{\infty} x^{s-1} f(x)\,dx

平行四辺形化の歪みを与える アフィン変換の部分要素

(xy)=(1k01)(xy)\begin{pmatrix} x'\\ y' \end{pmatrix} = \begin{pmatrix} 1 & k\\ 0 & 1 \end{pmatrix} \begin{pmatrix} x\\ y \end{pmatrix}

円形パターンや回転対称表現で便利

{r=x2+y2,θ=atan2(y,x){x=rcosθ,y=rsinθ\begin{cases} r = \sqrt{x^2 + y^2},\\ \theta=\mathrm{atan2}(y,x) \end{cases} \quad\longleftrightarrow\quad \begin{cases} x = r\cos\theta,\\ y = r\sin\theta \end{cases}

カオス的混合を示す1次元写像 フラクタル理論・エントロピー解析

B(x)={2x,0x<0.5,22x,0.5x<1B(x)= \begin{cases} 2x,& 0\le x<0.5,\\ 2 - 2x,&0.5\le x<1 \end{cases}

2次元力学系のカオスアトラクタを生む写像

{xn+1=yn+1axn2,yn+1=bxn\begin{cases} x_{n+1} = y_n + 1 - a\,x_n^2,\\ y_{n+1} = b\,x_n \end{cases}

方程式の数値解法、繰り返し描画でNewtonフラクタを生成

zn+1=znf(zn)f(zn)z_{n+1} = z_n - \frac{f(z_n)}{f'(z_n)} F{f(x)}(u)=eiπλzx2f(ξ)eiπλz(ξx)2dξF\{f(x)\}(u) = e^{\,i\frac{\pi}{\lambda z}x^2} \int_{-\infty}^{\infty} f(\xi)\, e^{\,i\frac{\pi}{\lambda z}(\xi - x)^2} \,d\xi

光学系の回折・干渉計算に登場 波動光学シミュレーション

Rkf^(ξ)=iξkξf^(ξ)\widehat{R_k f}(\xi) = i\,\frac{\xi_k}{\|\xi\|}\,\hat{f}(\xi)

多次元信号の微分特性や方向成分抽出に使われる 画像勾配評価など

CR(z;z1,z2,z3,z4)=(zz1)(z2z3)(zz3)(z2z1)\mathrm{CR}(z; z_1,z_2,z_3,z_4) = \frac{(z - z_1)(z_2 - z_3)}{(z - z_3)(z_2 - z_1)}

4点で定義される射影不変量 透視歪み補正などで応用

Gf(x,ω)=f(t)e(tx)22σ2eiωtdtG_f(x,\omega) = \int_{-\infty}^{\infty} f(t)\, e^{- \frac{(t - x)^2}{2\sigma^2}} \,e^{-\,i\omega t} \,dt

時間-周波数局在化の解析 音声・画像のローカル周波数分析

z    αz+βγz+δ(αδβγ0)z \;\mapsto\; \frac{\alpha\,z + \beta}{\gamma\,z + \delta} \quad (\alpha\delta - \beta\gamma \neq 0)

メビウス変換の一形態 円を円に写す等角写像

ρ=xcosθ+ysinθ\rho = x\cos\theta + y\sin\theta

画像空間上の直線・曲線をパラメータ空間で検出 エッジ抽出・形状解析

R{f}(ρ,θ)=f(ρcosθtsinθ,ρsinθ+tcosθ)dtR\{f\}(\rho,\theta) = \int_{-\infty}^{\infty} f(\rho\cos\theta - t\sin\theta,\, \rho\sin\theta + t\cos\theta)\,dt

2D関数を直線積分で表す CTスキャンなど断層画像再構成に必須

Sf(τ,ω)=f(t)12πσ(τ)e(tτ)22σ(τ)2eiωtdtS_f(\tau,\omega) = \int_{-\infty}^{\infty} f(t)\, \frac{1}{\sqrt{2\pi}\,\sigma(\tau)}\, e^{-\frac{(t-\tau)^2}{2\sigma(\tau)^2}} \,e^{-\,i\,\omega\,t} \,dt

ウェーブレットとSTFTを合わせたような時間周波数解析 局所化と周波数解像度の両立

アポロニアンガスクローク変換

Section titled “アポロニアンガスクローク変換”

具体的完全式は複雑 異なるサイズの円を連鎖的に埋め込む ロジックはアポロニウス円束の変換に基づく

ヌッジド・エラスティック・バンド (NEB) 変換

Section titled “ヌッジド・エラスティック・バンド (NEB) 変換”

固体物理や化学反応経路探索のアルゴリズムでの写像発想 バンド(一連の状態)をエネルギー勾配で変形 数学的には座標系を補間しながら最短経路を求める



f^(k)=f(x)e2πikxdx\hat{f}(k) = \int_{-\infty}^{\infty} f(x)\,e^{-2\pi i k x} \,dx

時空間と周波数空間の間を結ぶ代表的積分変換

Fu,v=α(u)α(v)x=0N1y=0M1fx,ycos[π(2x+1)u2N]cos[π(2y+1)v2M]F_{u,v} = \alpha(u)\,\alpha(v) \sum_{x=0}^{N-1} \sum_{y=0}^{M-1} f_{x,y} \cos\Bigl[ \frac{\pi(2x+1)u}{2N} \Bigr] \cos\Bigl[ \frac{\pi(2y+1)v}{2M} \Bigr]

JPEGなど画像圧縮の基礎

Wf(a,b)=1af(x)ψ ⁣(xba)dxW_f(a,b) = \frac{1}{\sqrt{|a|}} \int_{-\infty}^{\infty} f(x)\, \psi\!\Bigl(\frac{x - b}{a}\Bigr) \,dx

局所的周波数成分解析 多重解像度解析やノイズ除去で活躍

実部・虚部の関係を構築 信号の包絡線や瞬時位相に利用

H{f}(t)=1πP.V.f(τ)tτdτ\mathcal{H}\{f\}(t) = \frac{1}{\pi} \,\mathrm{P.V.} \int_{-\infty}^{\infty} \frac{f(\tau)}{t-\tau} \,d\tau

離散信号を多項式表現する変換。フィルタ設計などで必須。

X(z)=n=0xnznX(z) = \sum_{n=0}^{\infty} x_n \, z^{-n}

連続信号の解析や微分方程式解法に用いられる GLSLには直接関係薄いが数理基礎

L{f(t)}(s)=0estf(t)dt\mathcal{L}\{f(t)\}(s) = \int_{0}^{\infty} e^{-st} f(t)\,dt
  • 地図投影のユースケース - リーマン球面からの変換
    • 平面図形を複素平面上の図形だとみなし、それをメビウス変換する。
    • メビウス変換された図研は複素平面上に投影される
    • 複素平面上の図形をリーマン球面に投影する
    • リーマン球面を地図投影で四角形に再投影する
    • それをpngファイルに落とす
      • g-sandboxのbranch 8で大方実装。メビウス変換のパラメータもJSONで入出力可能
      • 水面の歪みよりかなり激しく歪んだ状態
      • ランベルト正積図法で実装しているはず

地理座標(経度λ\lambda,緯度ϕ\phi)を等角投影。高緯度ほど拡大

{x=λ,y=ln ⁣(tan(π4+ϕ2))\begin{cases} x = \lambda,\\ y = \ln\!\bigl(\tan(\tfrac{\pi}{4} + \tfrac{\phi}{2})\bigr) \end{cases}
vec2 mercatorProjection(vec2 lonLat) {
float x = lonLat.x / 3.141592653589793;
float y = log(tan(3.141592653589793 / 4.0 + lonLat.y / 2.0)) / 3.141592653589793;
return vec2(x, y);
}

球面上の点を正投影 (地図投影の一種)。中心からの直線を平面に下ろす

{x=cosϕcosθ,y=cosϕsinθ\begin{cases} x = \cos\phi\,\cos\theta,\\ y = \cos\phi\,\sin\theta \end{cases}
vec2 orthographicProjection(vec3 spherePos) {
return spherePos.xy;
}

面積を保つ地図投影。緯度ϕ\phi、基準緯度ϕ0\phi_0、経度λ\lambda

{x=λcosϕ0,y=sinϕ\begin{cases} x = \lambda\,\cos\phi_0,\\ y = \sin \phi \end{cases}
vec2 lambertProjection(vec2 lonLat) {
float x = lonLat.x / 3.141592653589793;
float y = sin(lonLat.y);
return vec2(x, y);
}

(xy1)    H(xy1)\begin{pmatrix} x'\\ y'\\ 1 \end{pmatrix} \;\propto\; H \begin{pmatrix} x\\ y\\ 1 \end{pmatrix}

ここで行列 HH は 3×3 の実(または複素)行列で、同次座標を使った写像を表す。 「\propto」は同次座標系ではスカラー倍が同じ点を表すことを意味する。

1. HH の具体形とコードへの落とし方

Section titled “1. HHH の具体形とコードへの落とし方”
  • 一般的な 2D 射影変換は、3×3 行列
H=(h11h12h13h21h22h23h31h32h33)H = \begin{pmatrix} h_{11} & h_{12} & h_{13}\\ h_{21} & h_{22} & h_{23}\\ h_{31} & h_{32} & h_{33} \end{pmatrix}

を用いて定義される。

  • 射影変換をプログラムで実装するときは、通常「行列 × ベクトル」の形で計算し、最後に「同次座標の正規化」を行う。
  • 座標 (x,y)(x, y) を拡張して (x,y,1)(x, y, 1) とし、これに HH をかける:
vec3 p = H * vec3(x, y, 1.0); // Hはmat3型(もしくはmat3x3)
// p.xy は [x', y']の同次座標
// p.z が 0 でないことを仮定
// 同次座標の正規化
float w = p.z;
// 実際の (x', y') は (p.x / w, p.y / w)
  • GLSL 例:
// uniform mat3 H;
vec3 p_in= vec3(x, y, 1.0);
vec3 p_out = H * p_in;
// p_out.z != 0 であると仮定
vec2 xy_out = p_out.xy / p_out.z;
  • これにより (x, y)(x'/w, y'/w) となる。
  • 視点変換や四隅指定による画像の台形補正、遠近法などに応用できる。

バイリニア変換とメビウス変換・アポロニウス変換

Section titled “バイリニア変換とメビウス変換・アポロニウス変換”

メビウス変換 (Mobius transformation) は、複素数平面上で

w  =  az+bcz+d(  adbc0  )w \;=\; \frac{a\,z + b}{c\,z + d} \quad (\;ad - bc \neq 0\;)

の形をとる写像。

  • 複素平面上で「直線・円を直線・円へ写す」という特徴を持つ (「円・直線の保存」)。
  • パラメータ (a,b,c,d)(a, b, c, d) は複素数でもよく、実の場合は実平面内での円(または直線)を保つ。
  • 等角写像となる場合が多く、球面(リーマン面)との対応などでも基本的。

アポロニウス変換 (Apollonius transformation) も

z    αz+βγz+δz \;\mapsto\; \frac{\alpha\,z + \beta}{\gamma\,z + \delta}

という メビウス変換の一種。 文献によっては「円を別の円に写す変換」を指してアポロニウス変換と呼ぶが、実は メビウス変換全般 が「円や直線を円か直線に写す」性質を持つため、両者はほぼ同じ範疇。

  • 場合によっては「ある特定の実数制約」(実軸上の2点を不動点にする など) を課したメビウス変換をアポロニウス変換と呼ぶこともある。
  • よって「アポロニウス変換 ⊂ メビウス変換」と理解してよい。

「バイリニア変換 (Bilinear transform)」は、制御理論や信号処理 (特に ss-zz変換) で有名な

w  =  az+bcz+dw \;=\; \frac{a\,z + b}{c\,z + d}

の形を指す。

  • 数学的には「メビウス変換」と同じ形式 (係数 a,b,c,da,b,c,d が実数の場合が多い)。
  • 特に 信号処理 において、「ss-平面」(連続系) と「zz-平面」(離散系) を対応させる変換として使われる場合に「バイリニア変換」と呼ぶ。
  • たとえば s=1z11+z12Ts = \frac{1 - z^{-1}}{1 + z^{-1}}\cdot \frac{2}{T} などと書いた形も「メビウス変換」の部分的実装例。
  • メビウス変換:複素数平面全体で円・直線を円・直線へ写す,一般の等角写像
  • アポロニウス変換:メビウス変換の中でも「特定の条件下で円を円に写す」と強調するときの呼び方 (本質的には同じ)
  • バイリニア変換:応用分野(信号処理など)で「メビウス変換の係数が実数 or ラプラス変数との対応が決まっている」場合の呼称。式そのものはメビウスと同型だが,「zzss」の関係に特化しているところが「特別」

結局のところ,

  • 式: w=(az+b)/(cz+d)w = (a\,z + b)/(c\,z + d)
  • 総称: メビウス変換 (特に複素解析)
  • 別名: アポロニウス変換 (幾何学的性質を強調)
  • バイリニア変換: 信号処理・制御分野での実数係数版の実用呼称

同じ枠組みだが,「どの観点(幾何学・複素解析・制御理論)で見るか」で名称が変わっている。