パスカルのリマソン
dkgkAs さんの 「サイン・コサインを使った円運動」に
インスパイアされて作りました
http://wonderfl.net/code/f39581f3651295921f511ed37d118ef0a95a6a56
アニメーションの意味:
第1円の周上に第2円の中心を置き
第2円を第1円の2倍の速さで回転させるなら
第2円上の点はリマソン(蝸牛線)を描く
次にはリマソンの本来の定義との関連を描き込まなくちゃ
/**
* Copyright tenasaku ( http://wonderfl.net/user/tenasaku )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/nqp5
*/
package {
// dkgkAs さんの 「サイン・コサインを使った円運動」に
// インスパイアされて作りました
// http://wonderfl.net/code/f39581f3651295921f511ed37d118ef0a95a6a56
// アニメーションの意味:
// 第1円の周上に第2円の中心を置き
// 第2円を第1円の2倍の速さで回転させるなら
// 第2円上の点はリマソン(蝸牛線)を描く
// 次にはリマソンの本来の定義との関連を描き込まなくちゃ
import flash.display.Sprite;
import flash.events.Event;
import flash.text.TextField;
[SWF(width="465",height="465",backgroundColor="0xffffff",frameRate="25")]
public class FlashTest extends Sprite {
private const _cx:Number = stage.stageWidth/2;
private const _cy:Number = stage.stageHeight/2;
private var _wh1:Wheel; // first coorinate system
private var _wh2:Wheel; // second cooridnate system
private const _radius1:Number = 80;
private const _radius2:Number = _radius1;
// private var _tf:TextField;
public function FlashTest() {
draw_limacon();
_wh1 = new Wheel(_radius1);
_wh1.showAxis = true;
_wh1.circColor = 0x808080;
_wh1.armColor = 0x006699;
_wh1.dotColor = 0x006699;
_wh1.redraw();
_wh1.x = _cx;
_wh1.y = _cy;
addChild(_wh1);
_wh2 = new Wheel(_radius2);
_wh2.showAxis = true;
_wh2.circColor = 0x006699;
_wh2.armColor = 0x006699;
_wh2.dotColor = 0x006699;
_wh2.redraw();
_wh2.x = _wh1.x + _wh1.vX();
_wh2.y = _wh1.y + _wh1.vY();
addChild(_wh2);
stage.addEventListener(Event.ENTER_FRAME,turn_wheels);
// _tf = new TextField();
// _tf.x = 3;
// _tf.y = 11;
// addChild(_tf);
}
private function turn_wheels(e:Event):void {
_wh1.theta += Math.PI/180;
while (_wh1.theta >= 2*Math.PI) { _wh1.theta -= 2*Math.PI; }
_wh1.redraw();
_wh2.theta = 2*_wh1.theta;
_wh2.x = _wh1.x + _wh1.vX();
_wh2.y = _wh1.y + _wh1.vY();
_wh2.redraw();
// _tf.text = String(_wh1.theta);
}
private function draw_limacon():void {
var i:int;
var px:Number;
var py:Number;
var t:Number;
for (i = 0; i<=360; ++i) {
t = i*Math.PI/180;
px = _cx + _radius1*Math.cos(t)+_radius2*Math.cos(t*2);
py = _cy - _radius1*Math.sin(t)-_radius2*Math.sin(t*2);
if ( i == 0 ) {
this.graphics.lineStyle(2,0x990000);
this.graphics.moveTo(px,py);
}
else {
this.graphics.lineTo(px,py);
}
}
}
}
}
import flash.display.Sprite;
class Wheel extends Sprite {
private const dot_r:Number = 3;
private const arm_thick:Number = 2;
private const axisColor:uint = 0x808080;
public var radius:Number;
public var theta:Number;
public var dotColor:uint;
public var armColor:uint;
public var circColor:uint;
public var showAxis:Boolean;
public function Wheel(_rad:Number):void {
dotColor = 0x000000;
armColor = 0x000000;
circColor = 0x000000;
theta = 0;
radius = _rad;
showAxis = false;
}
public function vX():Number {
return this.radius*Math.cos(this.theta);
}
public function vY():Number {
return -(this.radius*Math.sin(this.theta));
}
public function redraw():void {
var px:Number = this.vX();
var py:Number = this.vY();
this.graphics.clear();
if (this.showAxis) {
this.graphics.lineStyle(1,axisColor);
this.graphics.moveTo(0,-2.1*this.radius);
this.graphics.lineTo(0,+2.1*this.radius); // Y軸
this.graphics.moveTo(-2.1*this.radius,0);
this.graphics.lineTo(+2.1*this.radius,0); // X軸
}
this.graphics.lineStyle(1,this.circColor);
this.graphics.drawCircle(0,0,this.radius);
this.graphics.lineStyle(arm_thick,this.armColor);
this.graphics.moveTo(0,0);
this.graphics.lineTo(px,py);
this.graphics.lineStyle(0,this.dotColor);
this.graphics.beginFill(this.dotColor);
this.graphics.drawCircle(px,py,dot_r);
this.graphics.endFill();
}
}