root/michi/as2/src/com/seyself/math/ColorMath.as

リビジョン 57, 10.6 kB (コミッタ: michi, コミット時期: 3 年 前)

convertRGB, convertHSV, toDecを修正

Line 
1 /*
2 * Copyright 2007 Michiyasu Wada
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *     http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 /**
18 * com.seyself.math.ColorMath
19 *
20 * 色に関する計算もろもろ。
21 * static関数のみで構成されています。
22 *
23 * @author               Michiyasu Wada
24 */
25 class com.seyself.math.ColorMath
26 {
27        
28         private function ColorMath(){}
29        
30         /**
31         * 減算
32         * 2つのRGBを示す数値( 0x000000 から 0xFFFFFF まで)から減算した数値を返します。
33         * ARGBを示す数値を引数に渡した場合、アルファ値は無視されます。
34         *
35         * @param col1 : Number - RGBを示す数値( 0x000000 から 0xFFFFFF まで)
36         * @param col2 : Number - RGBを示す数値( 0x000000 から 0xFFFFFF まで)
37         * @return Number - 減算混色値
38         * @usage <code>
39         * import com.seyself.math.ColorMath;
40         * trace( ColorMath.subtract( 0xFFFF00 , 0x666666 ).toString(16) ); // 出力 : 656500
41         * </code>
42         */
43         static function subtract( col1:Number , col2:Number ):Number
44         {
45                 var a = toRGB( col1 );
46                 var b = toRGB( col2 );
47                 var nr = Math.max( Math.max( b[0]-(256-a[0]) , a[0]-(256-b[0]) ) , 0 );
48                 var ng = Math.max( Math.max( b[1]-(256-a[1]) , a[1]-(256-b[1]) ) , 0 );
49                 var nb = Math.max( Math.max( b[2]-(256-a[2]) , a[2]-(256-b[2]) ) , 0 );
50                 return toDec( nr , ng , nb );
51         }
52        
53         /**
54         * 加法混色
55         * 2つのRGBを示す数値( 0x000000 から 0xFFFFFF まで)から加法混色した数値を返します。
56         * ARGBを示す数値を引数に渡した場合、アルファ値は無視されます。
57         *
58         * @param col1 : Number - RGBを示す数値( 0x000000 から 0xFFFFFF まで)
59         * @param col2 : Number - RGBを示す数値( 0x000000 から 0xFFFFFF まで)
60         * @return Number - 加法混色値
61         * @usage <code>
62         * import com.seyself.math.ColorMath;
63         * trace( ColorMath.sum( 0xFFFF00 , 0x666666 ).toString(16) ); // 出力 : ffff66
64         * </code>
65         */
66         static function sum( col1:Number , col2:Number ):Number
67         {
68                 var a = toRGB( col1 );
69                 var b = toRGB( col2 );
70                 var nr = Math.min( a[0]+b[0] , 255 );
71                 var ng = Math.min( a[1]+b[1] , 255 );
72                 var nb = Math.min( a[2]+b[2] , 255 );
73                 return toDec( nr , ng , nb );
74         }
75        
76         /**
77         * 減法混色
78         * 2つのRGBを示す数値( 0x000000 から 0xFFFFFF まで)から減法混色した数値を返します。
79         * ARGBを示す数値を引数に渡した場合、アルファ値は無視されます。
80         *
81         * @param col1 : Number - RGBを示す数値( 0x000000 から 0xFFFFFF まで)
82         * @param col2 : Number - RGBを示す数値( 0x000000 から 0xFFFFFF まで)
83         * @return Number - 減法混色値
84         * @usage <code>
85         * import com.seyself.math.ColorMath;
86         * trace( ColorMath.sub( 0xFFFF00 , 0x666666 ).toString(16) ); // 出力 : 999900
87         * </code>
88         */
89         static function sub( col1:Number , col2:Number ):Number
90         {
91                 var a = toRGB( col1 );
92                 var b = toRGB( col2 );
93                 var nr = Math.max( a[0]-b[0] , 0 );
94                 var ng = Math.max( a[1]-b[1] , 0 );
95                 var nb = Math.max( a[2]-b[2] , 0 );
96                 return toDec( nr , ng , nb );
97         }
98        
99         /**
100         * 比較(暗)
101         * 2つのRGBを示す数値( 0x000000 から 0xFFFFFF まで)から比較して、RGBそれぞれ数値の低い方を合わせた数値を返します。
102         * ARGBを示す数値を引数に渡した場合、アルファ値は無視されます。
103         *
104         * @param col1 : Number - RGBを示す数値( 0x000000 から 0xFFFFFF まで)
105         * @param col2 : Number - RGBを示す数値( 0x000000 から 0xFFFFFF まで)
106         * @return Number - 比較(暗)値
107         * @usage <code>
108         * import com.seyself.math.ColorMath;
109         * trace( ColorMath.min( 0xFFFF00 , 0x666666 ).toString(16) ); // 出力 : 666600
110         * </code>
111         */
112         static function min( col1:Number , col2:Number ):Number
113         {
114                 var a = toRGB( col1 );
115                 var b = toRGB( col2 );
116                 var r = Math.min( a[0] , b[0] );
117                 var g = Math.min( a[1] , b[1] );
118                 var b = Math.min( a[2] , b[2] );
119                 return toDec( r , g , b );
120         }
121        
122         /**
123         * 比較(明)
124         * 2つのRGBを示す数値( 0x000000 から 0xFFFFFF まで)から比較して、RGBそれぞれ数値の高い方を合わせた数値を返します。
125         * ARGBを示す数値を引数に渡した場合、アルファ値は無視されます。
126         *
127         * @param col1 : Number - RGBを示す数値( 0x000000 から 0xFFFFFF まで)
128         * @param col2 : Number - RGBを示す数値( 0x000000 から 0xFFFFFF まで)
129         * @return Number - 比較(明)値
130         * @usage <code>
131         * import com.seyself.math.ColorMath;
132         * trace( ColorMath.max( 0xFFFF00 , 0x666666 ).toString(16) ); // 出力 : ffff66
133         * </code>
134         */
135         static function max( col1:Number , col2:Number ):Number
136         {
137                 var a = toRGB( col1 );
138                 var b = toRGB( col2 );
139                 var r = Math.max( a[0] , b[0] );
140                 var g = Math.max( a[1] , b[1] );
141                 var b = Math.max( a[2] , b[2] );
142                 return toDec( r , g , b );
143         }
144        
145         /**
146         * ARGBを示す数値( 0x00000000 から 0xFFFFFFFF まで)、もしくはRGBを示す数値( 0x000000 から 0xFFFFFF まで)を
147         * Alpha, R, G, B それぞれ 0 から 255 までの数値に分割した配列を返します。
148         * 戻り値の配列に含まれる値は [ R , G , B , Alpha ] と Alpha値 が最後になっていることに注意してください。
149         *
150         * @param col : Number - ARGBを示す数値( 0x00000000 から 0xFFFFFFFF まで)
151         * @return Array - 各色の値を示す配列 [ R , G , B , Alpha ]
152         * @usage <code>
153         * import com.seyself.math.ColorMath;
154         * trace( ColorMath.toRGB( 0xFF336699 ) ); // 出力 : 51,102,153,255
155         * </code>
156         */
157         public static function toRGB( col:Number ):Array
158         {
159                 if(typeof(col)=="number"){
160                         var a = Math.floor(col/16777216);
161                         var r = Math.floor((col-a*16777216)/65536);
162                         var g = Math.floor((col-(a*16777216+r*65536))/256);
163                         var b = Math.floor((col-(a*16777216+r*65536+g*256)));
164                         return [r,g,b,a];
165                 }
166         }
167        
168         /**
169         * 引数に R, G, B, Alpha を示す、それぞれ 0x00 から 0xFF までの数値を合算した数値を返します。
170         * Alpha値は省略が可能です。省略した場合は 0 として換算されます。
171         *
172         * @param r : Number - 赤(R)を示す数値( 0x00 から 0xFF まで)
173         * @param g : Number - 緑(G)を示す数値( 0x00 から 0xFF まで)
174         * @param b : Number - 青(B)を示す数値( 0x00 から 0xFF まで)
175         * @param a : Number - アルファ(A)を示す数値( 0x00 から 0xFF まで)
176         * @return Number - 各色の値から求められたARGBを示す数値
177         * @usage <code>
178         * import com.seyself.math.ColorMath;
179         * trace( ColorMath.toDec( 51, 102 , 153, 255 ) ); // 出力 : 4281558681
180         * </code>
181         */
182         public static function toDec( r:Number , g:Number , b:Number , a:Number ):Number
183         {
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);
186         }
187        
188         /**
189         * RGBそれぞれの数値から、HSV(HSB) に換算した配列を返します。
190         * (表記上HSVとしていますが B が Blue と混同しないためにHSVを用いています。)
191         * RGB の値はそれぞれ以下の通りです。
192         *     R - 0 から 255 までの数値
193         *     G - 0 から 255 までの数値
194         *     B - 0 から 255 までの数値
195         *
196         * HSV の値はそれぞれ以下の通りです。
197         *     H - 0 から 360 までの数値
198         *     S - 0 から 100 までの数値
199         *     V - 0 から 100 までの数値
200         *
201         * アルファを含めた計算はできません。
202         *
203         * @param r : Number - 赤(R)を示す数値( 0x00 から 0xFF まで)
204         * @param g : Number - 緑(G)を示す数値( 0x00 から 0xFF まで)
205         * @param b : Number - 青(B)を示す数値( 0x00 から 0xFF まで)
206         * @return Array - HSVに変換した値 [ H, S, V ]
207         * @usage <code>
208         * import com.seyself.math.ColorMath;
209         * var rgb = ColorMath.toRGB( 0xFF6600 );
210         * trace( ColorMath.convertHSV.apply( null , rgb ) ); // 出力 : 24,100,50
211         * </code>
212         */
213         public static function convertHSV( r:Number, g:Number, b:Number ):Array
214         {
215                 r/=255; g/=255; b/=255;
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                                 }
234                         }
235                         h=h*60;
236                         if(h<0) h=h+360;
237                 }
238                 return [ h, s*100, v*100 ];
239         }
240        
241         /**
242         * HSV(HSB)それぞれの数値からRGBを割り出して配列として返します。
243         * (表記上HSVとしていますが B が Blue と混同しないためにHSVを用いています。)
244         * RGB の値はそれぞれ以下の通りです。
245         *     R - 0 から 255 までの数値
246         *     G - 0 から 255 までの数値
247         *     B - 0 から 255 までの数値
248         *
249         * HSV の値はそれぞれ以下の通りです。
250         *     H - 0 から 360 までの数値
251         *     S - 0 から 100 までの数値
252         *     V - 0 から 100 までの数値
253         *
254         * Hが上記範囲外の場合 0 から 360 の範囲内に相当する数値に置き換えられます。
255         * アルファを含めた計算はできません。
256         *
257         * @param h : Number - 色相(Hue)を示す数値( 0 から 360 まで)
258         * @param s : Number - 彩度(Saturation)を示す数値( 0 から 100 まで)
259         * @param v : Number - 明度(Value)を示す数値( 0 から 100 まで)
260         * @return Array - RGBに変換した値 [ R, G, B ]
261         * @usage <code>
262         * import com.seyself.math.ColorMath;
263         * trace( ColorMath.convertRGB( 24, 100, 50 ) ); // 出力 : 255,102,0
264         * </code>
265         */
266         public static function convertRGB( h:Number, s:Number, v:Number ):Array
267         {
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 ];
284         }
285
286        
287 }
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。