トップページに、Processingについて書いた記事を、辞書のように見つけやすくしてみました

【Processing】norm()関数の使い方【特定の範囲の数値を0~1にする】

【Processing】norm()関数の使い方【特定の範囲の数値を0~1にする】
  • URLをコピーしました!
ワタタク

今回の記事の目的はProcessingの「norm()関数」を理解し、自分なりに使ってみること。

この記事を書いた人
ワタタク
  • クリエイティブコーディング初心者が、アーティストとして活躍するまでの上達の過程を発信
  • コンセプトは「クリエイティブコーディング1万時間の歩き方」
  • 参考にしてもらえるブログにするため、Processingを独学で勉強して共有中

記事内のProcessingのバージョンは4.3。

目次

【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番目」なんて位置は存在しない。これが「相対的」という意味

【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の計算式を使って計算。

  1. float value = 50;
    • これは、「value」という名前の箱に50という数値を入れています。箱の中身を表す名前を「変数」と言います。ここで使われているfloatというのは、数字が小数点を持つ可能性があることを示しています。
  2. float result = norm(value, 0, 100);
    • ここでは、norm()関数を使って、valueが0から100の範囲内でどこに位置するかを計算しています。計算結果(この場合は0.5)は、「result」という名前の箱に入れられます。(なぜ0.5になるのかは後述)
  3. 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()関数を使ってみた感想

何をしているのかは分かるのですが、正規化の計算がややこしいですね。

ワタタク

それでは今日もレッツワクワクコーディング。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次