2012-01-11 15 views
1

PHP(v5.2.17)のスクリプトでは、IPアドレスに基づいて、現在のユーザーのエントリに固有の色を選択します。時間の経過とともに各エントリの色を消したいので、私は16進コードから色の値をマップしたくありません。色は常にRGB値の1つを0に設定する必要があります(明るい原色のようなものです)。IPアドレスに基づいて色を選択する

これを行うための巧妙な数学的解決法はありますか?

これを読んだ数学がいくつかの洞察を分かち合うのであれば、大変感謝します。 :-)

+0

あなたはユニークな色かランダムなものか?ページ内またはサイト全体で一意である必要はありますか? –

+0

最初の2つのIPパーツを追加し、3で割ります。どのチャンネルがゼロになるか選択できます(0-170赤、171-340緑、残り青)。最後の2つの部分は残りのチャンネルと同じです。 – Corubba

+0

ipはユーザーと等しくありません。1ユーザーは複数のIPを使用できます。 1 ipは複数のユーザーになります。適切なユーザー管理システムが必要です。 –

答えて

2

実際には6つの「ベース」カラーに制限されていますか?

255 255 0 
255 0 255 
0 255 255 

0 0 255 
0 255 0 
255 0 0 

これらの色に線形関数を適用して、それらをフェードアウトさせようとしているとします。これは、必ずしもあなたが思っているほど良く見えるとは限りません。表現としてのRGBはあまり線形ではありません。 安価にと表現すると、HSV or HSL表現を使用すると、より良い「線形」表現に近似することができます。確かに完璧ではありませんが、RGBよりも自然な感じです。

IPアドレスを色にマッピングする場合、これらの色の組み合わせをアレイに格納し、単純なhash functionを使用して6つの要素を選択することができます。このような何かは十分かもしれません:

b1, b2, b3, b4 = <split the four bytes from an IP address> 
index = (b1 * 17 + (b2 * 17 + (b3 * 17 + b4))) % 6 

(私はちょうど空気のうち、乗数17を選んだ - そのバイナリ表現が10001で、アドレスの各バイトのビットが互いに上で「不鮮明」得ることを意味していますいくつかの色を選択し、一握りのIPアドレスを取得したら、乗数を例えば21または53に変更して、最も理にかなっているものを見てみてください。)

+0

ありがとうSarnold、HSVまたはHSLは最良の選択肢のようです。私はHSVで色を選択してからRGBに変換すると思います。 – Gregology

+0

ちなみに、この_simplistic_アプローチは、あなたのソフトウェアが[IPv6](http://en.wikipedia.org/wiki/Ipv6)アドレスで動作しているときに壊れます。多分、文字列ベースのハッシュ方法がうまくいくでしょう... – sarnold

-2

あなたは関係を保存するためにデータベースを使用していますか?

<?php 
    $Users_IP_address = userIP(); 
?> 

あなたはしていない色を割り当てることができる、ということしたら:あなたは常にIPの使用可能な変数を設定する機能を使用すると

​​

、ユーザーのIPアドレスをつかむことができ将来の参照のために関連付けを使用して保存してください。

+0

また、色を自動的に割り当てる数学を探していますが、255の27個のオプション(3つのRGBのうちの2つ)しか望んでいない場合は、このシステムで何人のユーザーがいると思われますか?あなたが実行可能な数学をしたい場合は、その変数を持っている必要があります。あなたが3人のユーザを持っているとうまくいきます:) – Silvertiger

+0

'X-Forwarded-For'は偽装するのが簡単です。リバースプロキシの背後にあり、内部のデータを信頼できると知っていない限り、参照するべきではありません。 – Charles

1

{R,G,B}のいずれかが常に0の場合でも、HSLの表現が良好になる場合があります。一例として、)色相がそれぞれoctet[i]が符号なしのバイトであり、^はべき乗である

(float)(octet[0] + octet[1] << 8 + octet[2] << 16 + octet[3] << 24)/(2^32-1) 

によって定義された0から1まで進値、、とします。あなたの好みに応じて、おそらく手で明るさと彩度を設定します。ちょうどアイデア!

追加のボーナスとして、これは色をぼかしやすくします(彩度/明度から「時間」の一部を差し引くだけです)。

+0

私はD Cに同意し、HSLはよりよく見える、私はそれを行って、私の結果を投稿します。ありがとう。 – Gregology

関連する問題