Atölye › Pinball › 10/42. adım
Duvarların topu durdurması için önce şunu bilmeliyiz: top bir duvara değiyor mu? Duvarlarımız eğik de olabilen çizgi parçaları; yuvarlak bir topun eğik bir çizgiye değmesini nasıl anlarız?
Fikir şu: çizginin üstünde topun merkezine en yakın noktayı buluruz. O noktayla merkez arasındaki uzaklık
yarıçaptan (R) küçükse, top çizgiye girmiş demektir. Bir ipe en yakın yerinden dokunmak gibi.
Bu adımda yalnız "değiyor mu?" sorusunu cevaplayan fonksiyonu yazıyoruz: hitSegment. Adındaki "hit" çarpmak demek.
Yorum satırı, fonksiyonun birkaç adım sonra ne yapacağını anlatıyor: topu dışarı itmek ve sektirmek.
```js
// Push the ball out of a segment and bounce it.
function hitSegment(x1, y1, x2, y2, bounce) {
const dx = x2 - x1
const dy = y2 - y1
const t = Math.max(0, Math.min(1, ((ball.x - x1) * dx + (ball.y - y1) * dy) / (dx * dx + dy * dy)))
const px = x1 + t * dx
const py = y1 + t * dy
const d = Math.hypot(ball.x - px, ball.y - py)
if (d >= R || d === 0) return false
return true
}
```dx, dy → çizginin bir ucundan öbür ucuna gitmek için ne kadar sağa ve aşağı gidilir.t → en yakın noktanın çizginin neresinde olduğu: 0 baş, 1 son, 0.5 tam orta.ax * bx + ay * by); payda çizginin uzunluğunun karesi.Math.min(1, ...) iki sayıdan küçüğünü, Math.max(0, ...) büyüğünü seçer. Birlikte t'yi 0 ile 1
arasına sıkıştırırlar: nokta çizginin dışına taşmaz, gerekirse bir uçta kalır.px, py → en yakın noktanın kendisi: başlangıçtan t kadar yol almış nokta.Math.hypot(a, b) → a ve b kenarlı dik üçgenin uzun kenarı (Pisagor): iki nokta arasındaki uzaklık. d
en yakın nokta ile topun merkezi arasındaki uzaklık.if (d >= R || d === 0) return false → uzaklık yarıçaptan küçük değilse top değmiyor: false (hayır) döndür ve
bitir. d === 0 (merkez tam çizginin üstünde) garip bir durum; yönü bilinemediği için onu da atlarız.return true → buraya geldiysek top çizgiye değiyor: true (evet).bounce → duvarın ne kadar esnek olduğu. Şimdilik kullanılmıyor; iki adım sonra sekmede kullanacağız.hitSegment fonksiyonunu function update() { satırının üstüne yaz; altında bir boş satır
kalsın.t satırını dikkatle yaz: her açılan parantezin bir kapanışı olmalı.Beceriler: Çarpışma tespiti, Fonksiyonlar