【问题标题】:Static circle collision with different size (radius)不同大小(半径)的静态圆碰撞
【发布时间】:2013-08-06 16:02:33
【问题描述】:

我遇到了圆形碰撞问题,不是碰撞检测本身,而是解决碰撞的处理程序。

为简单起见,我将使用两个圆圈。一个是半径为 50,另一个是 30。当圆圈相交时,这是处理程序所做的

//Calculates distance between circles
var nDistX:Number = CircleB.x - CircleA.x;
var nDistY:Number = CircleB.y - CircleA.y;
var nDistance:Number = Math.sqrt ( nDistX * nDistX + nDistY * nDistY );

//Gets the radius
var radiusA:Number = CircleA.width/2;
var radiusB:Number = CircleB.width/2;

//Calculates midpoint           
var midpointX:Number = ( CircleA.x + CircleB.x )/2;
var midpointY:Number = ( CircleB.y + CircleB.y )/2;

//Calculates the new position
CircleA.x = midpointX + radiusA * (CircleA.x - CircleB.x) / nDistance;
CircleA.y = midpointY + radiusA * (CircleA.y - CircleB.y) / nDistance;
MCBallB.x = midpointX + radiusB * (CircleB.x - CircleA.x) / nDistance;
MCBallB.y = midpointY + radiusB * (CircleB.y - CircleA.y) / nDistance;

上面的代码在涉及两个具有相同半径的圆时可以完美运行。当圆圈相交时(例如,在靠近每个圆圈的坐标中生成),圆圈会彼此分开。

当圆圈有两种不同的大小时,问题就开始了。当它们相交时会发生什么,看起来较大的圆圈从较小的圆圈跑开,但仍然连接。

你们中有人知道为什么会这样吗?

【问题讨论】:

    标签: actionscript-3 collision geometry


    【解决方案1】:

    我的脸被打了一巴掌。我忘记了当你有两个不同半径的物体时,你需要得到两者的平均值。所以万一有其他人有同样的问题。添加这个:

    var averageRadius:Number = (radiusA + radiusB) / 2;
    

    并将定位器替换为:

    CircleA.x = midpointX + averageRadius * (CircleA.x - CircleB.x) / nDistance;
    CircleA.y = midpointY + averageRadius * (CircleA.y - CircleB.y) / nDistance;
    CircleB.x = midpointX + averageRadius * (CircleB.x - CircleA.x) / nDistance;
    CircleB.y = midpointY + averageRadius * (CircleB.y - CircleA.y) / nDistance;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多