不同尺寸(半径)的静圆碰撞

时间:2013-08-06 16:02:33

标签: actionscript-3 collision geometry

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

为了简单起见,我将使用两个圆圈。一个是半径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;

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

当圆圈有两种不同的尺寸时,问题就开始了。当它们相交时会发生什么样的情况,它看起来像是一个较大的圆圈,在仍然附着的情况下远离较小的圆圈。

你们有没有想过为什么会这样?

1 个答案:

答案 0 :(得分:0)

我的脸上有一记耳光。我忘了当你有两个不同半径的物体时,你需要得到两者的平均值。所以如果有其他人有同样的问题。加上这个:

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;