チャートの描画
本資料では、グラフ理論におけるグラフと区別するためにデータを図示したものを チャート と呼ぶことにします。 Processing を用いた二次元チャートの描画について考えてみましょう。
例えば、を、の範囲で幅 600、高さ 600 のウィンドウに描画したいとします。 ここで、計算している空間と描画される画面の空間が異なることに注意しなければなりません。 それぞれの空間を 計算空間 と 画面空間 と呼ぶことにしましょう。
画面空間では左上が(0, 0)、右下が(width, height)であるのに対して、計算空間では左上が(-1, 1)、右下(1, -1)です。 Processing の描画命令は画面空間上の座標で行わなければいけないので、計算空間の座標を画面空間の座標に変換しなければいけません。 画面空間上での放物線 を 3 つのパラメータを用いて以下のように表しましょう。
この放物線は(width / 2, height / 2)を頂点とし、(0, 0)を通るので、はそれぞれ以下のように求まります。
これに基づいてチャートの描画をするプログラムを作成すると以下のようになります。
See the Pen コンピューティング2 演習misc-1-1 by Yosuke Onoue (@likr) on CodePen.
が、の範囲で正しく描画できていることが確認できます。
今回は二次関数だったので、画面空間上での一般式を導出することが容易でした。 どのような関数でも適用できるもう一つのアプローチとして、計算空間と画面空間の間の 座標変換 を考えてみましょう。
まずは一般的な議論として、一変数の座標変換を考えます。 からの範囲のをからの範囲のに変換します。 このとき、それぞれの範囲におけるとの比率は等しくなければいけません。 すなわち、 と の関係は以下のようになります。
これを整理した次式によっての空間の値をの空間の値へと変換することができます。
これを利用して、次式のように計算空間上の を画面空間上の へ対応付けることができます。
についても同様に、計算空間上の を画面空間上の へ対応付けることができます。
については、画面空間の上下が反転しているため、yBottom には height が、yTop には 0 が対応することに注意しましょう。
Processing では、 applyMatrix
関数を用いることで上述の座標変換を行うことができます。applyMatrix(a, b, c, d, e, f)
は次式で表される アフィン座標変換 を行います。
計算空間から画面空間への座標変換は アフィン変換を用いて次のように表されます。
applyMatrix(sx, 0, 0, sy, 0, 0)
と applyMatrix(1, 0, 0, 1, tx, ty)
はそれぞれショートカット関数の scale(sx, sy)
と translate(tx, ty)
を用いることができます。
座標変換を用いた二次関数の描画プログラムは以下のようになります。
See the Pen コンピューティング2 演習misc-1-2 by Yosuke Onoue (@likr) on CodePen.