在objC中以圆圈旋转箭头UIImage

时间:2010-10-28 12:28:05

标签: iphone objective-c image-rotation

我正在使用iPad应用程序,我必须通过触摸旋转圆圈中的箭头。但我面临着问题。问题出在图像必须旋转的角度计算中。

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

- (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;
}

任何人都可以帮我正确计算角度。

由于

1 个答案:

答案 0 :(得分: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)。