2014-01-16 178 views
1

我需要将项目的“年龄”(以天为单位)转换为十六进制值,其中最早的项目=最大颜色= D9D8C9,最近的=最小颜色= FFFFFF。将十进制转换为十六进制值

超过365岁的项目变得颜色D9D8C9。 7岁以下的物品会变色FFFFFF。

根据这些最小和最大颜色,我如何找到任何小于365天且超过7天的物品的颜色?

最后,我会用PHP来做,但伪代码的例子很好。

+0

年龄超过365天且超过7天?这只是你的条件? –

回答

2

从本质上讲,你正在寻找一种方式来任意地图一个范围到另一个(7-365应该被映射的FFFFFF - D9D8D9)。

首先第一件事情:转换十进制为十六进制是很容易的:

$age = mt_rand(1,600); 
if ($age > 365) $hex = 'D9D8D9'; 
elseif ($age < 7) $hex = 'FFFFFF'; 
else $hex = str_pad(dechex($age), 6, '0', STR_PAD_LEFT); 

我要做的就是简单地检查是否$age是大于365,如果是的话,我给你的D9D8D9不变,如果是小于7,我分配FFFFFF。在所有其他情况下,我只是将数字转换为十六进制数,然后使用0填充结果字符串为6个字符,因此255将变为FF,并填充为0000FF

但是为了绘制范围的范围,我们必须找出最小范围内的一个步骤如何缩放到较大的范围。这是一个简单的“三条规则”:在两个尺度上计算1的等价值,然后相乘。然后应用相同的范围界限,你就在那里。
您使用的颜色范围是FFFFFFD9D8D9,或将其放入小数点:1677721514276809。这给我们留下了范围为2500406,而365-7(或358)天。因此,在我们的颜色范围内,每一天都是“值得”6984.374301676(D9D8D9-FFFFFF)/(365-7))。
把它放在一起,你有2个选择:计算距离FFFFFF或D9D8D9的距离,但就结果而言,选择哪一个并不重要。

<CrLowBound> - (<value>-<VLowBound>)*<CrStep> 
//or 
<CrHighBound> - (<VHighBound> - <value>)*<CrStep> 

两者都简单地计算颜色范围中对应于给定值的值。 CrLowBoundCrHighBound分别是FFF和D9D8D9,几乎相同:VLowBoundVHighBound分别是6和366. CrStep6984.374301676。我已经解释了我是如何得到这些价值的。

$age = mt_rand(1,600); 
if ($age > 365) $hex = 'D9D8D9'; 
elseif ($age < 7) $hex = 'FFFFFF'; 
else $hex = str_pad(dechex(14276809-(round((366-$dec)*6984.374301676))), 6, '0', STR_PAD_LEFT); 
//Or: 
$hex = str_pad(dechex(16777215-(round(($dec-6)*6984.374301676))), 6, '0', STR_PAD_LEFT); 

这将更加均匀地散布在D9D8D9FFFFFF范围内的颜色范围:旧的项目,越接近颜色将是D9D8D9,越近,越接近它是FFFFFF
例如,如果年龄是117,该“色”将是1A6E1D

//age (max-age)*worth hex 
    117 == 1732125 == 1a6e1d 

测试用下面的代码:

function getColour($dec) 
{ 
    if ($dec > 365) return 'D9D8D9'; 
    if ($dec < 7) return 'FFFFFF'; 
    return strtoupper(
     str_pad(
      dechex(14276809-(round((366-$dec)*6984.374301676))), 
      6, 
      '0', 
      STR_PAD_LEFT 
     ) 
    ); 
} 
$days = range(6,366); 
$colours = array(); 
foreach($days as $day) $colours[$day] = getColour($day); 
$out = array_chunk($colours, 8); 
foreach($out as $k => $chunk) $out[$k] = implode(' - ', $chunk); 
echo implode('<br>', $out); 

