Skip to content

Instantly share code, notes, and snippets.

@showa-yojyo
Last active December 12, 2021 15:28
Show Gist options
  • Save showa-yojyo/4d75e87988f1fc55b8747acfb6805397 to your computer and use it in GitHub Desktop.
Save showa-yojyo/4d75e87988f1fc55b8747acfb6805397 to your computer and use it in GitHub Desktop.
Some notes on various Shaping Functions by Golan Levin and Collaborators
title
Bezier and Other Parametric Shaping Functions ノート

Bezier and Other Parametric Shaping Functions - Golan Levin and Collaborators ノート。 区間 ${[0, 1]}$ を定義域とする Bezier 曲線を描く整形関数。

Quadratic Bezier

$$ \begin{aligned} y &= (1 - 2b)t^2 + 2bt,\quad \text{where}\\ t &= \frac{\sqrt{a^2 - (1 - 2a)x} - a}{1 - 2a}.\\ \end{aligned} $$

  • 二次 Bezier 曲線を単位正方形内の指定単一制御点 ${(a, b)}$ で定義する関数だ。
  • この関数は Double-Linear Interpolator と同じ入口傾斜、出口傾斜であることが保証される。 言い換えると、単位正方形内の端点における変化率をユーザーが正確に指定することができる曲線だ。

実装の急所

  • $a$ および $b$ を単位正方形内に制限すること。
  • $a = 1/2$ だと少々まずいようで、微小な正の数を加算してごまかす。
  • $1 - 2a$ がアルゴリズム中に二度現れるので、一次変数に値を格納しておく。

Cubic Bezier

三次 Bezier はコンピューターグラフィックスの主力だ。 デザイナーの多くは Adobe Illustrator などのベクトル主体の描画プログラムからそれを認識しているはずだ。

ここでは、この柔軟な曲線を信号整形機能として使用しており、 単位正方形内の二点 ${(a, b)}$, ${(c, d)}$ を制御点として指定する必要がある。

制御点二つを様々な位置に設定することで、Bezier 曲線は sigmoid, シート状関数、 ease-in, ease-out を生成するのに使用される。

Bezier 曲線は $y$$x$ がともに別の変数 $t$ の関数となるように定義されるのが普通だ。 $x$ の関数として $y$ を得るためには、まず逐次近似を用いて $t$ を解く必要があり、 コードが思ったよりも長くなる。

本文での実装は Don Lancaster 氏 の Bezmath Postscript library からの引用とある。

実装の急所:

  • 方程式を数値解析的手法で解く。Newton-Raphelson 法とコメントにある。

Cubic Bezier (Nearly) Through Two Given Points

この整形関数は、単位正方形内の二点をユーザーが指定することを要求する。 アルゴリズムは、これらの点をできるだけ通過する曲線を生成しようと試みる。 生成曲線が指定された二点を通過することが保証されてはいないが、ほとんどの場合にかなり接近している。

前項同様、本文での実装は Don Lancaster 氏からの引用とある。

実装の急所:

  • 前項の整形関数によって実装する。
title
Circular & Elliptical Shaping Functions ノート

Circular & Elliptical Shaping Functions - Golan Levin and Collaborators ノート。 区間 ${[0, 1]}$ を定義域とする、ある種の二次式の平方根を利用する整形関数が紹介されている。

Circular Interpolation: Ease-In and Ease-Out

$$ \begin{aligned} y &= 1 - \sqrt{1 - x^2}, && \text{ease-in interpolation},\\ y &= \sqrt{1 - (1 - x^2)}, && \text{ease-out interpolation}.\\ \end{aligned} $$

  • 素早くコードを書ける。
  • 平方根を使用しているため、計算効率は低い。

実装の急所:特になし。

Double-Circle Seat

$$ y = \begin{cases} \sqrt{a^2 - (x - a)^2}, && 0 \lt x \lt a,\\ 1 - \sqrt{(1 - a)^2 - (a - x)^2}, && a \le x \le 1.\\ \end{cases} $$

  • 円弧二つを水平方向の接線で結合した形。
  • 引数 $a$${(0, 1)}$ の範囲にあり、単位正方形の対角線沿いに曲線の変曲点の位置を決定する。

