我试图找出旋转UIView的数学运算,当在屏幕上移动时,某一侧总是“跟随”一个手指。
我差不多了,但多年来我没有三角测量法,我无法弄明白该做什么。这就是我所拥有的:
-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
CGPoint touchPoint = [touch locationInView:self.view];
int dy = cannon.frame.origin.y - touchPoint.y;
int dx = cannon.frame.origin.x - touchPoint.x;
cannon.transform = CGAffineTransformMakeRotation(atan2(dy,dx) - 135);
}
答案 0 :(得分:1)
首先,感谢所有花时间回答的人!
我玩了一段时间,似乎唯一的问题是我使用int
用于dy
和dx
而不是float
s。我还找到了一个漂亮,快速的“方法”,用于将度数转换为弧度。这是最终的工作代码:
#define DEGREES_TO_RADIANS(angle) (angle / 180.0 * M_PI)
-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
CGPoint touchPoint = [touch locationInView:self.view];
float dy = cannon.frame.origin.y - touchPoint.y;
float dx = cannon.frame.origin.x - touchPoint.x;
cannon.transform = CGAffineTransformMakeRotation(atan2(dy,dx) - DEGREES_TO_RADIANS(90));
}
答案 1 :(得分:0)
我认为你的炮塔初始标题是正确的。
您的PI常数是3.14(以弧度表示的角度)
-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
CGPoint touchPoint = [touch locationInView:self.view];
int dy = cannon.frame.origin.y - touchPoint.y;
int dx = cannon.frame.origin.x - touchPoint.x;
float a = atan(abs(dy)/abs(dx));
if(dx>0 && dy<0) a += PI/2;
if(dx<0 && dy<0) a += PI;
if(dx<0 && dy>0) a += 3*PI/2;
cannon.transform = CGAffineTransformMakeRotation(a);
}
我认为它可以更优化(不会),但我现在无法测试自己。它有效吗?
答案 2 :(得分:0)
你的常数135可能不正确,因为atan2
和CGAffineTransformMakeRotation
都以弧度而非度数工作。相当于135度的弧度是π·3/4。
然而,除此之外,你的代码看起来很好 - 这应该只是导致一个恒定的偏移,而不是你描述的奇怪的行为。您确定cannon.frame.origin
本身不会受到转换的影响吗?