2018년 1월 18일 목요일

프로그래밍 때 골치 아픈 역삼각함수 처리법

아주 가끔 프로그래밍을 할 때가 있는데 역삼각함수만 나오면 결과가 꼬여서 골치 아프게 한다. 그래서 처리 방법을 정리 해 둔다. 역삼각함수는 0~90도 범위 안에서만 사용하면 아무 문제가 없다. 이 범위를 벗어나면 부호를 따져서 제대로 된 각도를 얻어야 한다.





삼각함수는 직각좌표계를 극좌표계로 바꾸면서 무한 회전(무한 각도)하면서 반복하는 값들로 만들어진 함수라 1대1 대응이 안 된다. 고로 역함수를 구할 때는 각도 범위를 제한할 수밖에 없다. 이 범위가 sin, cos, tan 모두 다르기 때문에 섞어 사용하면 계산 결과가 꼬인다. 그럼 어디가 문제인지 정말 찾기 힘들게 된다. 역함수를 쓸 때는 0~90도로 범위를 제한한다.

삼각함수를 쓸 경우는 시계회전(0~360)인지 좌우회전(-180~+180)인지만 결정해서 경계를 넘어갈 때 처리만 해 주면 문제없다. 표시는 각도로 하고 계산할 때는 라디안을 사용하는 게 아주 편하다. 이것 외엔 문제가 없다.

각도를 구해야하는 경우는 역삼함수를 써야 하는데 이 경우 사분면 결정을 해야 한다. 사분면에 따라 각도 보정을 해 주어야 한다. 또한 프로그램 할 때는 항상 특이 지점(0, 무한)에 대한 처리를 해 주어야 한다. 나누기 하는 숫자가 0인지 아닌지 등 말이다.





계산에 쓰이는 수학 좌표계와 컴퓨터 모니터 화면의 좌표계 차이로 계산이 번거롭다. 마우스로 입력을 받을 때도 마찬가지다. 수학에서 각도 방향과 시계의 각도 방향이 달라서 계산이 번거롭다. 이런 경우 표현 좌표와 계산 좌표 사이의 변환이 필요하다. 복잡한 계산은 수학 좌표계로 하고 마지막에 표현만 화면에 맞게 바꾼다. 보통 프로그램 할 때는 나중에 고치기 쉽도록 다음 3가지를 분리한다.


  1. 계산/프로그램 : 예) 게임 엔진
  2. 자료/데이터 : 예) 유닛 객체 데이터
  3. 표현/디자인 : 예) 유닛 애니메이션 이미지






매일 계란을 먹듯이
많은 생명이 태어나자마자 죽는다.
우리도 그처럼 이 땅에 버려진 것들이다.
죽은 후엔 영원한 평온이 있겠지.

댓글 없음:

댓글 쓰기