Atölye › Bilardo › 29/33. adım

Vuruşu tahmin et

Ne yapıyoruz

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
}
```

Ne işe yarıyor

Sıra sende

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

Tüm adımlar

  1. Oda
  2. Masa
  3. İsteka topu
  4. Topları çiz
  5. Üçgen
  6. Topların numaraları
  7. Nişan çizgisi
  8. Nişanı çevir
  9. Vuruş bir hızdır
  10. Yuvarlan
  11. Sürtünme
  12. Bantlar
  13. Nişan ve yuvarlanma
  14. Yuvarlanırken nişanı gizle
  15. Vuruşları say
  16. Değen toplar
  17. İtişi değiş tokuş et
  18. Altı cep
  19. Cebe girdi
  20. Faul
  21. Kalan toplar
  22. Masayı temizle
  23. Gücü seç
  24. Güç çubuğu
  25. Sapan
  26. Basarak nişan al
  27. Geri çek ve bırak
  28. Daha küçük adımlar
  29. Vuruşu tahmin et
  30. Hayalet topu çiz
  31. Çarpılan top nereye gider
  32. Rekorun
  33. Kendin yap: iki oyuncu