Flash CS4 + ActionScript 3.0으로 시그모이드(Sigmoid) 함수 그리기.

이전(2014/8/7)에 만들어 뒀던 XY축 그래프 그리기 툴에 시그모이드 함수를 적용한 것.

이 시그모이드 함수는 Smooth In, Smooth Out 형태를 띄고 있어 시작과 끝이 부드럽게 변화하는 움직임에 이용 가능하다.
인공지능 신경망 알고리즘에서 처음 봤고 예전에 스크롤바의 크기 조절에 써먹어 볼까 시도했다가 관둔 함수다.

15/4/27 월

위키피디아 시그모이드 함수 항목(영문)

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(-150,200,"sigmoid",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,exp,term=10){ //함수 그래프 그리기
//(시작x값,끝x값,방정식,간격-기본10)
	var nx, ny, tx, ty, count=0;
	tx = sx;
	ty = 100/(1+Math.pow(Math.E,(-sx/10))); //시그모이드 함수
	graphics.lineStyle(1, 0xff00cc);
	graphics.moveTo(adjustCenter(sx,"x"), adjustCenter(ty,"y"));
	for(var i=sx; i < ex; i += term){
		tx = i;
		ty = 100/(1+Math.pow(Math.E,(-tx/10))); //시그모이드 함수
		nx = adjustCenter(tx,"x",mag);
		ny = adjustCenter(ty,"y",mag);
		graphics.lineTo(nx, ny);
		count++;
		//trace(count, "tx:",tx," ty:",ty," nx:",nx," ny:",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();