본문 바로가기
[ Design ]/Flash

수학 이론 Summary ~!!

by 관이119 2012. 9. 13.
What you see is what you get | 아킨토스
http://blog.naver.com/etwas0227/60012937918
Subject Note Function
수의 정의
정수 : 양의 정수, 음의 정수, 0
자연수 : 양의 정수
유리수 : a/b (a와 b는 정수, b는 0이 아님) 형태로 표현할 수 있는 수

절대값
|x1-x2| Math.abs(x1-x2)
비례와 반비례
비례 : y=ax (a는 임의의 상수)
반비례 : y=a/x (x는 0이 아님)

제곱근
a = b*b 에서 b는 a의 제곱근 Math.sqrt(b)
피타고라스
직각 삼각형의 경우 빗변이 아닌 두 변의 길이를 제곱해서 더한 값은 빗변을 제곱한 것과 같다.
c*c = a*a + b*b
c = Math.sqrt(a*a+b*b)
삼각함수1
sinθ = y, cosθ = x (θ는 radian)
호도각(degree) : 원 한바퀴를 360도로 표시한 것
라디안(radian) : 반지름이 1인 원에서 호의 길이가 1인 부채꼴의 각을 기본단위로 삼아서, 원 한바퀴를 2π 로 표시한 것
radian = degree*Math.PI/180
Math.sin(radian)
Math.cos(radian)
삼각함수2
y=sin(x)
y=cos(x)
y=a*sin(x)
y=sin(2πx/T)
y=b+a*sin(2πx/T)
y=a*sin(2π(x-δ)/T)
y=a*sin(2πx/T-2πδ/T)
y=a*sin(wt+φ)
sin30° = 1/2
sin60° = √3/2
cos30° = √3/2
cos60° = 1/2
삼각함수를 이용한 원 및 타원
cosθ=x/r → x=rcosθ
sinθ=y/r → y=rsinθ
x=a+rcosθ, y=b+rsinθ : 중심이 (a,b)이고 반지름이 r인 원
x=m+acosθ, y=n+bsinθ : 중심이 (m,n)이고 가로축 반지름이 a, 세로축 반지름이 b인 타원

행렬의 기초
1×3행렬, 2×2행렬, 3×1행렬
행렬의 같은 꼴 및 행렬의 연산
행렬의 같은 꼴, 행렬의 합, 행렬의 차, 행렬의 실수 배, 행렬의 곱셈
일차변환


수열
등차수열, 등비수열
일차 점화식
이차 점화식
삼차 점화식

미분(微分)
평균속력 = Δ거리/Δ시간
순간속력 = ds/dt

적분(積分)


atan(아크탄젠트)
tanθ=y/x ↔ atan(y/x)=θ Math.atan2(y,x)
극 좌표
직교좌표 P(x,y)
극좌표 P(r,θ) : r은 원점으로부터 떨어진 거리, θ는 x축을 기준으로 회전한 각도
x=rsinθ, y=rcosθ

랜덤
random(4) : 0,1,2,3 중에서 임의의 한 정수를 반환
random(b-a+1)+a : a부터 b까지의 정수 중 임의의 한 정수를 반환
Math.random() : 0부터 1사이의 값 중 임의의 실수를 반환, 매개변수 없음
(b-a)*Math.random()+a : a에서 b까지의 수 중 임의의 실수를 반환
Math.floor(7.3432) : 7 을 반환. 소수점 이하를 제거
Math.floor((b-a)*Math.random())+a : a에서 b까지의 값 중 임의의 정수를 반환
random(a)
확률
onClipEvent(enterFrame) { if(random(20)==0){ 액션스크립트A; } }
%연산자

//나머지를 구하는 함수 선언

_global.mod = function(a, b){ if(a%b<0){ return b + a%b; }else{ return a%b; } }




■ 액션스크립트 샘플
-----------------------------------------------------------------------------------------------------------
------절대값과 비례를 이용한 플래시 무비