実装の急所

  • いつものように $a$ のチェックが必要。
  • あらかじめ平方関数を書いておく。

Double-Circle Sigmoid

$$ y = \begin{cases} a - \sqrt{a^2 - x^2}, && 0 \lt x \lt a,\\ a + \sqrt{(1 - a)^2 - (x - 1)^2}, && a \le x \le 1.\\ \end{cases} $$

  • この sigmoid な整形関数は、円弧二つが垂直方向の接線で結合されることで形成される。
  • 引数 $a$${(0, 1)}$ の範囲にあり、単位正方形の対角線沿いに曲線の変曲点の位置を決定する。

実装の急所は前項と同じ。

Double-Elliptic Seat

$$ y = \begin{cases} \dfrac{b}{a} \sqrt{a^2 - (x - a)^2}, && 0 \lt x \lt a,\\ 1 - \dfrac{1 - b}{1 - a} \sqrt{(1 - a)^2 - (x - a)^2}, && a \le x \le 1.\\ \end{cases} $$

  • このシート状の関数は、楕円弧二つが結合してできるもので、Double-Circle Seat の一般化だ。
  • 楕円弧二つが点 ${(a, b)}$ で水平方向の接線で結合されている。

実装の急所は前項と同じ。

Double-Elliptic Sigmoid

$$ y = \begin{cases} b \left(1 - \dfrac{\sqrt{a^2 - x^2} }{a} \right), && 0 \lt x \lt a,\\ b + \dfrac{1 - b}{1 - a} \sqrt{(1 - a)^2 - (x - 1)^2}, && a \le x \le 1.\\ \end{cases} $$

  • この sigmoid な関数は、楕円弧二つが結合してできており、Double-Circle Sigmoid の一般化だ。
  • 楕円弧二つが点 ${(a, b)}$ で垂直方向の接線で結合されている。

実装の急所は前項と同じ。

Double-Linear with Circular Fillet

この節には二本の直線を指定半径でフィレット処理するときのアルゴリズムが記述されている。 今回の目的には使わないのでノートを取らない。

Circular Arc Through a Given Point

この節には指定された三点を通過する円の作図アルゴリズムが記述されている。 今回の目的には使わないのでノートを取らない。

title
Exponential Shaping Functions ノート

Exponential Shaping Functions - Golan Levin and Collaborators ノート。 区間 ${[0, 1]}$ を定義域とする指数関数型の整形関数が紹介されている。

Exponential Ease-In and Ease-Out

$$ y = x^{a}. $$

いちばん一般的な指数関数だ。ここで定数 $a \gt 0$ とする。$0 \lt a \lt 1$ の整形曲線を ease-out, $1 \lt a$ のそれを ease-in と呼ぶ。

この関数整形機能の実装では、制御引数 $a$ により、設計者は関数を ease-out 形式から ease-in 形式へと変化させることができる。

実装の急所:

  • 引数リストは (float x, float a) とする。
  • いつものように入力 a の検証なり fail-safe 処理が要る。
  • 実装例では a を拡縮して曲線を強調する工夫がなされている(が、初めは真似しないほうが無難)。

Double-Exponential Seat

$$ y = \begin{cases} \dfrac{(2x)^a}{2}, & 0 \lt a \lt 0.5,\\ 1 - \dfrac{(2(1 - x))^a}{2}, & 0.5 \le a \lt 1. \end{cases} $$

  • 指数関数を二つ結合してシート状の関数を作る。
  • 三次関数よりもきれいな導関数を持ち、より連続的な制御を行うことができる。
  • CPU サイクルは高く付く。
  • 制御引数 $a$ の推奨範囲は ${(0, 1)}$ だ。
  • これらの式は、後述の二重指数 sigmoid とよく似ている。

実装の急所:前項と同じ。

