L*a*b*色空間でwebセーフカラーを3Dしてみたの事 zahir forked:2favorite:3lines:150license : All rights reserved modified : 2009-05-13 03:42:05 Embed Tweet package{ import flash.display.Sprite; import flash.events.*; import flash.filters.BlurFilter; import flash.utils.Timer; [SWF(width="400", height="400")] public class ColorChip3D_lab extends Sprite{ private const RADIUS:Number = 150; private const HEIGHT:Number = 150; private var Chip_arr:Array = new Array(); private var len:int = 0; private var speed:Number = .2; private var rot:Number = 0; private var addRot:Number = 0; private var cont:Sprite; private var tt:ToolChip; private var timer:Timer; public function ColorChip3D_lab(){ super(); cont = new Sprite(); this.addChild(cont); cont.x = 200; cont.y = 250; cont.z = 0; var i:int = 0; var j:int = 0; var k:int = 0; var lim:int = 6; var step:int = 0x33; //* for(i=0; i<lim; i++){ for(j=0; j<lim; j++){ for(k=0; k<lim; k++){ Chipsfactry(i*step, j*step, k*step); } } }//*/ len = Chip_arr.length; for(i = 0;i<len;i++){ Chip_arr[i].addEventListener(MouseEvent.ROLL_OVER, over); Chip_arr[i].addEventListener(MouseEvent.MOUSE_OUT, out); } Wonderfl.capture_delay( 1 ); //------------------------------------------------------- timer = new Timer(16); timer.addEventListener(TimerEvent.TIMER , onTimer ); timer.start(); } private function Chipsfactry(rr:int , gg:int, bb:int):void{ var lab:Object = this.RGBtoLAB(rr, gg, bb); var L:Number = lab.L; var a:Number = lab.a; var b:Number = lab.b; var rad:Number = Math.atan2(a,b); var r:Number = Math.sqrt( (a*a) + (b*b)); var h:Number = L; var chip:ChipObject = new ChipObject( 14, rr<<16 | gg<<8 | bb, L, a, b, rad, r, -h); chip.x = r * Math.sin(rad); chip.y = -h; chip.z = r * Math.cos(rad); cont.addChild(chip); Chip_arr.push(chip); } private function onTimer(e:TimerEvent):void{ var i:int = 0 rot += speed % 360; addRot = Math.PI/180 * rot; for(i = 0; i< len; i++){ onSetPos( Chip_arr[i] );} sort(); } private function onSetPos(obj:ChipObject):void{ var rad:Number = obj.posRad + addRot; var r:Number = obj.posR; var h:Number = obj.posHeight; obj.x = r * Math.sin(rad); obj.y = h; obj.z = r * Math.cos(rad); } private function sort():void{ var z_arr:Array = new Array(); for(var i:int = 0;i< len; i++){ z_arr.push({ "depth":Chip_arr[i].z, "obj":Chip_arr[i]});} z_arr.sortOn("depth", Array.NUMERIC | Array.DESCENDING); for(i = 0; i < len; i++){ cont.setChildIndex(z_arr[i].obj,i);} z_arr= null; } private function over(e:MouseEvent):void{ tt = new ToolChip(e.target.COLOR, e.target.L, e.target.a, e.target.b); tt.x = this.stage.mouseX + 10; tt.y = this.stage.mouseY + 10; this.addChild(tt); } private function out(e:MouseEvent):void{ this.removeChild(tt);} private const X0:Number = 0.95045; private const Y0:Number = 1.0; private const Z0:Number = 1.08892; /* L:[0~100] a:[-134~220] b:[-140~122] */ private const q:Number = 16/116; private function RGBtoLAB(rr:int, gg:int, bb:int):Object{ var X:Number = (0.412391 * rr + 0.357584 * gg + 0.180481 * bb )/255; var Y:Number = (0.212639 * rr + 0.715269 * gg + 0.072192 * bb )/255; var Z:Number = (0.019331 * rr + 0.119195 * gg + 0.950532 * bb )/255; var _x:Number = (X/X0); var _y:Number = (Y/Y0); var _z:Number = (Z/Z0); var fx:Number = _x > 0.008856 ? Math.pow( _x, 0.333):(7.787 * _x)+ q; var fy:Number = _y > 0.008856 ? Math.pow( _y, 0.333):(7.787 * _y)+ q; var fz:Number = _z > 0.008856 ? Math.pow( _z, 0.333):(7.787 * _z)+ q; var L:Number = 116 * fy -16; var a:Number = 500 * (fx - fy); var b:Number = 200 * (fy - fz); L = L<0 ? 0 : L; return {"L":L, "a":a, "b":b}; } } } import flash.display.*; class ChipObject extends Sprite{ public var COLOR:uint; public var L:Number; public var a:Number; public var b:Number; public var posRad:Number; public var posR:Number; public var posHeight:Number; public function ChipObject(size:int, color:uint, _L:Number, _a:Number, _b:Number, rad:Number, r:Number, h:Number){ super(); COLOR = color; L = _L; a = _a; b = _b; posRad = rad; posR = r; posHeight = h; var s:Number = size/2; var g:Graphics = this.graphics; g.lineStyle(0, 0x666666, 0.3); g.beginFill(color); g.drawRect(-s,-s, s,s); g.endFill(); } } import flash.display.*; import flash.text.TextField; class ToolChip extends Sprite{ public function ToolChip(color:uint, l:int, a:int, b:int){ super(); var g:Graphics = this.graphics; g.lineStyle(0,8421504,0.5); g.beginFill((255<<16) | (255<<8) | 255,0.9); g.drawRect(0,0,65,75); g.endFill(); var tf:TextField = new TextField(); this.addChild(tf); var _txt:String = color.toString(16) + "\n" + "L:"+ l + "\n" + "a:"+ a + "\n" + "b:"+ b + "\n"; tf.text = _txt; tf.height = 110 tf.x = 5 tf.y = 5; } } Code Fullscreen Preview Fullscreen aqua0721cn h1ro : 色 mash : coooooooooool! 色 color sort Math.pow addEventListener graphics drawRect setChildIndex MouseEvent.ROLL_OVER MouseEvent.MOUSE_OUT mouseY mouseX Array.DESCENDING sortOn Array.NUMERIC endFill beginFill height removeChild MouseEvent Object sort new page view favorite forked pv0 forked from: L*a*b*色空間でwebセーフカ.. moca8 forked:0 favorite:0lines:163 (diff:166) pv470 forked from: L*a*b色空間でwebセーフカラ.. bush_clover forked:0 favorite:0lines:163 (diff:166)