2008-01-18 | 20:56
最小二乗法で、データを直線に近似するデモ。
赤い点がプロットされたデータのつもりです。マウスドラッグで移動できます。 移動するごとに近似し直しています。
近似部分のプログラムはここのものをほぼそのまま流用しました。
赤い点がプロットされたデータのつもりです。マウスドラッグで移動できます。 移動するごとに近似し直しています。
近似部分のプログラムはここのものをほぼそのまま流用しました。
package{ import flash.display.*; import flash.events.*; import flash.geom.*; import flash.utils.*; import flash.filters.DropShadowFilter; [SWF(width="400", height="200",backgroundColor="0xffffff")] public class Algo2 extends Sprite{ private var balls:Array = []; private var RADIUS:int = 6; private var line:Line = new Line(0xff, 4); public function Algo2(){ var points:Array = [{x:0,y:20}, {x:40,y:38}, {x:80,y:64}, {x:120,y:86}, {x:160, y:96}, {x:200, y:122} , {x:120, y:36}, {x:220, y:102} , {x:240,y:144}]; for(var i:int = 0 ; i < points.length ; i++){ var b:Ball = new Ball(0xff0000, RADIUS); balls.push(b); addChild(b); b.x = points[i].x; b.y = points[i].y; b.addEventListener( MouseEvent.MOUSE_DOWN, pickup ); b.addEventListener( MouseEvent.MOUSE_UP, place ); b.addEventListener( MouseEvent.MOUSE_MOVE, function(e:*):void{ cal(); }); } addChild(line); cal(); } public function pickup( event:MouseEvent ):void { // ドラッグ処理を開始して、影フィルターをつける event.target.startDrag( ); event.target.filters = [ new DropShadowFilter( ) ]; // 最前面に表示されるようにする setChildIndex( DisplayObject( event.target ), numChildren - 1 ); } public function place( event:MouseEvent ):void { // ドラッグ処理を終了して影フィルターをオフ event.target.stopDrag( ); event.target.filters = null; cal(); } private function cal() :void{ var a:Number = 0; var b:Number = 0; var sum_xy:Number = 0, sum_x:Number = 0, sum_y:Number = 0, sum_x2:Number = 0; for each(var ball:Ball in balls) { sum_xy += ball.x * ball.y; sum_x += ball.x; sum_y += ball.y; sum_x2 += ball.x * ball.x; } a = ( balls.length * sum_xy - sum_x * sum_y) / (balls.length * sum_x2 - sum_x*sum_x); b = (sum_x2 * sum_y - sum_xy * sum_x) / (balls.length * sum_x2 - sum_x*sum_x); line.x = 0; line.y = b; line.rotation = Math.atan(a) / Math.PI * 180; } } } import flash.display.*; internal class Ball extends Sprite{ public function Ball(color:int, radius:int){ graphics.beginFill(color); graphics.drawCircle(0,0,radius); graphics.endFill(); } } internal class Line extends Sprite{ public function Line(color:int, w:int){ graphics.lineStyle(w, color, 0.5); graphics.moveTo(0,0); graphics.lineTo(400, 0); } }
スポンサーサイト
Comment
Post a comment