Atölye › Bilardo › 29/33. adım
Fizik artık bu kadar hassas olduğuna göre vuruşu önceden tahmin edebiliriz. Hayalet top, isteka topunun başka bir topa ilk değdiği an bulunacağı yerdir. Gerçek bilardocular tam olarak bunu hayal eder.
Her top için iki şey ölçeriz: nişan çizgisi boyunca ne kadar ileride (t) ve çizgiden ne kadar yanda. Yandaki
uzaklık bir çaptan (2R) azsa isteka topu ona çarpacak. En yakın çarpma kazanır.
```js
// Where the cue ball will first touch another ball along the aim: the "ghost ball".
function ghost() {
const ux = Math.cos(aim)
const uy = Math.sin(aim)
let first = null
for (const b of balls) {
if (b === cue) continue
const dx = b.x - cue.x
const dy = b.y - cue.y
const t = dx * ux + dy * uy // how far along the aim line the ball is
const side = dx * dx + dy * dy - t * t // squared distance from the line
if (t <= 0 || side >= R * R * 4) continue
const hit = t - Math.sqrt(R * R * 4 - side)
if (!first || hit < first.hit) first = { hit, ball: b, x: cue.x + ux * hit, y: cue.y + uy * hit }
}
return first
}
```ux, uy → nişan yönü, uzunluğu 1.let first = null → şimdiye kadar bulunan en yakın çarpma; henüz yok.const t = dx * ux + dy * uy → nokta çarpım: topun merkezi nişan çizgisi boyunca ne kadar ileride.const side = dx * dx + dy * dy - t * t → Pisagor: toplam uzaklığın karesi eksi t² = çizgiden yana uzaklığın
karesi. Karekök almaya gerek yok; kareleri karşılaştırırız.if (t <= 0 || side >= R * R * 4) continue → top arkadaysa veya yandaki uzaklık 2R'den büyükse (kareler:
4R²) çarpma yok.const hit = t - Math.sqrt(R * R * 4 - side) → merkezler 2R uzakta değer; bu yüzden isteka topu t'ye varmadan o
kadar önce durur. Tam karşıdan (side 0) → t - 2R.if (!first || hit < first.hit) first = { ... } → ilk bulunan ya da daha yakınsa sakla: mesafe, çarpılan top ve
hayalet topun merkezi.return first → en yakın çarpma, ya da hiç yoksa null.function draw() { satırının üstüne yorumuyla birlikte ghost fonksiyonunu yaz; altında bir boş satır kalsın.
Çalıştır: ekran değişmez; çizimi bir sonraki adımda yapacağız.
Beceriler: Çarpışma tespiti, Fonksiyonlar
← Daha küçük adımlar Hayalet topu çiz →