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();