0

我正在开发 iPad 应用程序,我必须在其中通过触摸将箭头旋转一圈。但我在这方面遇到了问题。问题在于图像必须旋转到的角度计算。

你可以在这里查看。我必须围绕圆圈旋转大红色箭头图像。任何人都可以帮助我,如何获得触摸点的角度。目前我正在使用以下代码,我在网络的某个地方找到了它。但它并没有将箭头旋转到触摸的地方。

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *oneTouch = [touches anyObject];
    CGPoint currentPoint = [oneTouch locationInView:imgCompass];    

    double current_angle = [self wheelAngleFromPoint:currentPoint]; 
    imgNeedle.transform = CGAffineTransformMakeRotation( current_angle );
}

- (double) wheelAngleFromPoint:(CGPoint)location
{
    double retAngle;

    // subtract center of wheel 

    location.x -= (self.imgNeedle.bounds.size.width ) / 2.0;
    location.y = (self.imgNeedle.bounds.size.height )  / 2.0 - location.y;


    // normalize vector
    double vector_length = sqrt(location.x*location.x + location.y*location.y);

    location.x = location.x/vector_length;
    location.y = location.y/vector_length;

    retAngle = acos(location.y);

    float offset = 0.28;
    //if (location.x)
    //  offset = 0.28;
    retAngle += offset;


    if (location.x<0)
    {
        retAngle = -retAngle;
    }

    return retAngle;
}

谁能帮我正确计算角度。

谢谢

4

1 回答 1

0

这是问题所在:

location.x -= (self.imgNeedle.bounds.size.width ) / 2.0;
location.y = (self.imgNeedle.bounds.size.height )  / 2.0 - location.y;

计算中location.xlocation.y计算后的值应表示从imgNeedle(或轮子?)中心到接触点的向量。试试这个:

location.x = location.x - self.imgNeedle.center.x;
location.y = self.imgNeedle.center.y - location.y;

请注意,由于您正在设置imgNeedle.transform属性,因此框架将无效,但中心会正常 :) - imgNeedle 将围绕图像的中心旋转。

请注意,我明确指出location.x - self.imgNeedle.center.x 为了帮助您了解发生了什么 - 您需要计算两点之间的差异(它们之间的向量)。你应该明白,在数学中,(0, 0) 为原点,x 轴向右为正,y 轴向上为正。但是,在您设备的屏幕上,您使用的坐标系(查看坐标) (0, 0) 位于左上角,x 轴向右为正,但 y 轴向下为正(这并不总是正确的,因为您可以通过多种方式映射屏幕坐标)。这就是为什么 location.y 减法与 location.x 减法相反 - 考虑到屏幕被垂直“翻转”(在数学计算角度方面)。也很高兴知道在数学中,正旋转表示逆时针方向的旋转,一个轴上的翻转可以隐藏这一点并使其看起来正角度意味着顺时针旋转(就像双负转正),所以当你在玩的时候对于旋转和矢量,您应该考虑所有这些。但是,出于您的目的,它非常简单,因此您可能更喜欢使用试错法来玩代码,而不是试图围绕所有数学问题,您可能需要翻转其中一个方向(更改顺序减法)甚至改变旋转方向(做 重新玩旋转和矢量,你应该考虑到所有这些。但是,出于您的目的,它非常简单,因此您可能更喜欢使用试错法来玩代码,而不是试图围绕所有数学问题,您可能需要翻转其中一个方向(更改顺序减法)甚至改变旋转方向(做 重新玩旋转和矢量,你应该考虑到所有这些。但是,出于您的目的,它非常简单,因此您可能更喜欢使用试错法来玩代码,而不是试图围绕所有数学问题,您可能需要翻转其中一个方向(更改顺序减法)甚至改变旋转方向(做2*M_PI - retAngle例如)。

于 2010-10-28T15:25:24.227 回答