2014-01-16 182 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