2009-11-22 21 views
1

확실히 이것은 당신 중 일부에게는 매우 사소한 수학적 내용입니다.이 회전 문제를 해결하는 방법은 무엇입니까?

하지만보기를 회전 할 때 0도에서 시작하여 0.1, 1, 10, 100, 150, 160, 170, 179, 179,999 앞으로 회전하고 같은 방향으로 회전하면 계속됩니다. , 그것은 큰 소리로 그리고 명백하게 말한다 : BANG !!!! BAAAAAAAANNNNNGGGG !!!! -179,9999, -170, -150, -50, 0, 50, 100, 170, 179,99 및 다시 : BBBBAAAANNNGGG !!! -179,999, -170, -100 등등 ... 내 뜻을 알기 위해

도로에서 운전하면 갑자기 마일 - 오 - 미터가 부정적으로 점프한다고 상상해보십시오. 당신은 괴물을 낳았 지, 그렇지?

그리고 그거 알아? 이것은 내 알고리즘에 매우 나쁜 것입니다. 내가 아니 생각이 내 값을 갑자기 이상 스왑 경우 if-else-blocks 확인 이외의이 문제를 해결할 수 있습니다. 뭔가 내가 부비동 파도와 다른 것들과 같은 수학 함수를 봐야한다는 것을 알 수 있습니다. 그러나 나의 수학 지식은 최고 수준으로 빤다.

어떻게 해결할 수 있습니까? 각도 사이의 거리를 계산하려고합니다. 즉, 하나가 다른 곳에 있고 두 개 모두 회전하는 두 개의 뷰가 있습니다. 그리고 두 뷰의 전반적인 회전을 계산하려고합니다. 이 작은하지만 미친 일은 가치가 갑자기 -179,99999에서 179,99999로 바뀌 자마자 내 계산을 파괴합니다. 또한 180이 존재하는지 또는 물건이 fabsf (179,9999999999999999999)에서 어딘가로 바뀌는 지 알 수 없습니다. 무슨 뜻인지 아시면 알 수 있습니다.

예 : -170도에서 50도까지는 무엇입니까? 글쎄, 나는 -220도라고 생각해. 하지만 대신 -170 ~ 50을 돌릴 때 40 도가됩니다.

안전하지 않은 swapping-if-else 로직을 사용하지 않고 어떻게하면 -220을 40 대신에받을 수 있습니까? 때로는 제 수작업이 작동하지만 때로는 수학의 부정확 함 때문에 그다지 중요하지 않습니다.

편집 :보기의 레이어의 transform.rotation.z 속성에서 각도를 계산합니다.

+0

당신의 각도가 어디에서 왔는지 조금 더 분명해야합니다. 프로그램의 어느 부분에서 계산합니까? –

+0

추가 편집 :보기 레이어의 transform.rotation.z 속성에서 각도를 계산합니다 –

답변

5

뷰는 데이터의 표준 표현이 아니며, 쿼리는 시스템의 시각적 상태에 대해 알려줍니다. 각도의 특정 표현에 관심이 있다면 변형에서 그것을 읽지 않아야합니다. 모델이나 컨트롤러에 적절하게 저장하고이를 기반으로 뷰의 상태를 설정해야합니다.

@interface MyViewController: UIViewController { 
    CGFloat rotation; 
} 

@property (nonatomic) CGFloat rotation; 

@end 

@implementation MyViewController 
@synthesize rotation; 

- (void)setRotation:(CGFloat)rotation_ { 
    rotation = rotation_; 
    // Do whatever math you want and set the transform of the view based on that; 
} 
@end 
+0

친애하는 각하, y 축을 따라 아이폰 각도의 변화율을 계산하고 싶습니다, 당신은 내게 정확한 방법을 제공해 줄 수 있습니까? 그것을 끝내기의? 이 작업을 수행하기 위해 회전 행렬을 사용할 수 있습니까? 이 질문에서이 질문을하는 것에 대해 유감스럽게 생각합니다.하지만 대답은 절실합니다. 미리 감사드립니다. – sam

1

여기서 보는 각도는 시계와 같은 모듈 식입니다. 시계 11 + 2 == 1이 아니라 13. 마찬가지로 모든 각도를 음수 또는 양수로 나타낼 수 있습니다. 그래서, +180 == (- 180). 그래서, 179 + 2 = (- 179). 변환은 원래의 제로 회전에서 시작하여 가장 먼 원점을 계산합니다. 181 도의 최단 회전은 실제로 -179 도의 음의 회전입니다.

변환은 동일한 변환을 변환 계산에 제공하지 않으면 누적되지 않습니다. 즉, 뷰를 45도 회전하고 두 번 적용하기 위해 변형을 만들면 45 도만 회전합니다. 누적 회전을 얻으려면 CGAffineTransformRotate과 같은 함수를 사용하고 이전 회전에서 변환을 계속 전달해야합니다. 당신이 당신의 UIView의의 CALayer를 들어 < (180)

1

각도 먹이로

는 속성이 CATransform3D 구조체이다 변환 한 같은 방향으로 부드러운 회전을 생성합니다.해당 구조체의 회전 멤버는 없지만 Apple은 구조체에서 회전을 설정하고 읽을 수있는 편리한 keypath를 제공합니다. 양수 각도에서 음수 각도로의 변경은 구조체에서 회전을 결정하는 데 사용되는 계산의 아티팩트입니다. 이 수학은 Quartz 2D Programming Guide 섹션 "The Math Behind the Matrices"에서 CATransform3D, CGAffineTransform의 2-D에 해당하는 것으로 설명됩니다.

당신은 내가 this answer에서 제공 자신이 코드를 사용하여 계산을 할 수있는,이 설명하기 위해 : 이것은 당신이 공을 통과하면이 뒤집어 것이다 0에서 360까지의 각도 값을 산출한다

CATransform3D rotationTransform = [(CALayer *)[self.layer presentationLayer] transform]; 
float angle; 
if (rotationTransform.m11 < 0.0f) 
     angle = 180.0f - (asin(rotationTransform.m12) * 180.0f/M_PI); 
else 
     angle = asin(rotationTransform.m12) * 180.0f/M_PI; 

또는 360, 회전의 주기적 특성으로 인해.

+0

친애하는 각하, y 축을 따라 아이폰 각도의 변화율을 계산하고 싶습니다. 제게 정확한 방법을 알려주시겠습니까? 이 작업을 수행하기 위해 회전 행렬을 사용할 수 있습니까? 이 질문에서이 질문을하는 것에 대해 유감스럽게 생각합니다.하지만 대답은 절실합니다. 미리 감사드립니다. – sam

관련 문제