Flash+actionScript 3.0으로 XY 좌표축 그리고 함수 그래프 그리기 테스트.
플래시 화면 위에서 마우스 드래그로 좌표 중심점의 이동이, 마우스 휠로 좌표의 확대, 축소가 가능하다.

하는 김에 동적으로 함수를 입력받아 그래프로 표시해주는 기능도 넣고 싶었지만 실패. 현재로써는 수식을 해석하거나 혹은 변형하는 것이 그리 만만한 작업이 아닌듯 느껴진다.

xy 좌표 그리기: drawCoordinates(), lineDraw01() 2 함수로 구현.
함수 그래프 그리기: drawFunc(), adjustCenter()
마우스 드래그로 이동, 마우스 휠로 확대축소하기.

14/8/7 목

actionScript 3.0 소스 코드:
var centerX = 250, centerY = 300; //원점 좌표
var mag:Number = 2; //확대율
var mX, mY, mdx, mdy; //마우스 x,y좌표 저장용

function init(){ //초기화
     draws();
     stage.addEventListener(MouseEvent.MOUSE_DOWN,mDown);
     stage.addEventListener(MouseEvent.MOUSE_UP,mUp);
     stage.addEventListener(MouseEvent.MOUSE_WHEEL,mWheel);
}
function draws(){ //좌표와 함수 그래프 그리기
     drawCoordinates(centerX,centerY,mag*10);
     drawFunc(-200,200,2);
}
function mDown(e:MouseEvent){ //마우스 누를때
     mX = mouseX; //마우스 눌린 좌표 기억
     mY = mouseY;
}
function mUp(e:MouseEvent){ //마우스 놓을때
//마우스 눌렀을 때와 놓았을때의 차이를 기준으로
//중심점 이동하여 새로 그리기
     mdx = mX - mouseX;
     mdy = mY - mouseY;
     centerX -= mdx;
     centerY -= mdy;
     graphics.clear();
     draws();
}
function mWheel(e:MouseEvent){ //마우스 휠 돌릴때
//마우스 휠 돌릴때마다 확대 축소율 조정한 뒤 새로 그리기
     if(e.delta > 0){
          if(mag < 50) mag++;
     }else{
          if(mag > 1) mag--;
     }
     graphics.clear();
     draws();
}
function drawFunc(sx:Number,ex:Number,term=10){ //함수 그래프 그리기
//(시작x값,끝x값,간격-기본10)
     var nx, ny, tx, ty;
     tx = sx;
     ty = 1/50*Math.pow(sx,2)+7; 
     graphics.lineStyle(1, 0xff00cc);
     graphics.moveTo(adjustCenter(sx,"x"), adjustCenter(ty,"y"));
     for(var i=sx; i < ex; i += term){
          tx = i;
          ty = 1/50*Math.pow(tx,2)+7;
          nx = adjustCenter(tx,"x",mag);
          ny = adjustCenter(ty,"y",mag);
          graphics.lineTo(nx, ny);
     }
}
function adjustCenter(o, XorY:String, magnificate=10){
//좌표 중앙으로 중심점 이동(원 좌표, x 혹은 y, 확대율)
     //(original 좌표, x여부)
     o *= magnificate;
     if(XorY=="x"){
          o += centerX;
     }else if(XorY=="y"){
          o -= centerY;
          o *= -1;
     }
     return o;
}
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 drawCoordinates(cx,cy,term){ //좌표 그리기
     //중심점 x,y좌표와 간격을 받아 좌표 그리기.
     var i = term;
     for(i=cy;i>0;i-=term){
          lineDraw01(0,i,stage.stageWidth,i,1,0xcccccc);
     }
     for(i=cy;i < stage.stageHeight;i+=term){
          lineDraw01(0,i,stage.stageWidth,i,1,0xcccccc);
     }
     for(i=cx;i>0;i-=term){
          lineDraw01(i,0,i,stage.stageHeight,1,0xcccccc);
     }
     for(i=cx;i < stage.stageWidth;i+=term){
          lineDraw01(i,0,i,stage.stageHeight,1,0xcccccc);
     }
     lineDraw01(cx,0,cx,stage.stageHeight,1,0x666666);//y축 그리기
     lineDraw01(0,cy,stage.stageWidth,cy,1,0x666666);//x축 그리기
}

init();