iphone - 线和点之间的二维碰撞

标签 iphone objective-c physics

我正在尝试了解二维世界中的碰撞检测。我最近得到了这个教程 http://www.gotoandplay.it/_articles/2003/12/bezierCollision.php .我有一个让我很困惑的问题 - 如果我尝试交换起点和终点,Flash 演示球会在没有响应的情况下掉落。 有人可以向我解释一下模拟是如何工作的吗? 我修改了这个示例代码。在交换起点和终点之前它工作完美,这是 objective-c 中的相同代码

提前致谢。 .

-(void)render:(ccTime)dt {

 if(renderer)
 {
  CGPoint b = ball.position;


  float bvx = ball.vx;
  float bvy = ball.vy;

  bvx += .02;
  bvy -= .2;

  b.x += bvx;
  b.y += bvy;

  float br = ball.contentSize.width/2;
  for ( int p = 0 ; p < [map count]  ; p++ ) {

   line *l = [map objectAtIndex:p];
   CGPoint p0 = l.end;
   CGPoint p1 = l.start;

   float p0x = p0.x, p0y = p0.y, p1x = p1.x, p1y = p1.y;

   // get Angle //

   float dx = p0x - p1x;
   float dy = p0y - p1y;

   float angle = atan2( dy , dx );

   float _sin = sin ( angle );
   float _cos = cos ( angle );

   // rotate p1 ( need only 'x' ) //

   float p1rx = dy * _sin + dx * _cos + p0x;

   // rotate ball //

   float px = p0x - b.x;
   float py = p0y - b.y;

   float brx = py * _sin + px * _cos + p0x;
   float bry = py * _cos - px * _sin + p0y;

   float cp = ( b.x - p0x ) * ( p1y - p0y ) - ( b.y - p0y ) * ( p1x - p0x );

   if ( bry > p0y - br && brx > p0x && brx < p1rx && cp > 0 ) {

    // calc new Vector //

    float vx = bvy * _sin + bvx * _cos;
    float vy = bvy * _cos - bvx * _sin;

    vy *= -.8;
    vx *= .98;

    float __sin = sin ( -angle );
    float __cos = cos ( -angle );

    bvx = vy * __sin + vx * __cos;
    bvy = vy * __cos - vx * __sin;

    // calc new Position //

    bry = p0y - br;

    dx = p0x - brx;
    dy = p0y - bry;

    b.x = dy * __sin + dx * __cos + p0x;
    b.y = dy * __cos - dx * __sin + p0y;

   }

  }
  ball.position = b;
  ball.vx = bvx;
  ball.vy = bvy;

  if ( b.y < 42)
  {

   ball.position = ccp(50, size.height - 42);
   ball.vx = .0f;
   ball.vy = .0f;

  }
 }

}

最佳答案

点的顺序定义了曲线上的方向。如果起点在左边,终点在右边,则曲线的方向是“向上”指向曲线上方。但是,如果交换起点/终点,则曲线方向相反,因此现在“向上”实际上指向曲线下方。

当您的代码检测到碰撞然后更正速度时,它使用曲线的方向。这就是为什么当球掉落在起点/终点互换的曲线上时,它看起来像是跳过了曲线。

要更正此问题,您的碰撞解决代码应检查球在曲线的哪一侧(相对于曲线的方向),并相应地进行调整。

关于iphone - 线和点之间的二维碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3930051/

相关文章:

ios - iOS NSLinguisticTagger在获取词干时始终返回null

python - 使用胡克定律近似 F

iphone - 如何释放本地 alloc init NSMutableArray 并返回其引用

ios - UIView 未填充 TableView tableHeaderView 属性 swift

objective-c - 更改 UITextField 键盘的色调

objective-c - NSDate - 更改年份值

python - 如何绘制抛射体在重力、浮力和空气阻力作用下的运动?

c# - 给 Sprite 添加力量

ios - 我无法让 UISlider 在 UITableViewCell 中滑动 - 我认为这是一个 iOS 7 问题

iphone - 如何在iPhone应用程序之间共享自定义数据?