در برخورد الاستیک طبق قانون پایستگی انرژی ،همواره انرژی ثابته،بنابرین برایند سرعت دو جسم قبل برخورد برابر با مجموع سرعت بعد برخورده،کلا برای شبیه سازی برخورد باید یک سری کارای عمده رو انجام بدیم
1-تشخیص
2-تغییر موقعیت | repositioning|
3-محاسبه سرعت جدید
تشخیص سادست ، هرگاه فاصله دو جسممون ( اجسام در این نوع برخورد ها دایره شکل هستند) از برایند شعاع دو جسم کمتر بشه یعنی برخورد رخ داده،احتمال داره بعد از برخورد تو رفتگی ایجاد شده باشه بنا برین باید تغیر موقعیت پیدا کنه ،اگه فاصله این در هم رفتگی رو L در نظر بگیریم ؛ هرکدوم از اشیامون باید به مقدار L/2 روی محور فاصله تغیر موقعیت بدن، یکی کم و یکی زیاد ;و برای تعین سرعت های جدید باید محاسبات برداری انجام بدیم که عکسا بهتر توضیح میدن
var dist:Vec2=p1.loc.subOf(p2.loc)
var rads:Number=p1.rad+p2.rad
if(dist.length<(rads) && p1!=p2 ){
var v1:Vec2=p1.velo.clone()
var v2:Vec2=p2.velo.clone()
var l:Number=(dist.length-rads)
var movefactor:Vec2=dist.unit().scaleOf(l/2)
p1.loc.dec(movefactor)
p2.loc.inc(movefactor)
var u1:Vec2=v1.project(dist)
var u2:Vec2=v2.project(dist)
var u1_u2:Vec2=u1.subOf(u2)
var newv1:Vec2=v1.addOf(u1_u2.scaleOf(-1))
var newv2:Vec2=v2.addOf(u1_u2)
روش دوم که میشه حرکت inelastic هم پیاده سازی کرد اینه که بعد از تشخیص برخورد
1-بردار بین مرکز دو شی رو به دست میاریم و همچنین بردار نرمال ان را
2-بردار سرعت را روی این دو بردار project میکنیم
حال دو بردار تجزیه شده داریم که هرکدوم دارای دو بردار v1normal سایه شده بردار v1 روی بردار واحد dist و v1tan بردار تصویر همان بردار سرعت روی بردار عمود dist ،حالا میتونیم عملیات جبری مربوط به سرعت elastic یا inelastic رو روی این دو مولفه ها انجام بدیم ، و در آخر دو مولفه رو جمع میکنیم تا بردار سرعت جدید بدست بیاد، برای مثال :
var normal:Vec2=dist.unit()
var tan:Vec2=new Vec2(normal.y*-1,normal.x)
var p1_normal:Number=normal.dot(v1)
var p2_normal:Number=normal.dot(v2)
var p1_tan:Number=tan.dot(v1)
var p2_tan:Number=tan.dot(v2)
var u1:Number,u2:Number
var m1:Number=p1.mass
var m2:Number=p2.mass
u1=(p1_normal * (m1 - m2) +2 * m2 * p2_normal) / (m1 + m2);
u2=(p2_normal * (m2 - m1) +2 * m1 * p1_normal) / (m1 + m2);
var p1_normalafter_vec:Vec2=normal.scaleOf(u1)
var p2_normalafter_vec:Vec2=normal.scaleOf(u2)
var p1_tan_vec:Vec2=tan.scaleOf(p1_tan)
var p2_tan_vec:Vec2=tan.scaleOf(p2_tan)
p1.velo=p1_tan_vec.addOf(p1_normalafter_vec)
p2.velo=p2_tan_vec.addOf(p2_normalafter_vec)