C# 分离两个相撞的圆

C# 分离两个相撞的圆,c#,math,xna,collision-detection,C#,Math,Xna,Collision Detection,我想把两个相撞的圆分开。多亏了别人的帮助,我就在那里 这是我的代码: var totalRadius : Number = _circle1.radius + _circle2.radius; var x : Number = _circle1.position.x - _circle2.position.x; var y : Number = _circle1.position.y - _circle2.position.y; var distanceSquared : Number = (

我想把两个相撞的圆分开。多亏了别人的帮助,我就在那里

这是我的代码:

var totalRadius : Number = _circle1.radius + _circle2.radius;
var x : Number = _circle1.position.x - _circle2.position.x;
var y : Number = _circle1.position.y - _circle2.position.y;

var distanceSquared : Number = (x * x) + (y * y);

if (distanceSquared < totalRadius * totalRadius)
{   
    var distance : Number = Math.sqrt(distanceSquared);

    var separation : Number = totalRadius - distance;

    var unitVectorX : Number = (_circle1.position.x - _circle2.position.x) / distance;
    var unitVectorY : Number = (_circle1.position.y - _circle2.position.y) / distance;

    _circle1.position.x += unitVectorX * (separation / 2);
    _circle1.position.y += unitVectorY * (separation / 2);

    _circle2.position.x -= unitVectorX * (separation / 2);
    _circle2.position.y -= unitVectorY * (separation / 2);
}
var totalRadius:Number=\u circle1.radius+\u circle2.radius;
变量x:Number=_circle1.position.x-_circle2.position.x;
变量y:Number=_circle1.position.y-_circle2.position.y;
var距离平方:数字=(x*x)+(y*y);
if(距离平方<总半径*总半径)
{   
变量距离:Number=Math.sqrt(距离平方);
变量间隔:数字=总半径-距离;
var unitvectrox:Number=(_circle1.position.x-_circle2.position.x)/distance;
var unitVectorY:Number=(_circle1.position.y-_circle2.position.y)/distance;
_圆圈1.position.x+=unitVectorX*(分离/2);
_圆圈1.位置y+=单位向量*(分隔/2);
_圆圈2.position.x-=unitVectorX*(分离/2);
_圆圈2.position.y-=单位向量*(分隔/2);
}
如果两个圆的速度相同,效果会很好。当它们有不同的速度时就会出现问题,问题是因为我在均匀地分割分离(
separation/2)
我想

如果circle1的速度为1,0,circle2的速度为-1,0,那么一切都会完美工作。这两个圆圈互相撞击,然后停了下来

如果圆圈1的速度为2,0,圆圈2的速度为-1,0,则圆圈逐渐向右移动。我想这就是正在发生的事情:

框架1:

  • 圆圈1(99100)
  • 圆圈2(101100)
框架2:

  • 圆圈1(101100)
  • 圆圈2(100100)
  • 检测到碰撞,修正位置分别为-0.5和+0.5
  • 圆圈1(100.5100)
  • 圆圈2(100.5100)
框架3:

  • 圆圈1(102.5100)
  • 圆圈2(99.5100)
  • 检测到碰撞,修正位置分别为-1.5和+1.5
  • 圆圈1(101100)
  • 圆圈2(101100)
框架4:

  • 圆圈1(103100)
  • 圆圈2(100100)
  • 检测到碰撞,修正位置分别为-1.5和+1.5
  • 圆圈1(101.5100)
  • 圆圈2(101.5100)
正如你所看到的,由于速度的不同,两个圆圈向右增加+0.5

最后,我的问题是:我怎样才能把它们的速度考虑到方程中,这样它就不会在它们的分离中起作用了


谢谢

简而言之:你必须进入那里;)

我猜你希望质量相同,它归结为“^2之前的v1+v2+v2=^2之后的v1+v2”。正如维基文章所建议的,我只是“切换”速度


我不明白的是,为什么你认为两个圆圈都会向右移动?这不是弹性碰撞吗?如果你想让它们有相同的质量,那么它们应该朝不同的方向运动。

简而言之:你必须进入那里;)

我猜你希望质量相同,它归结为“^2之前的v1+v2+v2=^2之后的v1+v2”。正如维基文章所建议的,我只是“切换”速度


我不明白的是,为什么你认为两个圆圈都会向右移动?这不是弹性碰撞吗?如果你想让它们具有相同的质量,那么它们应该朝不同的方向移动。

你需要计算撞击点,而不是(任意)将它们平均向后移动

快速搜索发现以下链接:

  • (“动态圆碰撞”一节)

  • (第“影响,而非交叉点”部分)


  • 您需要计算碰撞点,而不是(任意)将它们平均向后移动

    快速搜索发现以下链接:

  • (“动态圆碰撞”一节)

  • (第“影响,而非交叉点”部分)


  • 一旦他们击中,你不应该也纠正速度,这样他们就不会在下一帧中彼此靠近并发生碰撞了吗?我正在尝试创建一个不堆叠在一起的暴徒(高空射手)所以他们只需设置速度,就可以在下次更新时再次追踪玩家。要解决这个问题,你需要确定“影响点”。见“碰撞而非交叉点”一节,一旦他们击中,你不应该也纠正速度,这样他们就不会在下一帧中彼此靠近并发生碰撞了吗?我正在尝试创建一个不会相互堆叠的暴徒(高空射手)所以他们只需设置速度,就可以在下次更新时再次追踪玩家。要解决这个问题,你需要确定“影响点”。请参阅“影响而非交叉点”一节,我不希望它们朝不同的方向移动。想象一下,一条线正在形成。当新来的家伙从左边进来时,他们不应该再把他们推向右边。他们应该在队伍的尽头停下来。但现在发生的是,当左边的人进来时,他向右边的人渗透了2个单位,把左边的人推到左边1个单位,把右边的人推到右边1个单位(
    separation
    of 2/2=1),所以我需要考虑他们的速度。如果我在你右边,这就是“牛顿creaddle”-这就是公式:v1_之前=0,v2_之前=10,v1_之后=10,v2_之后=0(开关)但在你上面的例子中,两个圆圈都朝着不同的方向运动,如果两个圆圈都有相同的质量,那么在弹性碰撞后,两个圆圈不可能朝着相同的方向运动——你需要一些非弹性。好吧,如果他推进来,这就是一些非弹性——这将很难正确建模。你认为呢真的需要这个吗?我不想让他们朝不同的方向走。想象一下,像是排成一行。当新来的人到来时,我