2009-10-01 3 views

답변

5

아핀 멤버 b 또는 c의 asin() 또는 acos()를 가져옵니다.

struct CGAffineTransform { 
    CGFloat a; 
    CGFloat b; 
    CGFloat c; 
    CGFloat d; 
    CGFloat tx; 
    CGFloat ty; 
}; 
+4

이 뒤에 수학은 석영 2D 프로그래밍 가이드의 하위 섹션은 "행렬 뒤에 수학"에 설명되어 있습니다 : HTTP : // scale.apel.com/mac/library/DOCUMENTATION/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_affine/dq_affine.html#//apple_ref/doc/uid/TP30001066-CH204-CJBECIAD –

+2

규모가있을 때 acos가 올바르지 않습니다. 올바른 수식은 다음과 같습니다. CGFloat radians = atan2f (self.view.transform.b, self.view.transform.a); CGFloat degrees = 라디안 * (180/M_PI); – lbsweek

0

acos() 및 asin() 함수를 사용하여 CGAffineTransformMakeRotation의 기능을 되돌릴 수 있습니다. 그러나 Scale 변환 행렬이 곱 해졌으므로 그렇게하기가 어려울 수 있습니다.

0

나는 과거 아핀 행렬에서 회전을 추출하기 위해 GeoTools 툴킷에서 XAffineTransform 클래스를 사용에 있습니다. 스케일링 및 전단이 적용된 경우에도 작동합니다.

자바 라이브러리이지만 쉽게 (Objective-) C로 변환 할 수 있어야합니다. the source for XAffineTransform here을 볼 수 있습니다. 이 메소드는 getRotation이라고 불립니다. 그리고 read the API here을 사용할 수 있습니다. 당신은 또한 getScale/getShear 메소드를 구현해야 할 것

final double scaleX = getScaleX0(tr); 
final double scaleY = getScaleY0(tr) * flip; 
return Math.atan2(tr.getShearY()/scaleY - tr.getShearX()/scaleX, 
        tr.getScaleY()/scaleY + tr.getScaleX()/scaleX); 

:

는 방법의 핵심입니다. 전혀 열심히. (같이 대부분의 경우 당신은 자바 코드를 복사 할 수 있습니다.)

5
atan2(rotationTransform.b, rotationTransform.d) 

사람이 제안한 ACOS (B) 솔루션의 범위 +/- 0.5pi에서만 유효합니다. 이 솔루션은 거의 확실하게 전단은 아니지만 회전, 평행 이동 및 스케일링의 조합 하에서 강건 해 보입니다. 저의 이전 답변 (atan2(rotationTransform.b, rotationTransform.a)은 확장에 강력하지 않았습니다.

This duplicate was the basis for my original answer.

+2

나는 'atan2 (rotationTransform.b, rotationTransform.d)'이어야한다고 생각한다. –

+0

루이즈 (Luiz) - 번역과 회전의 조합 하에서 둘다 동일하고 정확하지만 스케일링이 추가 될 때 너의 것 또한 정확 해 보인다. 그것을 업데이트하십시오. 고맙습니다. –

+0

transform.b를 사용하여 transform.d가 저장되었습니다. 감사! – srik

0

asin 및 스케일이있을 때 acos가 올바르지 않습니다.

정확한 공식은 다음과 같습니다

CGFloat radians = atan2f(self.view.transform.b, self.view.transform.a); 
CGFloat degrees = radians * (180/M_PI); 

나 :

CGFloat angle = [(NSNumber *)[view valueForKeyPath:@"layer.transform.rotation.z"] floatValue]; 
관련 문제