1

誰かが昨日投稿したこの質問に興味を持ちました ダイアモンド スクエア アルゴリズム、数学集約型アルゴリズムでの Node.js/coffeescript パフォーマンス について

私は彼のコードを適応させ、結果として得られるデータ グリッドのカラー マップを生成する次のステップに進みたいと考えています。

私の最初の考えは、海の最も深い地点をエベレストの高さまで持っていき、身長が変化することでした. 海抜は約 2076m、最高高度は約 10924m (エベレストは 8848m) です。とにかく、私は欲しいものにかなり近い値でデータのグリッドを生成しています。

私は16進数の色の値の配列を作成することを考えていました。たとえば、暗い青色から水の明るい色合いまで、次に海面から山までの暗い緑から白までです。色の領域に対応する高さの値の範囲を設定できます。

この種のことを行うための一般的な手法は何ですか? より具体的には、特定の高さの値に対して 2 つの 16 進数値の間で特定の 16 進数の色をどのように生成しますか?

4

1 に答える 1

1

はい、あなたが提案するものはいいですね。中間値の場合、通常は線形補間を使用します。次のスニペットは、#00 と #ff の間の 5% を補間する方法を示しています (必要な変換も示しています)。

> ("00" + Math.floor(parseInt('00',16) + 5 / 100 * parseInt('ff',16)).toString(16)).slice(-2)
"0c"

明らかに、あなたはそれを関数でラップします-私はそれをチェックしたクロムコマンドラインからカットアンドペーストしています。

[編集]それは明らかですか?上記の場合、#00 と 0m と 100m で #ff が必要な場合は 5m での値を計算しています。値は 1 つのチャネル (r、g、または b) のみです。さまざまなステップでそれを繰り返し、rg と b を結合する必要があります。

これは、#a0 から 50m、#a0 から 10m の範囲で #a0 から #20 に移動する別の例です。初期値がゼロではないため、追加の減算があることに注意してください。

> ("00" + Math.floor(parseInt('a0',16) + 10 / 50 * (parseInt('20',16) - parseInt('a0', 16))).toString(16)).slice(-2)
"86"

したがって、変換を無視すると、補間は次のようになります。

start_value + (distance_from_start / total_distance) * (end_value - start_value)

そして変換は

decimal_int = parseInt(hex_string, 16)
hex_string = decimal_int.toString(16)

ps processing.js には、このような関数が既に作成されていると思いますが、それが助けになれば (使用されていませんが、そのようなライブラリです...)

于 2011-08-14T01:21:57.467 に答える