Front-end_dev

AVL TREE 시뮬레이션에 대한 간단한 브리핑 본문

ES6/App(project)

AVL TREE 시뮬레이션에 대한 간단한 브리핑

Eat2go 2017. 7. 28. 01:21

원의 중심을 기준으로 사용자의 마우스 좌표로 일직선을 긋고싶은데 선이 원을 벗어나서는 안될때 수식을 다음과같이 구성 할 수 있습니다.

마지막에 px,py에서 r은 원의 반지름입니다 위에 r(빗변)이 아닙니다.




실제로 컴퓨터는 1사분기2사분기3사분기4사분기라는 개념이 없으므로 제 스스로 그 개념을 만들어줬고, 데카르트좌표계에서의 좌표(반시계방향으로 90도180도270도)로 바꿔줬습니다. 캔버스에서는 시계방향으로 각도를 잽니다.

이 정도만 추가해주면 다음과 같이 구성 할 수 있습니다.




class Vector2D {
constructor(x=0,y=0) {
this.x = x;
this.y = y;
}
toRadian(degree) {
return Math.PI/180 * degree;
}
toDegree(radian) {
return 180*radian / Math.PI;
}
gethypotenuse(x2,y2) {
const subX = Math.abs(x2-this.x),
subY = Math.abs(y2-this.y),
hypotenuse = Math.sqrt( subX**2 + subY**2 );

return hypotenuse;
}
getSeta(x2,y2) {
let seta = Math.asin( Math.abs(y2-this.y) / this.gethypotenuse(x2,y2) );
seta = this.toDegree(seta);
if(x2 > this.x && this.y > y2) seta += (180-seta)*2; // 1사분기
else if(this.x > x2 && this.y > y2) seta += 180; // 2사분기
else if(this.x > x2 && y2 > this.y) seta += (90-seta)*2; // 3사분기

return seta;
}
}




그럼 실제로 원의 중심에서 시작하여 사용자의 마우스의 좌표에 따라 긋는 일직선을 원의 반지름을 안넘어가게 할 수있습니다. 

이 원리로 AVL TREE SIMULATION에서 각 노드를 잇는 선을 그려줬습니다.










마지막으로는 AVL TREE 자체애 대한 설명인데 정말 모든것을 recursive하게 생각해야됩니다. (재귀적인 사고력은 넘나 어려운것)

균형을 잡아주는 트리로써 삽입,삭제에있어서 항상 균형인수를 체크해서 균형을 잡아줘야하는데 이 과정은 재귀적인 동작을 필수로 요구하게 됩니다.

처음에 제가 참고한 코드에서는 그 코드가 삽입할때 재귀적으로 균형인수를 체크하지 않는데 제가 배운이론으로는 재귀적으로 항상체크해야맞는건데 이게 서로 안맞으니까(이론과 코드가) 처음에 엄청 해맸던게 기억나네요.








'ES6 > App(project)' 카테고리의 다른 글

5번째 프로젝트  (0) 2017.08.30
4번째 프로젝트  (0) 2017.07.28
3번째 프로젝트(물리기반의 2D 게임)  (0) 2017.07.03
이벤트 방식의 프로그래밍.  (0) 2017.06.06
2번쨰 프로젝트 후기  (0) 2017.06.06