根据角度按比例更新位置

时间:2015-07-28 21:11:40

标签: objective-c degrees

我对此问题感到困惑已有一段时间了,我找不到类似的话题,所以......

  1. 物体(带圆点的圆圈)以一定速度旋转,点位于90度(顶部)
  2. 当圆点达到0度时,位置重置为90度(用于测试目的)
  3. 另一个对象(标志)位于带点
  4. 的会合点处
  5. 我创建了一个基于圆度来计算旗帜位置的基本方法:

    -(CGPoint)positionOnArc 
    {
        CGFLoat posX = _circle.position.x + (arcRadius)*cos(degrees);
        CGFLoat posY = _circle.position.y + (arcRadius)*sin(degrees);
        return CGPointMake(posX, posY);
    }
    
  6. 现在的问题是:如何强制旗帜以比圈子更慢的速度移动?我希望达到一种效果,即每旋转3度,旗帜移动1度。

  7. 创建第二个圆圈,其上附有标志并将旋转速度基于第一个圆圈的速度是不可能的。我需要让旗帜的位置“坚持并且跟在后面”点的度数点。

    我知道答案可能很痛苦但我无法将其包裹在脑海中,所以任何提示都会非常感激。

    编辑: 我确实设法为我找到了一个足够好的解决方案,所以我将它粘贴在这里,因为它可能会帮助其他像我一样的新手来解决类似的问题。

        -(CGPoint)positionOnArc
        {
            //Angle range between which the Dot is moving in percentages.
            CGFloat dotMovementRangePercentage = 100 * _circle.zRotation 
            - circleLeftAngleBoundary) / (circleRightAngleBoundary - 
            circleLeftAngleBoundary);
            //Degree on which the Flag is currently at.
            CGFloat flagPositionAnglePoint = ((flagLeftAngleBoundary 
            - flagRightAngleBoundary) * dotMovementRangePercentage) 
            + flagLeftAngleBoundary);
    
           //These two make sure that the flag will be moving slowly behind.
           if (flagPositionAnglePoint > 90) {
               flagPositionAnglePoint = flagPositionAnglePoint 
               - (1*(flagPositionAnglePoint/3 - 30));
           }
           if (flagPositionAnglePoint < 90) {
               flagPositionAnglePoint = flagPositionAnglePoint 
               + (1*(flagPositionAnglePoint/3 - 30));
           }
    
           //Final position is calculated here.
           CGFloat posX = _circle.position.x 
           - arcRadius*cos(-(flagPositionAnglePoint*M_PI)/180);
           CGFloat posY = _circle.position.y
           - arcRadius*sin(-(flagPositionAnglePoint*M_PI)/180);
    
           return CGPointMake(posX, posY);
        }
    

    这可能不是最佳/最有效/最合理的方式,但我认为这是一个很好的开始。

0 个答案:

没有答案