ワタタク
今回の記事の目的はProcessingの「norm()
関数」を理解し、自分なりに使ってみること。
目次
【Processing】norm()関数について
norm()関数について
- normは「規範」や「標準」という意味
norm()
関数は特定の範囲の数値を0~1にする- 正規化という
- 書くときはfloatを使う
- もう少し詳しく解説
norm()
関数はある範囲内の数値を0から1の範囲に変換して、その範囲内の相対的位置(意味後述)を示す- 数値50が0から100の範囲にあるとき、50はその範囲の真ん中にあります。これをnorm()関数で表すと、0から100を0.0から1.0に変換しているので「0.5」となります。この「0.5」は、50が0から100の範囲内で真ん中に位置することを意味しています。
- 相対的な位置というのは、ある物や数値が他の物や数値に対してどこにあるかを示すもの
- 人が3人で列に並んでいるとする。前にいる人は「1番目」、真ん中の人が「2番目」、後ろにいる人が「3番目」だとします。ここで、真ん中の人の位置は「2番目」だよね。でも、この「2番目」という位置は、他の2人がどこにいるかによって決まります
- もし真ん中の人が列に一人だけだったら、「2番目」なんて位置は存在しない。これが「相対的」という意味
- 人が3人で列に並んでいるとする。前にいる人は「1番目」、真ん中の人が「2番目」、後ろにいる人が「3番目」だとします。ここで、真ん中の人の位置は「2番目」だよね。でも、この「2番目」という位置は、他の2人がどこにいるかによって決まります
【Processing】norm()関数で相対的位置を知るメリット
norm()関数で相対的位置を知るメリットについて
以下の理由からnorm()
関数を使うと、データの取り扱いが楽になり、理解もしやすくなるというメリットがあります。
- 比較しやすい
- 異なる範囲のデータでも、同じ0から1の範囲に変換することで簡単に比較できます。例えば、テストの点数(0〜100点)とプレイ時間(0〜60分)を同じ尺度で比較できます。
- 視覚化しやすい
- データを0から1の範囲に変換することで、グラフやアニメーションにしやすくなります。これにより、データの変化やトレンドを視覚的に理解しやすくなります。
- 計算しやすい
- 他の計算やアルゴリズムに利用する際に、0から1の範囲で統一されていると処理が簡単になります。例えば、色のグラデーションを作るときに便利です。
- 4. コードの再利用
- 同じ関数やアルゴリズムを、異なる範囲のデータに対しても再利用しやすくなります。これにより、プログラムのメンテナンスがしやすくなります
【Processing】norm()関数の書き方【構文】
norm()の書き方【構文】
float result = norm(value, start, stop);
- value:変換したい数値
- start:元の範囲の開始値
- stop:元の範囲の終了値
【Processing】norm()関数の使い方【画像とコード】
float value = 50;
float result = norm(value, 0, 100);
println(result); // これは0.5と表示されます
コードの説明
まず、コード全体をざっくりと説明すると、これはある数値(この場合は50)が0から100の範囲内でどの位置にあるかを0から1の範囲で示すコードです。
normの計算式を使って計算。
- float value = 50;
- これは、「value」という名前の箱に50という数値を入れています。箱の中身を表す名前を「変数」と言います。ここで使われている
float
というのは、数字が小数点を持つ可能性があることを示しています。
- これは、「value」という名前の箱に50という数値を入れています。箱の中身を表す名前を「変数」と言います。ここで使われている
- float result = norm(value, 0, 100);
- ここでは、norm()関数を使って、valueが0から100の範囲内でどこに位置するかを計算しています。計算結果(この場合は0.5)は、「result」という名前の箱に入れられます。(なぜ0.5になるのかは後述)
- println(result);
- 最後に、計算結果を画面に表示します。この場合、resultの中身は0.5なので、画面には「0.5」と表示されます。
norm(value, 0, 100);にすると結果はなぜ0,5になるのか?
float value = 50;
float result = norm(value, 0, 100);
println(result); // これは0.5と表示されます
上記のコード2行目のnorm(value, 0, 100);にすると結果はなぜ0,5になるのか?
valueが50で、範囲が0から100の場合を考えます。
まず、範囲の幅を計算します。ここではstop - start
で100 – 0 = 100です。
範囲の幅を計算する理由は、norm()
関数が数値を正規化(0から1の範囲に変換)するために必要だから
次に、位置の計算をする。valueが範囲内でどこに位置するかを計算します。value- start
で、50 – 0 = 50です。
これも正規化に必要な計算だからしている。
最後に、相対的な位置の計算。
位置の50を範囲の幅での100割ります。50 ÷ 100 = 0.5となります。
範囲の幅で割る理由は、数値がその範囲のどの部分に位置するかを比例的に示すためです。具体的に言うと、範囲の幅で割ることで、その数値が全体のどの割合に位置しているかがわかります。
【Processing】norm()関数はどんな表現で使えそうか
グラデーションの表現で使おうと思います。
【Processing】norm()関数を使ってみた感想
何をしているのかは分かるのですが、正規化の計算がややこしいですね。
それでは今日もレッツワクワクコーディング。