【问题标题】:Rotate Arrow UIImage in a circle in objC在objC中将箭头UIImage旋转一圈
【发布时间】:2010-10-28 12:28:04
【问题描述】:

我正在开发 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;
}

谁能帮我正确计算角度。

谢谢

【问题讨论】:

  • 使用具有 360 度平铺的一张图像。 Apple 也是这样做的,它提供了更大的灵活性和更好的质量,并且更容易编程。
  • 针是移动到错误的地方,还是根本不动?
  • 它正在移动到错误的位置。意味着针不指向我点击的地方,它指向任何其他地方。
  • 科宁巴尔德!你能告诉我更详细的吗。你是什​​么意思以及如何实现这一点。谢谢

标签: iphone objective-c image-rotation


【解决方案1】:

问题来了:

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)。

【讨论】:

    猜你喜欢
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    相关资源
    最近更新 更多