,并得到此作为输出:

 
FFFFFF - B3964B - B3B193 - B3CCDB - B3E824 - B4036C - B41EB4 - B439FD 
B45545 - B4708E - B48BD6 - B4A71E - B4C267 - B4DDAF - B4F8F7 - B51440 
B52F88 - B54AD1 - B56619 - B58161 - B59CAA - B5B7F2 - B5D33A - B5EE83 
B609CB - B62514 - B6405C - B65BA4 - B676ED - B69235 - B6AD7D - B6C8C6 
B6E40E - B6FF57 - B71A9F - B735E7 - B75130 - B76C78 - B787C0 - B7A309 
B7BE51 - B7D99A - B7F4E2 - B8102A - B82B73 - B846BB - B86203 - B87D4C 
B89894 - B8B3DD - B8CF25 - B8EA6D - B905B6 - B920FE - B93C46 - B9578F 
B972D7 - B98E20 - B9A968 - B9C4B0 - B9DFF9 - B9FB41 - BA1689 - BA31D2 
BA4D1A - BA6863 - BA83AB - BA9EF3 - BABA3C - BAD584 - BAF0CC - BB0C15 
BB275D - BB42A6 - BB5DEE - BB7936 - BB947F - BBAFC7 - BBCB0F - BBE658 
BC01A0 - BC1CE9 - BC3831 - BC5379 - BC6EC2 - BC8A0A - BCA552 - BCC09B 
BCDBE3 - BCF72C - BD1274 - BD2DBC - BD4905 - BD644D - BD7F95 - BD9ADE 
BDB626 - BDD16F - BDECB7 - BE07FF - BE2348 - BE3E90 - BE59D8 - BE7521 
BE9069 - BEABB2 - BEC6FA - BEE242 - BEFD8B - BF18D3 - BF341B - BF4F64 
BF6AAC - BF85F5 - BFA13D - BFBC85 - BFD7CE - BFF316 - C00E5E - C029A7 
C044EF - C06038 - C07B80 - C096C8 - C0B211 - C0CD59 - C0E8A1 - C103EA 
C11F32 - C13A7B - C155C3 - C1710B - C18C54 - C1A79C - C1C2E4 - C1DE2D 
C1F975 - C214BE - C23006 - C24B4E - C26697 - C281DF - C29D27 - C2B870 
C2D3B8 - C2EF01 - C30A49 - C32591 - C340DA - C35C22 - C3776A - C392B3 
C3ADFB - C3C944 - C3E48C - C3FFD4 - C41B1D - C43665 - C451AD - C46CF6 
C4883E - C4A387 - C4BECF - C4DA17 - C4F560 - C510A8 - C52BF0 - C54739 
C56281 - C57DCA - C59912 - C5B45A - C5CFA3 - C5EAEB - C60633 - C6217C 
C63CC4 - C6580D - C67355 - C68E9D - C6A9E6 - C6C52E - C6E076 - C6FBBF 
C71707 - C7324F - C74D98 - C768E0 - C78429 - C79F71 - C7BAB9 - C7D602 
C7F14A - C80C92 - C827DB - C84323 - C85E6C - C879B4 - C894FC - C8B045 
C8CB8D - C8E6D5 - C9021E - C91D66 - C938AF - C953F7 - C96F3F - C98A88 
C9A5D0 - C9C118 - C9DC61 - C9F7A9 - CA12F2 - CA2E3A - CA4982 - CA64CB 
CA8013 - CA9B5B - CAB6A4 - CAD1EC - CAED35 - CB087D - CB23C5 - CB3F0E 
CB5A56 - CB759E - CB90E7 - CBAC2F - CBC778 - CBE2C0 - CBFE08 - CC1951 
CC3499 - CC4FE1 - CC6B2A - CC8672 - CCA1BB - CCBD03 - CCD84B - CCF394 
CD0EDC - CD2A24 - CD456D - CD60B5 - CD7BFE - CD9746 - CDB28E - CDCDD7 
CDE91F - CE0467 - CE1FB0 - CE3AF8 - CE5641 - CE7189 - CE8CD1 - CEA81A 
CEC362 - CEDEAA - CEF9F3 - CF153B - CF3084 - CF4BCC - CF6714 - CF825D 
CF9DA5 - CFB8ED - CFD436 - CFEF7E - D00AC7 - D0260F - D04157 - D05CA0 
D077E8 - D09330 - D0AE79 - D0C9C1 - D0E50A - D10052 - D11B9A - D136E3 
D1522B - D16D73 - D188BC - D1A404 - D1BF4D - D1DA95 - D1F5DD - D21126 
D22C6E - D247B6 - D262FF - D27E47 - D29990 - D2B4D8 - D2D020 - D2EB69 
D306B1 - D321F9 - D33D42 - D3588A - D373D3 - D38F1B - D3AA63 - D3C5AC 
D3E0F4 - D3FC3C - D41785 - D432CD - D44E16 - D4695E - D484A6 - D49FEF 
D4BB37 - D4D67F - D4F1C8 - D50D10 - D52859 - D543A1 - D55EE9 - D57A32 
D5957A - D5B0C2 - D5CC0B - D5E753 - D6029C - D61DE4 - D6392C - D65475 
D66FBD - D68B05 - D6A64E - D6C196 - D6DCDF - D6F827 - D7136F - D72EB8 
D74A00 - D76548 - D78091 - D79BD9 - D7B722 - D7D26A - D7EDB2 - D808FB 
D82443 - D83F8B - D85AD4 - D8761C - D89165 - D8ACAD - D8C7F5 - D8E33E 
D8FE86 - D919CE - D93517 - D9505F - D96BA8 - D986F0 - D9A238 - D9BD81 
D9D8D9 

Codepad with 2 versions of this code

+0

第二种情况实际上正是我所期待的。我正在测试它。 – pixeline

+1

@pixeline:没必要,我已经做了,并发布了结果。请注意,365岁的物品会产生'000000' - >物品越老,收敛在黑色的越多,所以您可能不想从365减去,而是从D9D8D9常量中减去,但这取决于您当然...('dechex(14276809-(round((366- $ dec)* 6984.374301676)))',因为D9D8D9是14276809) –

+0

简单地让你听起来有多简单地震惊。真棒回答! – pixeline