2012-12-20 4 views
6

첫째, 이것은 매우 사소한 것처럼 들릴지 모르지만, 현재 주어진 각도에서 사분면을 반환하기위한 getQuadrant (degree) 함수를 작성 중입니다.각도의 현재 사분면을 얻는 가장 빠른 방법

예를 들어 degree가> 0이고 < 인 경우 1을 반환합니다. Degree가 90보다 크고 < 인 경우 2를 반환합니다. 이것은 매우 사소한 것입니다. 그러나, 0-360 이외도 처리 할 수 ​​있도록, 단순히 다음과 같이 먼저 0-360도 범위로 그 숫자를 정규화 : 그 후

  while (angle > 360) 
       angle = angle - 360; 
      end 

      while (angle < 0) 
       angle = angle + 360; 
      end 

, 나는 계산한다. 그러나 솔직히 말해서, 나는 while 문을 사용하는 것이 싫다. 한 번에 각도의 사분면을 지적 할 수있는 다른 수학적 방법이 있습니까?

편집 : 좋은 답변이 많이 있음을 확인했습니다. 나를 추가 할 수

답변

3

정수를 arithmetics을 활용하여 "가장 빠른 될 것이다 알고리즘 ?"

angle = angle - (angle/360)*360; 
if (angle < 0) angle = angle + 360; 

아이디어입니다, angle/360이 (floor())을 내림되기 때문에, (angle/360) 당신에게 k을 제공합니다 alpha = beta + 360k해야합니다.

두 번째 줄은 필요한 경우 [-359, -1]에서 [1,359] (으)로 정상화됩니다.

+1

잠깐 ... 내가 따를 지 잘 모르겠다. 그것들 (각도/360) * 360 = 각도입니까? 그리고 라인 1의 최종 결과는 항상 0이 될 것입니다. – Karl

+0

좋아, 알았다. Matlab에서이 작업을 수행했습니다.그러나 C 언어에서 정수 연산의 각도/360은 암시 적으로 정수를 내림으로써 완벽하게 작동합니다. (나는 C 모드가 아니었다) – Karl

4

당신은 모듈로 연산 사용할 수 있습니다 : 당신은 너무 여기에 질문 삼각법 태그 한

angle %= 360.0; // [0..360) if angle is positive, (-360..0] if negative 
if (angle < 0) angle += 360.0; // Back to [0..360) 
quadrant = (angle/90) % 4 + 1; // Quadrant 
1

것은 일부 삼각법의 :

A) sin(theta)cos(theta)을 - 그것은 얼마나 중요하지 않습니다 많은 (양수 또는 음수) 360°의 배수가 포함됩니다. sin(400°)==sin(40°)==sin(-320°)

b) 및 sin(theta)>0cos(theta)<0 세타 등등 클록 라운드 2 사분면

이고 sin(theta)>0 경우와 cos(theta)>0 세타

1 사분면에있는 경우. 아, 4 corners에서 무엇을 할 지 결정하십시오. sincos0입니다.

2
(angle/90)%4+1 

가정 :

  1. angle
  2. angle
  3. / 양의 정수를 것입니다 당신이 몇 가지 추가 처리가 필요합니다 음각를 들어 정수 나누기

입니다.

관련 문제