感想:コードにおける指数が数式と異なる。$1 - a$ になっている。

Double-Exponential Sigmoid

$$ y = \begin{cases} \dfrac{(2x)^{1/a} }{2}, & 0 \lt a \lt 0.5,\\ 1 - \dfrac{(2(1 - x))^{1/a} }{2}, & 0.5 \le a \lt 1. \end{cases} $$

  • 本質的には前項の数式と同じ。同じようにニ倍にして反転させる方法を用いる。
  • 制御引数 $a$$(0, 1)$ の間で連続的に変化させることができるという利点があり、 コントラストを調整する関数としてたいへん有用だ。
  • 多項式 sigmoid よりも計算コストが高く付く。
  • 二重指数シグモイドは $a \approx 0.426$ のとき、 Raised Inverted Cosine を 1 パーセント以内で近似する。

実装の急所:前項と同じ。

感想:コードにおける指数が数式と異なる。$1 - a$ になっている。

The Logistic Sigmoid

いわゆる logistic 曲線は、有機物の成長やその他多くの自然現象をよく表していると多くの科学者が信じているエレガントな sigmoid 関数だ。

$$ y = \cfrac{\cfrac{1}{1 + \mathbb{e}^{-2a(x - 1/2)} } - \cfrac{1}{1 + \mathbb{e}^{a}} } {\cfrac{1}{1 + \mathbb{e}^{-a} } - \cfrac{1}{1 + \mathbb{e}^{a} } }. $$

  • ソフトウェア工学では、ニューラルネットワークの信号応答関数の重み付けにしばしば用いられる。
  • 引数 $a$ は成長率と考えられる。曲線の立ち上がり部分の傾きを調整する。 ${a = 0}$ の場合、この logistic 関数は恒等関数に縮退する。
  • ひじょうに自然な変化率。
  • 指数関数を多用するので計算コストが高く付く。

実装の急所

  • 引数 $a$ に関する注意点はいつもどおり。
  • 分母と分子の第二項は共通なので、一度しか計算しないこと。
title
Polynomial Shaping Functions ノート

Polynomial Shaping Functions - Golan Levin and Collaborators ノート。 区間 ${[0, 1]}$ を定義域とする多項式整形関数が紹介されている。

Blinn-Wyvill Approximation to the Raised Inverted Cosine

$$ y = \frac{4}{9} x^6 - \frac{7}{9} x^4 + \frac{12}{9} x^2. $$

  • 秒間数百万回もの $\cos$, $\sin$ の演算が必要な場合に、より単純な近似式で代用して計算コストの削減を図りたい。 その例として、Blinn-Wyvill 多項式近似による Raised Inverted Cosine がある。
  • この近似多項式には次のような性質がある。
    • $x = 0, 1$ で導関数の値がゼロとなる(要確認)。
    • $x = 0.5$ で値が 0.5 となる(要確認)。
    • 比較的効率的に計算できる。
    • オリジナルの Raised Inverted Cosine とは異なり、無限の導関数がない。
  • この関数は、速度や演算能力に制限のある小型マイクロプロセッサーで有用だ。

実装の急所:

  • $x^2$, $x^4$, $x^6$ をこの順に計算すること。直前に得たべき乗の値を乗算する。

感想:

  • 余弦関数だが Inverted であるので、原点での値が 1 ではなく 0 となる。
  • おそらく定義域 ${[0, \pi/2]}$ が正規化されている。

Double-Cubic Seat

$$ y = \begin{cases} b - b \left(1 - \dfrac{x}{a}\right)^3,& 0 \le x < a,\\ b + \left(1 - b\right)\left(\dfrac{x - a}{1 - a}\right)^3, & a \le x \le 1. \end{cases} $$

このシート状の関数は、三次多項式二つを結合して形成される。 部分曲線同士は制御座標 ${(a, b)}$ において水平方向に接続するように変曲点を持つ。

実装の急所:

  • 引数は (float x, float a, float b) となる。
  • 引数 a, b のチェックをする必要があるだろう。
  • 本文では関数 pow でべき乗を計算しているが、自然数乗だから演算子 * のほうがいい可能性がある? ここは別途調査したい。

