当前位置: 首页 > 知识库问答 >
问题:

圆与矩形的碰撞

澹台季萌
2023-03-14

我有一个问题,碰撞检测一个圆和一个矩形。我曾尝试用勾股定理来解决这个问题。但所有查询都不起作用。矩形与圆的矩形包围盒发生碰撞。

 if (CGRectIntersectsRect(player.frame, visibleEnemy.frame)) {
   if (([visibleEnemy spriteTyp] == jumper || [visibleEnemy spriteTyp] == wobble )) {
     if ((visibleEnemy.center.x - player.frame.origin.x) * (visibleEnemy.center.x - player.frame.origin.x) +
         (visibleEnemy.center.y - player.frame.origin.y) * (visibleEnemy.center.y - player.frame.origin.y) <=
         (visibleEnemy.bounds.size.width/2 * visibleEnemy.bounds.size.width/2)) {
       NSLog(@"Check  1");
       normalAction = NO;
     }

     if ((visibleEnemy.center.x - (player.frame.origin.x + player.bounds.size.width)) *
         (visibleEnemy.center.x - (player.frame.origin.x + player.bounds.size.width)) +
         (visibleEnemy.center.y - player.frame.origin.y) * (visibleEnemy.center.y - player.frame.origin.y) <=
         (visibleEnemy.bounds.size.width/2 * visibleEnemy.bounds.size.width/2)) {
       NSLog(@"Check  2"); 
       normalAction = NO;
     }
     else {
       NSLog(@"Check  3");
       normalAction = NO;
     }
   }         
 }

共有1个答案

琴镜
2023-03-14

下面是我在一个小游戏项目中如何做到的。它给了我最好的结果,而且很简单。我的代码检测圆和线之间是否有冲突。因此您可以通过检查矩形的所有4条边来轻松地将其用于圆-矩形碰撞检测。

假设一个球有ballradius和location(xBall,yBall)。线由两点(xStart,yStart)(xEnd,yEnd)定义

实现简单的碰撞检测:

float ballRadius = ...;
float x1 = xStart - xBall;
float y1 = yStart - yBall;

float x2 = xEnd - xBall;
float y2 = yEnd - yBall;

float dx = x2 - x1;
float dy = y2 - y1;
float dr = sqrtf(powf(dx, 2) + powf(dy, 2));
float D = x1*y2 - x2*y1;

float delta = powf(ballRadius*0.9,2)*powf(dr,2) - powf(D,2);

if (delta >= 0) 
{ 
    // Collision detected 
}

如果delta大于零,则在球(圆)和线之间有两个交点。如果delta等于零,则存在一个交叉点-完美碰撞。

希望对你有帮助。

 类似资料:
  • 我正在编写一个游戏,涉及碰撞的一个移动的圆,由用户控制,和一个移动的矩形,由计算机控制。 完整的代码可以在这里找到:游戏 我在圆和矩形之间的碰撞检测方面遇到了麻烦。当矩形是静态的,碰撞检测工作完美。当圆和矩形的边缘在任一边接触时,程序就会按照它应该的方式进行操作。 这是碰撞检测功能。 谢谢。

  • 我花了数小时寻找解决方案:我正在用libgdx开发一个自上而下的小游戏(可能这与我使用的引擎有关)。现在我必须在我的角色(圆形)和墙(矩形)之间实现碰撞检测。如果可以滑动,我希望角色在碰撞时沿着墙滑动。让我解释一下: 如果我向上移动45度,我可能会撞到墙的下面、左边或角落。 如果我与左边相撞,我想停止x运动,只向上移动。如果我离开墙壁,那么我想继续向上移动。与下侧相同(停止y运动) 如果我与角落相

  • 我需要找到从圆和矩形的交点创建的最大弧线。我有了圆心,半径和矩形的坐标,我需要找到与圆心交点的角。 我有一个可以工作的代码,但它是通过迭代圆周上的点来计算解的,我想知道是否有更优雅的方法来使用三角学而不是“蛮力”来计算解。 这是我的代码:

  • 问题内容: 我正在寻找一种确定矩形和圆形之间相交区域的快速方法(我需要进行数百万次此类计算)。 一个特殊的属性是,在所有情况下,圆形和矩形始终具有2个相交点。 问题答案: 给定2个交点: *圆内有 *0个顶点 :圆形线段的面积 1个顶点 在圆内:圆弧段和三角形的面积之和。 *圆内有 *2个顶点 :两个三角形和一个圆形线段的面积之和 *圆内有 *3个顶点 :矩形的面积减去三角形的面积再加上圆形线段的

  • 我一直在尝试在Libgdx中找到/创建矩形的碰撞检测,但似乎什么都做不到。我有一个叫bucket的矩形,宽度和高度为64,还有一个叫wall的矩形,宽度和高度为64。我试着让玩家不穿过矩形,可以在粘墙的同时继续移动,而不需要通过相位或随机传送。我的方法在有1个块的情况下有效,但当有多个块的时候,它就会中断,不起作用。 我知道这种方法很难看但这只是实验 如果有人能给我指出正确的方向或分享一些对我有帮

  • 主要内容:圆角矩形,椭圆示例JavaFX Shape类定义了常见的形状,例如线,矩形,圆,Arc,CubicCurve,Ellipse和QuadCurve。 在场景图上绘制矩形需要宽度,高度和左上角的(,)位置。 要在JavaFX中绘制一个矩形,可以使用类。 上面的代码生成以下结果。 圆角矩形 类实现了弧宽和弧高。可以使用这些功能来绘制圆角矩形。 上面的代码生成以下结果。 椭圆示例 上面的代码生成以下结果。