Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 将手势转换为速度_Iphone_Algorithm_Physics - Fatal编程技术网

Iphone 将手势转换为速度

Iphone 将手势转换为速度,iphone,algorithm,physics,Iphone,Algorithm,Physics,我在看一些代码,基本上有一行图像,你在这行上滑动,卡片图像根据滑动在这行中移动。就像你给它一个轻弹,然后它在列表中向下移动5张牌。你轻弹一下,然后在列表中下移一张牌。它还可以输入卡号,比如如果你从卡1开始,想进入卡52,你输入52,它滚动所有51张卡,到达卡52并停止。滑动手势和goToCard代码都调用以下方法: - (void)doAnimation { double elapsed = CACurrentMediaTime() - startTime; if

我在看一些代码,基本上有一行图像,你在这行上滑动,卡片图像根据滑动在这行中移动。就像你给它一个轻弹,然后它在列表中向下移动5张牌。你轻弹一下,然后在列表中下移一张牌。它还可以输入卡号,比如如果你从卡1开始,想进入卡52,你输入52,它滚动所有51张卡,到达卡52并停止。滑动手势和goToCard代码都调用以下方法:

   - (void)doAnimation {
      double elapsed = CACurrentMediaTime() - startTime;
      if (elapsed >= runDelta) [self endAnimation];
      else {
         [self updateAnimationAtTime:elapsed];
      }
   }

    - (void)updateAnimationAtTime:(double)elapsed
    {
        int max = 52;

        if (elapsed > runDelta) elapsed = runDelta;
        double delta = fabs(startSpeed) * elapsed - FRICTION * elapsed * elapsed / 2;
        if (startSpeed < 0) delta = -delta;
        offset = startOff + delta;
    }
当我测试它时,它工作得非常好,因为卡图像在开始时会根据您的刷卡速度加快,然后随着您接近runDelta(端点)而减慢

还有一个函数调用updateAnimationAtTime,如下所示:

- (void)goToCard:(int)pos {
   int max = 52;
   startSpeed = sqrt(fabs(pos - startOff) * FRICTION * 2);
   runDelta = fabs(startSpeed / FRICTION);
   startTime = CACurrentMediaTime();
   timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self        selector:@selector(doAnimation) userInfo:nil repeats:YES];
}
在上面的函数中,开始速度的计算与物理学中的计算类似:

Vf^2=Vo^2+2ug(Xf-Xi) 其中u是摩擦系数,他们假设重力等于1

所以代码是有效的,但是当卡片的数量从52张增加到300张时,动画看起来很有趣,因为它从开始到结束循环了300张卡片。我从来没有在代码中真正实现过与物理相关的东西,我想知道是否有人对如何更改代码有任何建议或提示,以使用户仍能感受到我们在所有卡片中循环的效果,但是当它超过50时,不能循环通过所有的卡片,因为这就是动画开始看起来有趣的地方,因为它开始旋转得如此之快,以至于循环通过卡片的原始效果消失了


如果我的问题需要澄清,请告诉我。谢谢- (void)goToCard:(int)pos { int max = 52; startSpeed = sqrt(fabs(pos - startOff) * FRICTION * 2); runDelta = fabs(startSpeed / FRICTION); startTime = CACurrentMediaTime(); timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(doAnimation) userInfo:nil repeats:YES]; }