Atölye › Bilardo › 16/33. adım
Toplar şu an birbirinin içinden geçiyor. İki top, merkezleri arasındaki uzaklık bir çaptan (2R) az olunca
değiyordur.
Çarpışmayı iki adımda kuracağız. Bu adımda yalnız iç içe geçmelerini önleyeceğiz: değen iki topu, merkezlerini birleştiren çizgi boyunca, tam değecekleri yere kadar birbirinden iteceğiz. Bu çizginin yönüne normal denir; çarpışmanın her şeyi ona bağlı.
```js
function collide(a, b) {
const dx = b.x - a.x
const dy = b.y - a.y
const dist = Math.hypot(dx, dy)
if (dist >= R * 2 || dist === 0) return
const nx = dx / dist
const ny = dy / dist
// Push them apart so they only just touch.
const overlap = (R * 2 - dist) / 2
a.x -= nx * overlap
a.y -= ny * overlap
b.x += nx * overlap
b.y += ny * overlap
}
for (let i = 0; i < balls.length; i++) for (let j = i + 1; j < balls.length; j++) collide(balls[i], balls[j])
```dx, dy → a'dan b'ye olan fark; dist → merkezler arası uzaklık (Pisagor).if (dist >= R * 2 || dist === 0) return → değmiyorlarsa bir şey yapma. dist === 0 → tam üst üste; yön
belirsiz, 0'a bölmemek için çık.const nx = dx / dist, const ny = dy / dist → a'dan b'ye yön, uzunluğu 1: birim normal. Bir yönü
uzunluğuna bölmek onu 1 uzunluğa getirir.const overlap = (R * 2 - dist) / 2 → ne kadar iç içe geçtiklerinin yarısı: her top o kadar geri çekilir.a.x -= nx * overlap ... → a normalin tersine, b normal yönünde itilir. Sonunda uzaklık tam 2R.step içinde iç içe iki döngü → her top çifti için collide. j i + 1'den başlar: her çift bir kez, top hiç
kendisiyle eşleşmez.function step() { satırının üstüne collide fonksiyonunu yaz; altında bir boş satır kalsın.step içinde top döngüsünün kapanan }'sinden sonra, fonksiyonun son }'sinden önce çift döngüsü satırını yaz.Beceriler: Çarpışma tespiti
← Vuruşları say İtişi değiş tokuş et →