テクスチャ生成実験 ボロノイ図からの派生によるテクスチャ生成の実験 制御点をドラッグで移動 カーソルキー上下で生成タイプ変更 Nao_u forked:3favorite:9lines:307license : MIT License modified : 2009-12-19 22:18:25 Embed Tweet // // ボロノイ図からの派生によるテクスチャ生成の実験 // // 制御点をドラッグで移動 // カーソルキー上下で生成タイプ変更 // package { import flash.display.Sprite; import flash.events.*; [SWF(width="465", height="465", backgroundColor="0xFFFFFF", frameRate="15")] public class FlashTest extends Sprite { public function FlashTest() { Main = this; initialize(); stage.addEventListener(Event.ENTER_FRAME,update); stage.addEventListener(KeyboardEvent.KEY_DOWN, keyCheckDown); } } } import flash.display.Sprite; import flash.events.* import flash.text.TextField; import flash.geom.*; import flash.utils.getTimer; import flash.ui.Keyboard; var Main:Sprite; var SCREEN_W:Number = 465; var SCREEN_H:Number = 465; var Text:TextField var Text2:TextField var Tex:ProcTex; var BITMAP_W:int = 128; var BITMAP_H:int = 128; var Pnt:Vector.<ControlPoint> = new Vector.<ControlPoint>; var Type:int = 0; var TypeMax:int = 4; // 初期化 function initialize():void{ Tex = new ProcTex( BITMAP_W, BITMAP_H ); Tex.Bmp.x = 0; Tex.Bmp.y = 0; Text = new TextField(); Text.text = "生成中..."; Text.autoSize = "left"; Main.addChild(Text); Text2 = new TextField(); Text2.text = ""; Text2.autoSize = "left"; Text2.y = 16; Main.addChild(Text2); // 制御点の設置 Pnt[0] = new ControlPoint( new Point(SCREEN_W/2-70, SCREEN_H/2+40) ); Pnt[1] = new ControlPoint( new Point(SCREEN_W/2-150, SCREEN_H/2-120) ); Pnt[2] = new ControlPoint( new Point(SCREEN_W/2+0, SCREEN_H/2-50) ); Pnt[3] = new ControlPoint( new Point(SCREEN_W/2+160, SCREEN_H/2-130) ); Pnt[4] = new ControlPoint( new Point(SCREEN_W/2+100, SCREEN_H/2+120) ); Pnt[5] = new ControlPoint( new Point(SCREEN_W/2-140, SCREEN_H/2+140) ); Pnt[6] = new ControlPoint( new Point(SCREEN_W/2+10, SCREEN_H/2+180) ); Pnt[7] = new ControlPoint( new Point(SCREEN_W/2-40, SCREEN_H/2-180) ); Pnt[8] = new ControlPoint( new Point(SCREEN_W/2-190, SCREEN_H/2-10) ); Pnt[9] = new ControlPoint( new Point(SCREEN_W/2+180, SCREEN_H/2-10) ); } // 更新 function update(e :Event):void{ var time:int = getTimer(); Tex.draw(); var endTime:int = getTimer() - time; Text.text = " 生成時間:" + endTime + "[ms] TYPE=" + Type; } import flash.display.Bitmap; import flash.display.BitmapData; // テクスチャ生成クラス class ProcTex{ public var BmpData:BitmapData; public var TmpBmpData:BitmapData; public var Bmp:Bitmap; public var Width:int; public var Height:int; public var pAry:Array; public function ProcTex( w:int, h:int ){ Width = w; Height = h; BmpData = new BitmapData(Width, Height, false, 0xffffff); TmpBmpData = new BitmapData(Width, Height, false, 0xffffff); Bmp = new Bitmap(BmpData); Bmp.x = 0.0; Bmp.y = 0.0; Bmp.scaleX = 4; Bmp.scaleY = 4; Main.addChild(Bmp); } public function draw():void{ pAry = new Array(); var num:int = Pnt.length; for( var i:int=0; i<num; i++ ){ pAry[i] = new Object; pAry[i].x = Pnt[i].Sp.x * 0.25; pAry[i].y = Pnt[i].Sp.y * 0.25; } switch( Type ){ case 0: drawBmpData0( BmpData ); break; case 1: drawBmpData1( BmpData ); break; case 2: drawBmpData2( BmpData ); break; case 3: drawBmpData3( BmpData ); break; case 4: drawBmpData4( BmpData ); break; } } public function drawBmpData0( bmpData:BitmapData ):void{ var num:int = pAry.length; var i:int, len:int, min:int, min2:int, min3:int, min4:int, dx:int, dy:int, dist:int; var col:int; for( var x:int=0; x<Width; x++ ){ for( var y:int=0; y<Height; y++ ){ min = 999999; min2 = 999999; min3 = 999999; min4 = 999999; for( i=0; i<num; i++ ){ dx = x - pAry[i].x; dy = y - pAry[i].y; dx *= dx; dy *= dy; dist = dx+dy; if( min4 > dist ) min4 = dist; if( min3 > min4 ) { min4 = min3; min3 = dist; } if( min2 > min3 ) { min3 = min2; min2 = dist; } if( min > min2 ) { min2 = min; min = dist; } } min = Math.sqrt(min); min2 = Math.sqrt(min2); min3 = Math.sqrt(min3); min4 = Math.sqrt(min4); col = 1*min4 + 1*min3 + 18*min2 - 8*min; col = col / 4 - 4; if( col > 255 ) col = 255; if( col < 0 ) col = 0; // col = 255 - col; bmpData.setPixel(x, y, col/2+col/4 + (col<<8) + (col/4<<16)); } } } public function drawBmpData1( bmpData:BitmapData ):void{ var num:int = pAry.length; var i:int, len:int, min:int, min2:int, min3:int, min4:int, dx:int, dy:int, dist:int; var col:int; for( var x:int=0; x<Width; x++ ){ for( var y:int=0; y<Height; y++ ){ min = 999999; min2 = 999999; min3 = 999999; min4 = 999999; for( i=0; i<num; i++ ){ dx = x - pAry[i].x; dy = y - pAry[i].y; if( dx < 0 ) dx *= -1; if( dy < 0 ) dy *= -1; dist = dx+dy; if( min4 > dist ) min4 = dist; if( min3 > min4 ) { min4 = min3; min3 = dist; } if( min2 > min3 ) { min3 = min2; min2 = dist; } if( min > min2 ) { min2 = min; min = dist; } } col = 1*min4 + 1*min3 + 18*min2 - 8*min; col = col / 3 - 32; if( col > 255 ) col = 255; if( col < 0 ) col = 0; bmpData.setPixel(x, y, col + (col<<8) + (col<<16)); } } } public function drawBmpData2( bmpData:BitmapData ):void{ var num:int = pAry.length; var i:int, len:int, min:int, min2:int, min3:int, min4:int, dx:int, dy:int, dist:int; var col:int; for( var x:int=0; x<Width; x++ ){ for( var y:int=0; y<Height; y++ ){ min = 999999; min2 = 999999; min3 = 999999; min4 = 999999; for( i=0; i<num; i++ ){ dx = x - pAry[i].x; dy = y - pAry[i].y; dx *= dx; dy *= dy; dist = dx+dy; if( min4 > dist ) min4 = dist; if( min3 > min4 ) { min4 = min3; min3 = dist; } if( min2 > min3 ) { min3 = min2; min2 = dist; } if( min > min2 ) { min2 = min; min = dist; } } min = Math.sqrt(min); min2 = Math.sqrt(min2); min3 = Math.sqrt(min3); min4 = Math.sqrt(min4); col = -2*min4 - 2*min3 + 8*min2 + 5*min; col = col / 2 + 64; if( col > 255 ) col = 255; if( col < 0 ) col = 0; col = 255 - col; bmpData.setPixel(x, y, col/2+col/3 + (col/2+col/8<<8) + (col<<16)); } } } public function drawBmpData3( bmpData:BitmapData ):void{ var num:int = pAry.length; var i:int, len:int, min:int, min2:int, min3:int, min4:int, dx:int, dy:int, dist:int; var col:int; for( var x:int=0; x<Width; x++ ){ for( var y:int=0; y<Height; y++ ){ min = 999999; min2 = 999999; min3 = 999999; min4 = 999999; for( i=0; i<num; i++ ){ dx = x - pAry[i].x; dy = y - pAry[i].y; dx *= dx; dy *= dy; dist = dx+dy; if( min4 > dist ) min4 = dist; if( min3 > min4 ) { min4 = min3; min3 = dist; } if( min2 > min3 ) { min3 = min2; min2 = dist; } if( min > min2 ) { min2 = min; min = dist; } } min = Math.sqrt(min); min2 = Math.sqrt(min2); min3 = Math.sqrt(min3); min4 = Math.sqrt(min4); col = 0*min4 + 1*min3 * min2 + min / 2; col = col / 3 - 96; if( col > 255 ) col = 255; if( col < 0 ) col = 0; col = 255 - col; bmpData.setPixel(x, y, col + (col<<8) + (col<<16)); } } } import frocessing.color.ColorHSV; public function drawBmpData4( bmpData:BitmapData ):void{ var num:int = pAry.length; var colTbl:Array = new Array(); for( i=0; i<num; i++ ){ colTbl[i] = new ColorHSV(i*36-18, 0.5, 1).value32; } var i:int, len:int, min:int, min2:int, min3:int, min4:int, dx:int, dy:int, dist:int; var col:int, no:int; for( var x:int=0; x<Width; x++ ){ for( var y:int=0; y<Height; y++ ){ min = 999999; min2 = 999999; min3 = 999999; min4 = 999999; for( i=0; i<num; i++ ){ dx = x - pAry[i].x; dy = y - pAry[i].y; dx *= dx; dy *= dy; dist = dx+dy; if( min4 > dist ) min4 = dist; if( min3 > min4 ) { min4 = min3; min3 = dist; } if( min2 > min3 ) { min3 = min2; min2 = dist; no = i} if( min > min2 ) { min2 = min; min = dist; } } min = Math.sqrt(min); min2 = Math.sqrt(min2); min3 = Math.sqrt(min3); min4 = Math.sqrt(min4); col = -1*min4 - 60*min3*min2/256 + 10*min2 + 1*min; col = col * 3 + 64; if( col > 255 ) col = 255; if( col < 0 ) col = 0; col = 255 - col; col = col*col / 256; col = 255 - col; col = (colTbl[no]&0xff)*col/0xff + ((((colTbl[no]&0xff00)>>8)*col/0xff)<<8) + ((((colTbl[no]&0xff0000)>>16)*col/0xff)<<16); //bmpData.setPixel(x, y, col + col*0x100 + col * 0x10000); bmpData.setPixel(x, y, col); } } } } // 制御点マーカークラス class ControlPoint{ public var Sp:Sprite; public var isEnable:Boolean = false; public var Pos:Point; public function ControlPoint( p:Point ){ Sp=new Sprite(); Pos = p; Sp.x = Pos.x; Sp.y = Pos.y; setEnable( true ); Main.stage.addChild(Sp); Sp.addEventListener(MouseEvent.MOUSE_UP, function (event:MouseEvent):void{ Sp.stopDrag(); }); Sp.addEventListener(MouseEvent.MOUSE_DOWN, function (event:MouseEvent):void{ if( isEnable ) Sp.startDrag(); }); } public function setEnable( flg:Boolean ):void{ if( flg == true && isEnable == false ){ Sp.graphics.clear(); Sp.graphics.lineStyle(1.4,0x000000); Sp.graphics.beginFill(0xe0d000,1); Sp.graphics.drawCircle(0,0,5.0); Sp.graphics.endFill(); }else if( flg == false && isEnable == true ){ Sp.graphics.clear(); } isEnable = flg; } } function keyCheckDown(event:KeyboardEvent):void { switch (event.keyCode){ case Keyboard.UP: Type--; break; case Keyboard.DOWN: Type++; break; } if( Type < 0 ) Type = TypeMax-1; if( Type >= TypeMax ) Type = 0; } Code Fullscreen Preview Fullscreen bradsedito takishiki 0xABCDEF onedayitwill.. matacat alibaba tkinjo HaraMakoto OneInchPunch.. : ボロノイ図 ボロノイ図 Math.min Math.sqrt setPixel Point value32 addEventListener BitmapData length Keyboard.DOWN scaleY Keyboard.UP scaleX TextField ColorHSV KeyboardEvent.KEY_DOWN keyCode time MouseEvent KeyboardEvent MouseEvent.MOUSE_UP sort new page view favorite forked pv276 Lq1 bradsedito forked:0 favorite:1lines:313 (diff:40) pv7088 波紋+環境マップ Nao_u forked:8 favorite:41lines:188 (diff:377) tag: DisplacementMapFilter animation beautifl effect effects fx noise particles ripples water waves pv217 forked from: テクスチャ生成実験 adkOHTAH forked:0 favorite:0lines:308 (diff:4)