package {
import flash.display.MovieClip;
import flash.events.Event;
import flash.display.Graphics;
import flash.geom.Point;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.display.Sprite;
import com.bit101.components.Label;
import com.bit101.components.PushButton;
import com.bit101.components.HSlider;
import com.bit101.components.Component;
import com.bit101.components.CheckBox;
import flash.geom.ColorTransform;
import flash.utils.*
import com.bit101.components.Slider;
[SWF(backgroundColor=0xffffff, width=480, height=480, frameRate=60)]
public class Fibo extends MovieClip {
public var g:Graphics;
public var h:int;
public var w:int;
public var m:Point;
public var mo:Point;
public var cm:Point;
public var sf:Number=1;
public var points:Array=[];
public var O:Point;
public var isDown:Boolean=false;
public var ObjClicked:Boolean=false;
public var Htxs:Vector.<Label>;
public var Vtxs:Vector.<Label>;
public var a:Object;
public var c:Object
public var clickables:Array=[];
public var q:Object
public var zoomIn:PushButton;
public var zoomOut:PushButton;
public var theta:Number=0;
public var k:int=1;
public var f1=2;
public var f0=3;
public function Fibo() {
Htxs=new Vector.<Label>();
Vtxs=new Vector.<Label>();
g=this.graphics;
h=stage.stageHeight;
w=stage.stageWidth;
m=new Point();
mo=new Point();
cm=new Point();
O=new Point(w/2,h/2);
var mc:Sprite=new Sprite();
var qc:Sprite=new Sprite();
qc.graphics.beginFill(0x101010);
qc.graphics.drawRect(0,0,w,h);
qc.addChild(mc);
this.addChild(qc)
var step:Number=10;
var st:Number = 0;
var gc:Graphics=qc.graphics;
gc.lineStyle(1,0xffffff,.1)
for(var i:int;i<6;i++){
var tx:Label=new Label(this);
tx.text="0";
tx.x=i*(w/6);
tx.y=O.y;
Htxs.push(tx);
}
for(i=0;i<6;i++){
tx=new Label(this);
tx.y=i*(w/6);
tx.x=O.x;
Vtxs.push(tx);
}
a={x:-1,y:0,isClicked:false,update:null};;
c={x:0,y:-1,isClicked:false,update:null};
c.update=a.update=function (o:Object){
o.x=sf*(stage.mouseX-O.x)/w
o.y=sf*(stage.mouseY-O.y)/w
}
clickables.push(a);
clickables.push(c);
zoomIn=new PushButton(this,0,0,"+");
zoomIn.width=25;
zoomOut=new PushButton(this,0,zoomIn.height,"-");
zoomOut.width=25;
zoomIn.addEventListener(MouseEvent.CLICK,onZoomIn);
zoomOut.addEventListener(MouseEvent.CLICK,onZoomOut);
g=mc.graphics;
var l:Label=new Label(this,30,10,"use the red point to rotate spiral");;
setInterval (function helloFun():void {
if(k>8) return
var q=f0+f1;
f0=f1;
f1=q;
trace(f1)
k+=1
}, 2000);
qc.addEventListener(MouseEvent.MOUSE_DOWN,onMD);
qc.addEventListener(MouseEvent.MOUSE_UP,onMU);
this.addEventListener(Event.ENTER_FRAME,loop);
}
public function onZoomIn(e:MouseEvent){
if(sf<0) sf+=.5;
f1+=.4;
}
public function onZoomOut(e:MouseEvent){
f1-=.4;
}
public function onMD(e:MouseEvent){
isDown=true;
m.setTo(stage.mouseX,stage.mouseY);
}
public function onMU(e:MouseEvent){
isDown=false;
ObjClicked=false;
for each(var o:Object in clickables){o.isClicked=false;}
O=O.add(mo);
mo.setTo(0,0);
}
public function loop(e:Event):void{
if(true){sf+=(f1-sf)*.2}
g.clear();
if(isDown && ObjClicked==false){
cm.setTo(stage.mouseX,stage.mouseY);
mo.setTo(cm.x-m.x,cm.y-m.y);
O=O.add(mo);
g.moveTo(m.x,m.y);
g.lineTo(cm.x,cm.y);
}
draw();
for(var i:int;i<6;i++){
var tx:Label=Htxs[i];
tx.y=O.y;
tx.y=Math.max(tx.y,0);
tx.y=Math.min(tx.y,h-15)
var xt:Number = (i / 6) *sf-(O.x/w)*sf;
tx.text=xt.toFixed(2)+"";
var tx2:Label=Vtxs[i];
tx2.x=O.x;
tx2.x=Math.max(tx2.x,0)
tx2.x=Math.min(tx2.x,w-15)
xt = (i / 6) *sf-(O.y/h)*sf;
xt*=-1;
tx2.text=xt.toFixed(2)+"";
}
drawLim();
O=O.subtract(mo);
}
public function drawFiboRect(e:Object,d1:Number,d2:Number){
g.lineStyle(1,0x00f6ff);
var l=1/Math.sqrt(e.x*e.x+e.y*e.y);
var dx=d1+d2;
var vx=e.x*l*dx;
var vy=e.y*l*dx;
var p=new Point(-vx+e.x,-vy+e.y);
var p2=new Point(-vy+p.x,vx+p.y);
var p3=new Point(-vy+e.x,vx+e.y);
g.moveTo(e.x*w/sf+O.x,e.y*w/sf+O.y)
g.lineTo(p.x*w/sf+O.x,p.y*w/sf+O.y)
g.lineTo(p2.x*w/sf+O.x,p2.y*w/sf+O.y)
g.lineTo(p3.x*w/sf+O.x,p3.y*w/sf+O.y)
g.lineTo(e.x*w/sf+O.x,e.y*w/sf+O.y)
var ep=new Point(e.x-p.x,e.y-p.y)
drawp(p,ep,0,1,1)
}
public function drawp(e:Object,dir:Object,d1:Number,d2:Number,n:Number){
var dx=d1+d2;
dir.x*=dx;
dir.y*=dx;
var norm=new Point(-dir.y,dir.x);
if(n%2==0) {
norm.x*=-1;
norm.y*=-1
}
g.lineStyle(1,0x00f6ff)
var p1=new Point(e.x+dir.x,e.y+dir.y);
var p2=new Point(p1.x+norm.x,p1.y+norm.y)
var p3=new Point(e.x+norm.x,e.y+norm.y)
g.moveTo(e.x*w/sf+O.x,e.y*w/sf+O.y)
g.lineTo(p1.x*w/sf+O.x,p1.y*w/sf+O.y)
g.lineTo(p2.x*w/sf+O.x,p2.y*w/sf+O.y)
g.lineTo(p3.x*w/sf+O.x,p3.y*w/sf+O.y)
g.lineTo(e.x*w/sf+O.x,e.y*w/sf+O.y)
dir.x/=dx;
dir.y/=dx;
var nn=dir;
if(n%2==0){
dir.x*=-1;
dir.y*=-1;
}
g.lineStyle(1,0xffffff,.2)
var qp=p1
if(n%2==0){
qp=p3
}
g.drawCircle((qp.x)*w/sf+O.x,(qp.y)*w/sf+O.y,dx*w/sf);
var len=(dx*w/sf)/4
var phi=Math.atan2(-a.y,-a.x);
var R=dx
var step=(Math.PI)/2
step=step/len;
var t=phi;
var s=1
g.lineStyle(2,0xff0000)
var _x;
var _y;
t=(0/len)*(Math.PI/2)-n*(Math.PI/2)+phi;
_x=Math.cos(t)*R+qp.x;
_y=Math.sin(t)*R+qp.y;
g.moveTo(_x*w/sf+O.x,_y*w/sf+O.y)
for(var i=0;i<len;i++){
t=(i/len)*(Math.PI/2)-n*(Math.PI/2)+phi;
_x=Math.cos(t)*R+qp.x;
_y=Math.sin(t)*R+qp.y;
g.lineTo(_x*w/sf+O.x,_y*w/sf+O.y)
}
if(n>=k) return;
drawp(new Point(p1.x+norm.x,p1.y+norm.y),nn,d2,d1+d2,n+1)
}
public function recFib(e:Object,d2:Number,d1:Number){
}
public function drawLim(){
drawFiboRect(a,0,1)
g.beginFill(0xff0000);
g.lineStyle(0,0,0)
g.drawCircle(a.x*w/sf+O.x,a.y*h/sf+O.y,6)
g.endFill()
if(isDown){
for each(var o:Object in clickables){
var m=new Point(o.x*w/sf+O.x-stage.mouseX,o.y*w/sf+O.y-stage.mouseY)
var d:Number=m.x*m.x+m.y*m.y;
if(o.isClicked==true && o.update!=null) o.update(o);
if(d<25) {
if(ObjClicked==false){
ObjClicked=true;
o.isClicked=true;
}
}
}
}
}
public function draw(){
g.lineStyle(1,0xffffff);
g.moveTo(0, O.y);
g.lineTo(w, O.y);
g.moveTo(O.x, 0);
g.lineTo(O.x, h);
}
}
}