Double-Cubic Seat with Linear Blend

$$ y = \begin{cases} bx - (1 - b) a \left(1 - \left(1 - \dfrac{x}{a}\right)\right)^3,& 0 \le x < a,\\ bx + \left(1 - b\right)\left(a + \left(1 - a\right)\left(\dfrac{x - a}{1 - a}\right)^3\right), & a \le x \le 1. \end{cases} $$

  • 前項関数の改良版で、単位正方形の対角線に沿った変曲点の位置を単一の変数で制御する。
  • それに加え、この曲線を恒等関数 ${y = x}$ と混合するためにもう一つ変数がある。 ここでは、変数 b を使用してこの混合量を制御し、変曲点近傍の曲線の 傾きを変える効果がある。
  • 変曲点付近の平坦化を調整できるので、等間隔のデータを拡大する際などに便利だ。

実装の急所は前項と同じ。

感想:

  • おぼえにくい。

Double-Odd-Polynomial Seat

$$ y = \begin{cases} b - b \left(1 - \dfrac{x}{a}\right)^{2n + 1},& 0 \le x < a,\\ b + \left(1 - b\right)\left(\dfrac{x - a}{1 - a}\right)^{2n + 1}, & a \le x \le 1. \end{cases} $$

  • 先述の Double-Cubic Seat 関数は、任意の奇数整数の指数を使用する形式に一般化できる。
  • 三次関数や五次関数などの奇数次数の多項式は、シート状の曲線を作るのにひじょうに自然な形で適している。
    • 引数 a によって恒等関数とパラメトリックに混合される。
    • ${(0, 0)}$${(1, 1)}$ を通過する。
    • 中間点 ${(0.5, 0.5)}$ を対称的に通過する。
    • 比較的効率的に計算することができる。

実装の急所

  • 引数リストは (float x, float a, float b, int n) のようになる。
  • 引数 n は、点 ${(a, b)}$ 付近の台地状区間の平坦さ、つまり幅を制御する。
  • n の範囲は 1 からだいたい 20 までの整数の集合が良いとある。

Symmetric Double-Polynomial Sigmoids

$$ y = \begin{cases} \dfrac{(2x)^{2n} }{2}, & 0 \le x \lt 0.5,\\ 1 - \dfrac{(2x - 2)^{2n} }{2}, & 0.5 \le x \lt 1. \end{cases} $$

$$ y = \begin{cases} \dfrac{(2x)^{2n + 1} }{2}, & 0 \le x \lt 0.5,\\ 1 + \dfrac{(2x - 2)^{2n + 1} }{2}, & 0.5 \le x \lt 1. \end{cases} $$

単位正方形の中心に対称的な多項式のペアを結合することでシグモイドパターンを生成する。 これらの方程式の指数 n は、つぶれた値と盛り上がった値を分ける壁の急峻さを制御する。

  • 整数 n の推奨範囲は 1 から約 10 だ。
  • これらの中では二次のシグモイドが Raised Inverted Cosine に最も近い。 2.8 パーセント以内で近似している。

ここで紹介する対称二重多項式シグモイドは、0 と 1 に平らな接線を持つ S 字型をしており(関数名の由来)、 ${f(0.5) = 0.5}$ という特別な性質がある。 偶数べきシグモイドと奇数べきの場合とでは、少し異なる方程式のペアが必要になる。

Quadratic Through a Given Point

$$ y = \left(\frac{1 - b}{1 - a} - \frac{b}{a}\right) x^2

  • \frac{1}{a} \left(a^2 - \left(\frac{1 - b}{1 - a} - \frac{b}{a}\right) - b\right)x. $$

この関数は、単位正方形内の点 ${(a, b)}$ を通り、座標軸に揃う放物線を定義する。

注意。単位正方形内のすべての点が $(0, 0)$$(1, 1)$ の位置を通る曲線になるとは限らない。一様収束?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment