4節リンク機構シミュレーション
シュミレーションって言っても角度求めて動かしてるだけなんですけどね…
でも、正規の方法じゃない…これが力不足か…
♥0 |
Line 109 |
Modified 2012-05-20 20:36:15 |
MIT License
archived:2017-03-09 16:04:37
ActionScript3 source code
/**
* Copyright Nos_lkSsvOhB ( http://wonderfl.net/user/Nos_lkSsvOhB )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/6PAB
*/
package {
import flash.text.TextField;
import flash.display.Sprite;
import flash.events.Event;
import flash.*;
public class Linkage extends Sprite {
private var a:Number=60;
private var b:Number=140;
private var c:Number=180;
private var d:Number=240;
private var t:Number=10;
private var theta:Number=0;
private var xa:Number=100;
private var ya:Number=280;
private var xc:Number=340;
private var yc:Number=280;
private var xd:Number=100;
private var yd:Number=280;
private var bx0:Number;
private var by0:Number;
private var bx1:Number;
private var by1:Number;
private var link1:Sprite;
private var link2:Sprite;
private var link3:Sprite;
private var link4:Sprite;
private var trace1:TextField;
private var al1:Number;
private var al2:Number;
private var L:Number;
private var L2:Number;
public function Linkage() {
link4=new Sprite();
link4.graphics.beginFill(0x9F9F9F);
link4.graphics.moveTo(-t, -t);
link4.graphics.lineTo(d+t, -t);
link4.graphics.lineTo(d+t, t);
link4.graphics.lineTo(-t, t);
link4.graphics.lineTo(-t, -t);
addChild(link4);
link4.x=xd;
link4.y=yd;
link1=new Sprite();
link1.graphics.beginFill(0x46A099);
link1.graphics.moveTo(-t, -t);
link1.graphics.lineTo(a+t, -t);
link1.graphics.lineTo(a+t, t);
link1.graphics.lineTo(-t, t);
link1.graphics.lineTo(-t, -t);
addChild(link1);
link1.x=xa;
link1.y=ya;
link3=new Sprite();
link3.graphics.beginFill(0x46A099);
link3.graphics.moveTo(-t, -t);
link3.graphics.lineTo(c+t, -t);
link3.graphics.lineTo(c+t, t);
link3.graphics.lineTo(-t, t);
link3.graphics.lineTo(-t, -t);
addChild(link3);
link3.x=xc;
link3.y=yc;
link2=new Sprite();
link2.graphics.beginFill(0x48A046);
link2.graphics.moveTo(-t, -t);
link2.graphics.lineTo(b+t, -t);
link2.graphics.lineTo(b+t, t);
link2.graphics.lineTo(-t, t);
link2.graphics.lineTo(-t, -t);
addChild(link2);
trace1=CreateTF(10,400,300,50);
addEventListener(Event.ENTER_FRAME,onEnter);
}
private function onEnter(event:Event):void {
L=Math.sqrt(a*a+d*d-2*a*d*Math.cos(theta));
L2=a*a+d*d-2*a*d*Math.cos(theta);
al1=-Math.acos((-a*a+d*d+L2)/(2*d*L));
al2=-Math.acos((-b*b+c*c+L2)/(2*c*L));
link1.rotation=theta*180/Math.PI;
bx0=xa+a*Math.cos(theta);
by0=ya+a*Math.sin(theta);
if(by0>=yd){
al1*=-1;
}
bx1=xa+d+c*Math.cos(Math.PI-al1-al2);
by1=ya+c*Math.sin(Math.PI-al1-al2);
link2.x=bx0;
link2.y=by0;
link2.rotation=Math.atan2(by1-by0,bx1-bx0)*180/Math.PI;
link3.rotation=(Math.PI-al1-al2)*180/Math.PI;
if(theta>=2*Math.PI){
theta=0;
}else{
theta+=Math.PI/180*3/2;
}
// trace1.text="L="+L+"\nal1="+al1+"\nal2="+al2;
}
private function CreateTF(a:Number,b:Number,c:Number,d:Number):TextField{
var tf:TextField=new TextField();
tf.x=a;
tf.y=b;
tf.width=c;
tf.height=d;
tf.background=true;
tf.border=true;
addChild(tf);
return tf
}
}
}