在我的PHP(v5.2.17)脚本中,我想根据用户的IP地址为当前用户的条目选择一种唯一的颜色。我不想映射十六进制代码中的颜色值,因为我还想逐渐淡化每个条目的颜色。颜色必须始终将其中一个RGB值设置为零(它就像一组明亮的原色)。
有没有一个聪明的数学解决方案来做到这一点?
如果任何阅读本书的数学专业人士能够分享一些见解,我将不胜感激。 : - )
答案 0 :(得分:2)
你真的只限于六种“基础”颜色吗?
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在六个元素中进行选择。这样的事情可能就足够了:
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
,看看最有意义的是什么。)
答案 1 :(得分:1)
虽然这不会给你一个{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]
是无符号字节,^
是取幂的)。然后根据您的喜好手动设置亮度和饱和度。只是一个想法!
作为一个额外的好处,这使得颜色容易褪色(只是从饱和度/亮度中减去“时间”的某些部分)。
答案 2 :(得分:-2)
您使用数据库存储关系吗?你总是可以获取用户的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();
?>
一旦你有了这个,你可以指定一个未使用的颜色并保存该关联以供将来参考。