チェンジセット 57

差分発生行の前後
無視リスト:
コミット日時:
2007/09/04 21:42:07 (4 年前)
コミッタ:
michi
ログメッセージ:

convertRGB, convertHSV, toDecを修正

ファイル:

凡例:

変更無し
追加
削除
更新
コピー
移動
  • michi/as2/src/com/seyself/math/ColorMath.as

    r19 r57  
    182182        public static function toDec( r:Number , g:Number , b:Number , a:Number ):Number 
    183183        { 
    184                 if( a ) return a*16777216+r*65536+g*256+b
    185                 return r*65536+g*256+b
     184                if( a ) return Math.floor(a)*16777216+Math.floor(r)*65536+Math.floor(g)*256+Math.floor(b)
     185                return Math.floor(r)*65536+Math.floor(g)*256+Math.floor(b)
    186186        } 
    187187         
     
    214214        { 
    215215                r/=255; g/=255; b/=255; 
    216                 var h = 0; 
    217                 var s = 0; 
    218                 var v = 0; 
    219                 var cmax, cmin; 
    220                 if(r>=g) cmax=r; else cmax=g; if(b>cmax) cmax=b; 
    221                 if(r<=g) cmin=r; else cmin=g; if(b<cmin) cmin=b; 
    222                 v=(cmax+cmin)/2; var c=cmax-cmin; 
    223                 if(c!=0){ 
    224                         if(v<=0.5) s=c/(cmax+cmin); else s=c/(2-(cmax+cmin)); 
    225                         if(r==cmax){ h=(g-b)/c; } 
    226                         else { 
    227                                 if(g==cmax){ h=2+(b-r)/c; } 
    228                                 else { if(b==cmax) h=4+(r-g)/c; } 
     216                var h=0, s=0, v=0; 
     217                var x, y; 
     218                if(r>=g) x=r; else x=g; if(b>x) x=b; 
     219                if(r<=g) y=r; else y=g; if(b<y) y=b; 
     220                v=x;  
     221                var c=x-y; 
     222                if(x==0) s=0; else s=c/x; 
     223                if(s!=0){ 
     224                        if(r==x){ 
     225                                h=(g-b)/c; 
     226                        } else { 
     227                                if(g==x){ 
     228                                        h=2+(b-r)/c; 
     229                                } else { 
     230                                        if(b==x){ 
     231                                                h=4+(r-g)/c; 
     232                                        } 
     233                                } 
    229234                        } 
    230                         h = h*60; if(h<0) h=h+360; 
     235                        h=h*60; 
     236                        if(h<0) h=h+360; 
    231237                } 
    232238                return [ h, s*100, v*100 ]; 
     
    260266        public static function convertRGB( h:Number, s:Number, v:Number ):Array 
    261267        { 
    262                 var _h = h
    263                 var _s = s/100; 
    264                 var _v = v/100
    265                 var vr = 0
    266                 var vg = 0; 
    267                 var vb = 0
    268                 var cmin, cmax
    269                 if(_s<0) _s=0; if(_s>1) _s=1; 
    270                 if(_v<0) _v=0; if(_v>1) _v=1
    271                 _h = _h%360; if(_h<0) _h=_h+360
    272                 if(_v<=0.5) { cmin=_v*(1-_s); cmax = 2*_v-cmin; } 
    273                 else { cmax = _v*(1-_s)+_s; cmin = 2*_v-cmax; } 
    274                 vr = __convertH(_h+120, cmin, cmax)*255
    275                 vg = __convertH(_h, cmin, cmax)*255
    276                 vb = __convertH(_h-120, cmin, cmax)*255; 
    277                 return [ vr, vg, vb ]; 
     268                s=s/100, v=v/100
     269                var r=0, g=0, b=0; 
     270                var i, x, y, z
     271                if(s<0) s=0; if(s>1) s=1; if(v<0) v=0; if(v>1) v=1
     272                h=h%360; if(h<0) h+=360; h/=60; 
     273                i = Math.floor(h)
     274                x=v*(1-s); y=v*(1-s*(h-i)); z=v*(1-s*(1-h+i))
     275                switch(i){ 
     276                       case 0 : r=v; g=z; b=x; break
     277                       case 1 : r=y; g=v; b=x; break
     278                       case 2 : r=x; g=v; b=z; break; 
     279                       case 3 : r=x; g=y; b=v; break; 
     280                       case 4 : r=z; g=x; b=v; break
     281                       case 5 : r=v; g=x; b=y; break
     282                } 
     283                return [ r*255, g*255, b*255 ]; 
    278284        } 
    279285 
    280286         
    281         /** 
    282         * convertRGB 内で使用されるプライベート関数 
    283         *  
    284         * @param        hh : Number - H(色相を示す値) 
    285         * @param        min : Number - R,G,B 値の最小値 
    286         * @param        max : Number - R,G,B 値の最大値 
    287         * @return Number - R,G,B それぞれ対応する色の値 
    288         */ 
    289         private static function __convertH( hh:Number , min:Number , max:Number ):Number 
    290         { 
    291                 hh = hh%360; 
    292                 if(hh<0) hh=hh+360; 
    293                 if(hh<60) return min+(max-min)*hh/60; 
    294                 if(hh>=60&&hh<180) return max; 
    295                 if(hh>=180&&hh<240) return min+(max-min)*(240-hh)/60; 
    296                 return min; 
    297         } 
    298          
    299287}