Atölye › Bilardo › 17/33. adım
Oyunun kalbi burası. Her topun hızını iki parçaya ayırdığını düşün: merkezleri birleştiren çizgi (normal) boyunca olan parça ve ona dik olan parça. Aynı ağırlıkta iki top çarpışınca yalnız normal boyunca olan parçaları değiş tokuş ederler; dik parçalar olduğu gibi kalır.
Bundan her bilardocunun bildiği iki sonuç çıkar:
```js
// Two balls of the same mass that touch swap the parts of their velocities that point along the line between them.
const along = (a.vx - b.vx) * nx + (a.vy - b.vy) * ny
if (along <= 0) return // already moving apart
a.vx -= along * nx
a.vy -= along * ny
b.vx += along * nx
b.vy += along * ny
```(a.vx - b.vx) * nx + (a.vy - b.vy) * ny → a'nın b'ye normal boyunca ne hızla yaklaştığı. Bir yönü
(nx, ny) birim yönüne izdüşürmenin yolu nokta çarpım: x * nx + y * ny. Sonuç: o yöndeki parçanın büyüklüğü.if (along <= 0) return → sıfır ya da eksiyse zaten uzaklaşıyorlar. Yine değiş tokuş yapsaydık iki top her karede
ileri geri çarpışıp birbirine yapışırdı.a.vx -= along * nx, a.vy -= along * ny → a normal boyunca o kadar hız kaybeder.b.vx += along * nx, b.vy += along * ny → b aynı kadar kazanır. Sonuç tam olarak normal boyunca parçaların
yer değiştirmesi.a 5 hızla gelir, b durur → along = 5 → a 0, b 5.function collide(a, b) { satırının üstüne yorum satırını ekle.collide'ın sonunda b.y += ny * overlap satırının altına altı satırı yaz.Beceriler: Hız ve yerçekimi, Çarpışma tespiti