In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

ベジェをスムーズにつないでいく

bitmapFilterできれいに見えるようにした。
しまった。forkにするべきだった。
package {
//    bitmapFilterできれいに見えるようにした。
//    しまった。forkにするべきだった。
    import flash.display.Sprite;
    import flash.display.Shape;
    import flash.display.Bitmap;
	import flash.display.Stage;
	import flash.display.BitmapData;
	import flash.display.DisplayObjectContainer;
	import flash.display.LineScaleMode;
	import flash.display.BlendMode;
    import flash.geom.Rectangle;
    import flash.geom.Point;
	import flash.events.Event;
	import flash.utils.ByteArray;
	import flash.filters.BlurFilter;
	
    public class curve extends Sprite {
		var shape1:Shape;
		var shape2:Shape;
		var bmp:Bitmap;
		var curves:Object;
		var rotationColor:Number;
		var stg:DisplayObjectContainer;
		
		var mouseRad:Number;
	    var mouseRadScale:Number;
		
        public function curve() {
			shape1=new Shape();//主線描画用
			shape2=new Shape();//補助線描画用
			bmp=new Bitmap(new BitmapData(stage.stageWidth,stage.stageHeight,true,0x00000000),"auto",true);//bitmap処理用
			shape2.graphics.lineStyle(0, 0x0000ff, .2, true , LineScaleMode.NONE);
			
			addChild(bmp);
			addChild(shape2);
			addChild(shape1);
			
			curves=new Object();			
			init();
			//mouseRad=0;
			//mouseRadScale=20;
			addEventListener(Event.ENTER_FRAME,update);
		}
			
		function init(){
			rotationColor=Math.random()*0xffffff;
			shape1.graphics.clear();
			shape2.graphics.clear();

			curves.x=100;//Math.random()*550;
			curves.y=100;//Math.random()*400;
			shape1.graphics.moveTo(curves.x,curves.y);
			shape1.graphics.lineStyle(0, rotationColor, .5, true , LineScaleMode.NONE);
			curves.before=clone(curves);
			
			curves.x=120+Math.random()*20;
			curves.y=120+Math.random()*20;
			
			var cx=(curves.before.x+curves.x)/2;
			var cy=(curves.before.y+curves.y)/2
			var line=new Rectangle(curves.x,curves.y,curves.before.x,curves.before.y);
			var turnLi:Point=getCrossLine(line);
			var lineL=getLineLength(line);
			trace(cx+" "+cy+" "+turnLi.x+" "+lineL);
			var cpS=cy-turnLi.x*cx;
			
			
			
			curves.ControlX=Math.sqrt(Math.abs(Math.pow(1/turnLi.x,2)))*lineL/2*(Math.round(Math.random())*2-1)+cx;
			curves.ControlY=turnLi.x*curves.ControlX+cpS;
			trace(curves.ControlX+":"+curves.ControlY);
			curves.before=clone(curves);
			shape1.graphics.curveTo(curves.ControlX,curves.ControlY,curves.x,curves.y);
			
			shape2.graphics.lineStyle(0, 0x00ff00, .25, true , LineScaleMode.NONE);
			shape2.graphics.drawCircle(curves.ControlX,curves.ControlY,5);
			
		}
		
		function update(e:Event){
			var vec1=new Object();
			vec1.vx=curves.before.x-curves.before.ControlX;
			vec1.vy=curves.before.y-curves.before.ControlY;
			vec1.vl=Math.sqrt(Math.pow(vec1.vx,2)+Math.pow(vec1.vy,2));
			vec1.ux=vec1.vx/vec1.vl;
			vec1.uy=vec1.vy/vec1.vl;
			
			vec1.t=vec1.vy/vec1.vx;
			vec1.s=curves.before.y-vec1.t*curves.before.x;
			
			//shape2.graphics.moveTo(0,vec1.s);
			//shape2.graphics.lineTo(550,vec1.t*550+vec1.s);
			
			//---
			var cnt=0;
			mouseRad+=.1;

			do{

			
/*			var tagetpointX=this.mouseX+Math.cos(mouseRad)*mouseRadScale;
			var tagetpointY=this.mouseY+Math.sin(mouseRad)*mouseRadScale;
			var vectpX=tagetpointX-(curves.before.x);//+vec1.vx);
			var vectpY=tagetpointY-(curves.before.y);//+vec1.vy);
			var vectpL=Math.sqrt(Math.pow(vectpX,2)+Math.pow(vectpY,2));
			trace(vectpL);
			var vectpUX=vectpX/vectpL;
			var vectpUY=vectpY/vectpL;
*/			
			
			curves.x=curves.before.x+vec1.vx+Math.random()*100-50;
			curves.y=curves.before.y+vec1.vy+Math.random()*100-50;
			var vl=Math.sqrt(Math.pow(curves.x-curves.before.x,2)+Math.pow(curves.y-curves.before.y,2));
			cnt++;
			if(cnt>10000){trace("行き詰った");init();return;}// "+vl+":"+curves.x+":"+curves.y);init();return;}
			}while(vl<50 || vl>200 || curves.x<0 || curves.x>stage.stageWidth || curves.y<0 || curves.y>stage.stageHeight);
			
			rotationColor=(rotationColor+7)*int(rotationColor<0xdddddd);
			shape1.graphics.lineStyle(0, rotationColor, .5, true , LineScaleMode.NONE);
			//curves.ControlX=Math.random()*(Number(vec1.vx>0)*450-curves.before.x)+curves.before.x+(Number(vec1.vx>0)*2-1)*100;

			curves.ControlX=curves.before.x+vec1.vx;
			curves.ControlY=vec1.t*curves.ControlX+vec1.s;

			
			shape1.graphics.curveTo(curves.ControlX,curves.ControlY,curves.x,curves.y);

			shape2.graphics.drawCircle(curves.x,curves.y,2);
			shape2.graphics.drawCircle(curves.ControlX,curves.ControlY,5);
			shape2.graphics.moveTo(curves.before.x,curves.before.y);
			shape2.graphics.lineTo(curves.ControlX,curves.ControlY);
			shape2.graphics.lineTo(curves.x,curves.y);
			shape2.graphics.lineTo(curves.before.x,curves.before.y);
		
			curves.before=null;
			curves.before=clone(curves);
			
			bmp.bitmapData.draw(shape1,null,null,"screen");
			bmp.bitmapData.applyFilter(bmp.bitmapData,new Rectangle(0,0,this.width,this.height),new Point(0,0),new BlurFilter(4,4));
		}
		
		function getLineLength(p:Rectangle):Number{
			var vx=p.x-p.width;
			var vy=p.y-p.height;
			var vl=Math.sqrt(Math.pow(vx,2)+Math.pow(vy,2));
			return vl;
		}
		
		function getLine(p:Rectangle):Point{
			var vx=p.x-p.width;
			var vy=p.y-p.height;
			//var vl=Math.sqrt(Math.pow(vx,2)+Math.pow(vy,2));
			var ts=new Point();
			ts.x=vy/vx;
			ts.y=p.height-ts.x*p.width;
			return ts;
		}
		
		function getCrossLine(p:Rectangle):Point{
			var vx=p.x-p.width;
			var vy=p.y-p.height;
			var ts=new Point();
			ts.x=-vx/vy;
			ts.y=p.y-ts.x*p.x;
			return ts;
		}
		
		function clone( arg:* ) :*{
			var myBA:ByteArray = new ByteArray();
			myBA.writeObject(arg);
			myBA.position = 0;
			return( myBA.readObject() );
		}

    }
}