【ActionScript】二维平面弹性碰撞动画
在二维平面上有两个弹性小球,第一个小球的位置是(x1,y1),速度分量分别为v1x,v1y。第二个小球的位置是(x2,y2),速度分量分别为v2x,v2y.如果发生二维完全弹性碰撞,碰撞后的速度分量分别是多少?
ChatGPT:
碰撞前,两个小球的动量分别为:
p1 = m1 * v1 = m1 * (v1x, v1y)
p2 = m2 * v2 = m2 * (v2x, v2y)
其中,m1 和 m2 分别是两个小球的质量。
由于碰撞是完全弹性的,因此碰撞后,两个小球的动量仍然守恒,即
p1' + p2' = p1 + p2
其中,p1' 和 p2' 分别是碰撞后两个小球的动量。
同时,由于碰撞前后两个小球之间的相对速度方向相反,因此碰撞后两个小球的速度大小不变,方向交换。
因此,碰撞后两个小球的速度分别为:
v1' = ((m1 - m2) * v1 + 2 * m2 * v2) / (m1 + m2)
v2' = ((m2 - m1) * v2 + 2 * m1 * v1) / (m1 + m2)
其中,v1' 和 v2' 分别是碰撞后两个小球的速度,v1 和 v2 是碰撞前两个小球的速度,m1 和 m2 分别是两个小球的质量。
- 创建两个动画元件圆形,实例名为
c1
和c2
- 按F9添加以下As脚本代码:
var R:Number = 50;
c1.vx = 20*Math.random();
c1.vy = 20*Math.random();
var vxt:Number = 5;
var vyt:Number = 5;
c2.vx = -10*Math.random();
c2.vy = 10*Math.random();
c1.addEventListener(Event.ENTER_FRAME,Draw1);
c2.addEventListener(Event.ENTER_FRAME,Draw2);
function Draw1(e:Event):void
{
c1.x += c1.vx;
c1.y += c1.vy;
if (c1.x+R >= stage.stageWidth || c1.x-R <= 0) {
c1.vx = -c1.vx;
}
if (c1.y+R >= stage.stageHeight || c1.y-R <= 0) {
c1.vy = -c1.vy;
}
if (Math.sqrt((c1.x-c2.x)*(c1.x-c2.x)+(c1.y-c2.y)*(c1.y-c2.y)) <= 2*R){
vxt = c1.vx;
vyt = c1.vy;
c1.vx = (2 * c2.vx) / 2;
c1.vy = (2 * c2.vy) / 2;
c2.vx = (2 * vxt) / 2;
c2.vy = (2 * vyt) / 2;
}
}
function Draw2(e:Event):void
{
c2.x += c2.vx;
c2.y += c2.vy;
if (c2.x+R >= stage.stageWidth || c2.x-R <= 0) {
c2.vx = -c2.vx;
}
if (c2.y+R >= stage.stageHeight || c2.y-R <= 0) {
c2.vy = -c2.vy;
}
}