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);
}
}
いい加減、きれいにソースを貼ることを考えなくちゃいけない…と思いました。