Flash CS4+ActionScript 3.0으로 리사주 커브(Lissajou
Curve) 그리는 프로그램 만들기. 웹 서핑하다가 리사주 커브란 것의 존재를 알게되어 구현해 본 것.
* 좌하단 x, y 입력란에 숫자를 입력하고 엔터키를 클릭하면 커브의 모양이 변화한다.
* 키보드의 상하좌우 키로 커브의 중심점을 이동할 수 있다.
공식 중 x0, y0를 각각 x, y의 이전위치라고 잘못 생각해 초반에 좀 헤메다.
커브 중심점의 x, y 좌표였다.
Lx, Ly는 각각 너비와 높이를 정하는 수치.
핵심은 계속 변화하는 각도 wt의 증가. 그리고 wt에 곱하는 x, y의 비율을 변경함에 따라 모양이 변화한다는
것.
15/4/09 목
* 위키피디아
리사주 커브 항목(영문)
|
화면에 'c'란 이름의 빨간 원 무비클립을 만들어 두다.
var px=0, py=0; //이전 x,y위치 저장용
var Lx=50, Ly=50, wt=0; //너비, 높이 한계, 이동속도
var centerX=100, centerY=150; //중심점 좌표
var xNum=1, yNum=2; //xy 비율관련 비율에따라 모양이 변화
var speed = 3; //키보드에 의한 이동속도
var left, right, up, down:Boolean=false;
var lcolor=0; //선 색깔 저장용
function init(){
xInput.text = "1", yInput.text = "2";
xNum = Number(xInput.text);
yNum = Number(yInput.text);
px = c.x, py = c.y;
stage.addEventListener(Event.ENTER_FRAME,loop);
stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDowns);
stage.addEventListener(KeyboardEvent.KEY_UP,keyUps);
}
function loop(e:Event){
keyProcess(); //키보드 처리(중심점 이동)
if(wt < 12.5){
wt += 0.05;
}else{
wt = 0;
graphics.clear();
lcolor = Math.random()*16777215;
}
lissajousMove(c, centerX, centerY, Lx, Ly);
lineDraw01(px, py, c.x, c.y, 1, lcolor);
px = c.x, py = c.y;
}
function lissajousMove(object, centerX, centerY, Lx, Ly){
//Lissajous 도형관련 나비모양 움직임
//(움직일 물체, 중앙x, y좌표, 너비한계, 높이한계)
object.x = centerX + Math.cos(xNum * wt) * Lx;
object.y = centerY + Math.sin(yNum * wt) * Ly;
}
function changeXY(){ //x,y 비율 변경해 리사주 커브 모양 바꾸기
xNum = Number(xInput.text);
yNum = Number(yInput.text);
}
function lineDraw01(mX,mY,tX,tY,style1=1,style2=0){ //선그리기 함수
//(mX,mY)위치로 이동, 그곳에서 (tX,tY)까지 style(굵기,색)대로 선그리기
graphics.lineStyle(style1, style2);
graphics.moveTo(mX, mY);
graphics.lineTo(tX, tY);
}
function keyProcess(){ //키보드 처리
if(left && centerX > 0){ centerX -= speed; }
if(right && centerX < stage.stageWidth){ centerX += speed; }
if(up && centerY > 0){ centerY -= speed; }
if(down && centerY < stage.stageHeight){ centerY += speed; }
}
function keyDowns(e:KeyboardEvent){ //키보드 눌릴때
switch(e.keyCode){
case(37): left = true; break; //left
case(39): right = true; break; //right
case(38): up = true; break; //up
case(40): down = true; break; //down
}
}
function keyUps(e:KeyboardEvent){ //키보드 뗄 때
switch(e.keyCode){
case(37): left = false; break; //left
case(39): right = false; break; //right
case(38): up = false; break; //up
case(40): down = false; break; //down
case(13): changeXY(); break; //Enter key
}
}
init();
|