[英]Choosing colours based on IP address
在我的PHP(v5.2.17)腳本中,我想根據當前用戶的IP地址為其輸入選擇唯一的顏色。 我不想映射十六進制代碼中的顏色值,因為我還想隨着時間的推移淡化每個條目的顏色。 顏色必須始終將RGB值之一設置為零(這就像一組明亮的原色)。
有一個聰明的數學解決方案可以做到這一點嗎?
如果閱讀此文的數學大師能分享一些見解,我將不勝感激。 :-)
您真的限制自己只能使用六種“基本”顏色嗎?
255 255 0
255 0 255
0 255 255
0 0 255
0 255 0
255 0 0
我想您將對這些顏色應用線性函數以嘗試淡化它們。 這不一定像您認為的那樣好看-RGB表示不是很線性。 您可以通過使用HSV或HSL表示廉價地近似更好的“線性”表示。 它們肯定不是完美的,但是會感覺比RGB更自然。
至於將IP地址映射為顏色,您可以將這些顏色組合存儲在數組中,並使用簡單的哈希函數從六個元素中進行選擇。 這樣的事情可能就足夠了:
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
然后查看最有意義的方法。)
盡管這不會給您{R,G,B}
始終為0的結果,但是HSL表示可能看起來不錯。 例如,讓hue為0到1的十進制值,定義為
(float)(octet[0] + octet[1] << 8 + octet[2] << 16 + octet[3] << 24) / (2^32-1)
,其中每個octet[i]
是一個無符號字節, ^
是冪)。 然后根據您的喜好手動設置亮度和飽和度。 只是一個主意!
另外,這使褪色變得容易(只需從飽和度/亮度中減去“時間”的一部分)。
您是否正在使用數據庫存儲關系? 您可以隨時獲取用戶的IP地址
<?php
function userIP(){
if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$userIp=$_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$userIp=$_SERVER['REMOTE_ADDR'];
}
return trim($userIp);
}
?>
然后使用該函數設置IP的可用變量:
<?php
$Users_IP_address = userIP();
?>
有了該顏色后,就可以分配一種未使用的顏色,並保存關聯以供將來參考。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.