CGAffineTransform에서 변환 및 스케일링 값을 가진 회전 각도 만 가져올 수 있습니까? 그렇다면 어떻게?CGAffineTransform에서 회전 만 가져 오기
미리 감사드립니다.
CGAffineTransform에서 변환 및 스케일링 값을 가진 회전 각도 만 가져올 수 있습니까? 그렇다면 어떻게?CGAffineTransform에서 회전 만 가져 오기
미리 감사드립니다.
아핀 멤버 b 또는 c의 asin() 또는 acos()를 가져옵니다.
struct CGAffineTransform {
CGFloat a;
CGFloat b;
CGFloat c;
CGFloat d;
CGFloat tx;
CGFloat ty;
};
acos() 및 asin() 함수를 사용하여 CGAffineTransformMakeRotation의 기능을 되돌릴 수 있습니다. 그러나 Scale 변환 행렬이 곱 해졌으므로 그렇게하기가 어려울 수 있습니다.
나는 과거 아핀 행렬에서 회전을 추출하기 위해 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);
:
이
는 방법의 핵심입니다. 전혀 열심히. (같이 대부분의 경우 당신은 자바 코드를 복사 할 수 있습니다.)atan2(rotationTransform.b, rotationTransform.d)
사람이 제안한 ACOS (B) 솔루션의 범위 +/- 0.5pi에서만 유효합니다. 이 솔루션은 거의 확실하게 전단은 아니지만 회전, 평행 이동 및 스케일링의 조합 하에서 강건 해 보입니다. 저의 이전 답변 (atan2(rotationTransform.b, rotationTransform.a
)은 확장에 강력하지 않았습니다.
나는 'atan2 (rotationTransform.b, rotationTransform.d)'이어야한다고 생각한다. –
루이즈 (Luiz) - 번역과 회전의 조합 하에서 둘다 동일하고 정확하지만 스케일링이 추가 될 때 너의 것 또한 정확 해 보인다. 그것을 업데이트하십시오. 고맙습니다. –
transform.b를 사용하여 transform.d가 저장되었습니다. 감사! – srik
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];
이 뒤에 수학은 석영 2D 프로그래밍 가이드의 하위 섹션은 "행렬 뒤에 수학"에 설명되어 있습니다 : HTTP : // scale.apel.com/mac/library/DOCUMENTATION/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_affine/dq_affine.html#//apple_ref/doc/uid/TP30001066-CH204-CJBECIAD –
규모가있을 때 acos가 올바르지 않습니다. 올바른 수식은 다음과 같습니다. CGFloat radians = atan2f (self.view.transform.b, self.view.transform.a); CGFloat degrees = 라디안 * (180/M_PI); – lbsweek