for(var i=1;i<=10;i++){ _root["m"+i].onEnterFrame = function(){

// 자신과 마우스커서 사이의 y축 거리

distance = Math.abs(this._y - _root._ymouse);

// 거리에 따라 투명도 설정

this.rect._alpha = 30 + distance/4;

this._xscale = 100 - distance/4;

}

-----------------------------------------------------------------------------------------------------------

------피타고라스 공식을 이용한 이차원 평면상의 두점 (x1,y1)과 (x2,y2) 사이의 거리 r를 반환하는 함수

function distance(x1,y1,x2,y2) {

var diffX = x2-x1;

var diffY - y2-y1;

var r = Math.sqrt(diffX*diffX+diffY*diffY);

return r;

}

-----------------------------------------------------------------------------------------------------------

------삼각함수를 이용한 원운동

onClipEvent (load) {

// 원 운동의 중심

cx = _root.center._x;

cy = _root.center._y;

// 원 운동의 가로 및 세로길이

a = 150;

b = 150;

// 각도

t = 0;

}

onClipEvent (enterFrame) {

// 원운동 만들기

x = cx+a*Math.cos(t); y = cy+b*Math.sin(t);

// 원운동 식을 (cx, cy)를 중심으로 theta만큼 회전이동 시킴

tempx = x;

x = cx + (x-cx)*Math.cos(theta) - (y-cy)*Math.sin(theta);

y = cy + (tempx-cx)*Math.sin(theta) + (y-cy)*Math.cos(theta);

// 회전이동시킨 점을 무비클립의 _x, _y 속성으로 설정

this._x = x;

this._y = y;

// 각도를 0.1만큼 증가시킴

t = t+0.1;

}

-----------------------------------------------------------------------------------------------------------
------삼각함수를 이용한 타원운동

onClipEvent (load) {

// 타원 운동의 중심

cx = _root.center._x;

cy = _root.center._y;

// 타원 운동의 가로 및 세로길이

a = 100;

b = 200;

// 매 프레임마다 증가할 각도

t = 0;

// 타원을 회전이동시킬 각도, 30도만큼 회전 => 라디안으로 바꿈

theta = 30/180*Math.PI;

}

onClipEvent (enterFrame) {

// 타원운동 만들기

x = cx+a*Math.cos(t);

y = cy+b*Math.sin(t);

// 타원운동 식을 (cx, cy)를 중심으로 theta만큼 회전이동 시킴

tempx = x;

x = cx + (x-cx)*Math.cos(theta) - (y-cy)*Math.sin(theta);

y = cy + (tempx-cx)*Math.sin(theta) + (y-cy)*Math.cos(theta);

// 회전이동시킨 점을 무비클립의 _x, _y 속성으로 설정

this._x = x;

this._y = y;

// 각도를 0.1만큼 증가시킴

t = t+0.1;

}

-----------------------------------------------------------------------------------------------------------

------수열을 이용하여 윈도우가 좌우로 빠르게 흔들리는 모습

onClipEvent(load){

// 좌우로 진동하도록 r 값을 설정, -1에 가까울수록 오랫동안 진동

r = -0.95;

// 이동할 목적위치를 처음 시작 위치로 설정

t = this._x;

// 처음 시작 위치

this._x = this._x + 20;

}

onClipEvent (enterFrame){

// 매 프레임마다 목적지 t를 향해 좌우로 진동하면서 이동함

this._x = r*this._x + (1-r)*t;

}

-----------------------------------------------------------------------------------------------------------

------수열을 이용해서 윈도우가 드래그되고, 버튼 클릭하면 좌우로 빠르게 흔들리는 모습

/********** window 무비클립 **********/

onClipEvent(load){

// 좌우로 진동하도록 r 값을 설정, -1에 가까울수록 오랫동안 진동

r = -0.95;

// 이동할 목적위치를 처음 시작 위치로 설정

t = this._x;

// 처음 시작 위치

this._x = this._x + 20;

}

onClipEvent (enterFrame){

if(isDrag == false){

// 매 프레임마다 목적지 t를 향해 좌우로 진동하면서 이동함

this._x = r*this._x + (1-r)*t;

}

}

/********** window 무비클립 속의 타이틀바 버튼 **********/

on(press){

this.startDrag();

isDrag = true;

}

on(release){

this.stopDrag();

t = this._x;

isDrag = false;

}

/********** 좌우로 진동시키는 버튼 **********/

on(release){

_root.window._x = _root.window._x + 20;

}

-----------------------------------------------------------------------------------------------------------

------관성

onClipEvent(enterFrame){

// speedx와 speedy 만큼 가로 및 세로축으로 이동하기

this._x += speedx;

this._y += speedy;

// Right키가 눌리면, 오른쪽으로 이동하기

if(Key.isDown(Key.RIGHT)){

speedx += 2;

this._xscale = 100;

}

// Left키가 눌리면, 왼쪽으로 이동하기

if(Key.isDown(Key.LEFT)){

speedx -= 2;

this._xscale = -100;

}

// Up키가 눌리면, 위로 이동하기

if(Key.isDown(Key.UP)){

speedy -= 2;

}

// Down키가 눌리면, 아래로 이동하기

if(Key.isDown(Key.DOWN)){

speedy += 2;

}

// 매 프레임마다 x 및 y축 속도를 5% 만큼씩 감소시킴

speedx *= 0.95;

speedy *= 0.95;

// 화면 밖으로 나가면 반대편에서 나타나게 하기

if(this._x > 550 + this._width){

this._x = 0 - this._width/2;

}else if(this._x < 0 - this._width){

this._x = 550 + this._width/2;

}

if(this._y > 400 + this._height){

this._y = 0 - this._height/2;

}else if(this._y < 0 - this._height){

this._y = 400 + this._height/2;

}

// 스페이스 키를 누르면, 마법쓰는 프레임으로 이동시키기

if(Key.isDown(Key.SPACE) && this._currentFrame < 19){

this.gotoAndPlay(19);

}

}

-----------------------------------------------------------------------------------------------------------

------atan(아크탄젠트)를 이용한 눈돌리기

/********** 메인타임라인 1프레임 **********/

// 무비클립을 (targetx, targety)로 회전시키는 함수

MovieClip.prototype.rotateTo = function(targetx, targety){

var diffX = targetx - this._x;

var diffY = targety - this._y;

this._rotation = Math.atan2(diffY, diffX)*180/Math.PI;

};

/********** 눈 무비클립 **********/

onClipEvent (enterFrame) {

this.rotateTo(_root._xmouse, _root._ymouse);

}

-----------------------------------------------------------------------------------------------------------

------극좌표를 이용하여 다양한 그래프 그리기

/********** line 무비클립 **********/

// 두 점을 연결하는 라인을 만드는 메서드 선언

MovieClip.prototype.drawLine = function(x1, y1, x2, y2){

this._x = x1;

this._y = y1;

this._xscale = x2 - x1;

this._yscale = y2 - y1;

};

/********** 액션 무비클립 **********/

onClipEvent(load){

i=0;

// 극좌표

r = 60*Math.cos(12*t)+20;

// 극좌표를 직교좌표로 변환, (275, 200)만큼 평행이동 <- 가운데로 이동

prevX = this._x = r*Math.cos(t) + 275;

prevY = this._y = r*Math.sin(t) + 200;

}

onClipEvent(enterFrame){

// 극좌표

r = 60*Math.cos(12*t)+20;

// 극좌표를 직교좌표로 변환, (275, 200)만큼 평행이동 <- 가운데로 이동

this._x = r*Math.cos(t) + 275;

this._y = r*Math.sin(t) + 200;

// 라인 그리기

_root.line.duplicateMovieClip("line"+i, i);

_root["line"+i].drawLine(this._x, this._y, prevX, prevY);

// 과거 위치를 저장

prevX = this._x;

prevY = this._y;

// t 값을 0.1씩 증가 (각도를 증가시킴)

t = t + 0.02;

// 다음번 무비 복제를 위해 i를 1만큼 증가시킴

i++;

}

-----------------------------------------------------------------------------------------------------------
------나머지를 구하는 함수

// 나머지를 구하는 함수 선언

_global.mod = function(a, b){

if(a%b<0){

return b + a%b;

}else{

return a%b;

}

}

출처: http://cafe.naver.com/w3design/416

댓글