2013-10-02 16 views
1

我試圖將rgb轉換爲as3中的hsv。我有這似乎除了具有白色工作做好的功能(255,255,255)Actionscript HsvToRgb不適用於白色

這是我的函數:

 public function RgbToHsv(red:Number, grn:Number, blu:Number):Object 
    { 
     var x, val, f, i, hue, sat, val; 
     red/=255; 
     grn/=255; 
     blu/=255; 
     x = Math.min(Math.min(red, grn), blu); 
     val = Math.max(Math.max(red, grn), blu); 
     if (x==val){ 
      return({h:undefined, s:0, v:val*100}); 
     } 
     f = (red == x) ? grn-blu : ((grn == x) ? blu-red : red-grn); 
     i = (red == x) ? 3 : ((grn == x) ? 5 : 1); 
     hue = Math.floor((i-f/(val-x))*60)%360; 
     sat = Math.floor(((val-x)/val)*100); 
     val = Math.floor(val*100); 
     return({h:hue, s:sat, v:val}); 
    }  

的問題是,當我通過白色的RGB(255,255,255)我得到這樣的:H:空,S:0,v:100

+1

也許你應該嘗試鍵入,而不是讓閃光燈不好做你的變量'Number'。 – Florent

回答

1

的解決方案是非常簡單的。喬希給的觀點好點,所以我只是改變這一行:

if (x==val){ 
    return({h:undefined, s:0, v:val*100}); 
} 

if (x==val){ 
    return({h:0, s:0, v:val*100}); 
} 
2

你除以零的色調,如果值是白色。

val = Math.max(Math.max(red, grn), blu) = Math.max(Math.max(255, 255), 255) = 255; 
x = Math.min(Math.min(red, grn), blu) = Math.min(Math.min(255, 255), 255) = 255; 
val - x = 255 - 255 = 0; 
hue = Math.floor((i - f/(val - x)) * 60) % 360; 

x/0在AS3(和大多數語言)是NaN(或空在這種情況下,因爲你沒有輸入你的對象。AS3是嚴格的數據類型語言。每個對象必須打字)。

我不知道如何,因爲我還沒有在18個月的顏色理論或顏色算法工作解決問題,但肯定是問題。順化實際上是每次有等量的紅色,綠色和藍色爲此彩色時間NaN/null(所以不只是白色的,任何灰度顏色應該導致同樣的問題)

+0

你說得對。問題在於分工。也許我應該首先檢查是否爲0,然後再進行劃分... – Tropicalista

+0

這可能是要走的路線。這是正確的轉換嗎?看起來很奇怪,標準轉換可能會導致除數爲0. –

+0

我在一個我不記得的論壇上發現了這個腳本。我對顏色理論一無所知 – Tropicalista

相關問題