RADIOHEADのアレ( RA DIOHEA_D / HOU SE OF_C ARDS – Google Code )を僕もやってみた。データの説明とかあまり見てないので色のデータが??だけど、とりあえず僕のところにもトムヨーク増やしてみました。
BitmapData の setPixel32() です。
それにしても重い…。しばらく回しているとろくろ首にみえてきた…。もっといろいろあそんでみたい。
追記
なんだか、note.xさん、MASDAさん、からリンクを張っていただいて恐縮しております。僕のサンプルは、frocessingのテストでつくってたやつなので、ソースを上げておくことにしました。以下ソースです。
package { import flash.display.MovieClip; import flash.display.StageQuality; import org.libspark.thread.Thread; import org.libspark.thread.EnterFrameThreadExecutor; [SWF(width=425, height=600, frameRate=30, backgroundColor=0x000000)] public class TestPlot extends MovieClip { public function TestPlot() { stage.quality = StageQuality.LOW; Thread.initialize(new EnterFrameThreadExecutor()); new TestPlotThread(this).start(); } } } import flash.display.Sprite; import flash.display.Bitmap; import flash.filters.BlurFilter; import flash.net.URLRequest; import flash.geom.Point; import flash.errors.IOError; import org.libspark.thread.Thread; import org.libspark.thread.threads.net.URLLoaderThread; import frocessing.core.F5BitmapData3D; import frocessing.geom.FNumber3D; import frocessing.math.FMath; class TestPlotThread extends Thread { private var _target:Sprite; private var fg:F5BitmapData3D; var w:Number = 425; var h:Number = 600; var dataloader:URLLoaderThread; var vertexs:Array; var colors:Array; public function TestPlotThread( target:Sprite ) { _target = target; fg = new F5BitmapData3D( w, h, false, 0x01000000 ); _target.addChild( new Bitmap( fg.bitmapData, "auto", true ) ); } override protected function run():void { var datauri:String = "1.csv"; dataloader = new URLLoaderThread(new URLRequest(datauri)) dataloader.start(); dataloader.join(); next(setup); error(IOError, errorHandler); error(SecurityError, errorHandler); } protected function setup():void { var dats:Array = dataloader.loader.data.split("\r\n"); vertexs = []; colors = []; var len:int = dats.length; var d:Array; var r:int; var g:int; for ( var i:int; i < len; i++ ) { d = dats[i].split(","); r = Math.min( 0xff, (int(d[3]) + 50) ); g = Math.min( 0xff, (int(d[3]) + 100) ); vertexs[i] = new FNumber3D( Number(d[0]), Number(d[1]), Number(d[2]) ); colors[i] = r << 16 | g << 8 | 0xff; } fg.background( 0, 0.2 ); fg.strokeAlpha = 0.5; next(draw); } var blurfilter:BlurFilter = new BlurFilter( 4 ); var zp:Point = new Point(); var camera_z:Number = 100; var _pan:Number = 0; var _pth:Number = 0; protected function draw():void { fg.bitmapData.applyFilter( fg.bitmapData, fg.bitmapData.rect, zp, blurfilter ); fg.beginDraw(); camera_z += ( 100 + _target.mouseY - camera_z ) * 0.5; _pan += ( -FMath.radians( _target.mouseX - w/2 )*1.5 - _pan ) * 0.2; _pth += ( -FMath.radians( _target.mouseY - h/2 )*0.05 - _pth ) * 0.2; fg.camera( w/2, h/2, camera_z ); fg.translate( w/2, h/4, 0); fg.rotateY( _pan ); fg.rotateX( _pth ); var len:int = vertexs.length; var vt:FNumber3D; for ( var i:int = 0; i < len ; i++ ) { fg.strokeColor = colors[i]; vt = vertexs[i]; fg.pixel( vt.x, vt.y, vt.z ); } fg.endDraw(); next(draw); } private function errorHandler(e:IOError, t:Thread):void { trace("Thread Error."); trace(e.getStackTrace()); next(null); } }
いい加減、きれいにソースを貼ることを考えなくちゃいけない…と思いました。