iOS数学用于旋转跟随手指的炮塔/加农炮

时间:2012-03-23 22:37:30

标签: objective-c ios ios5 uiview trigonometry

我试图找出旋转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);
}

3 个答案:

答案 0 :(得分:1)

首先,感谢所有花时间回答的人!

我玩了一段时间,似乎唯一的问题是我使用int用于dydx而不是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可能不正确,因为atan2CGAffineTransformMakeRotation都以弧度而非度数工作。相当于135度的弧度是π·3/4。

然而,除此之外,你的代码看起来很好 - 这应该只是导致一个恒定的偏移,而不是你描述的奇怪的行为。您确定cannon.frame.origin本身不会受到转换的影响吗?