Bir top köşeye çarptı, nereye çarpacak?


46

Trigonometriyi tazelemeye ihtiyacım var ve basit bir matematik modelle burada yardımcı olabileceğinizi umuyorum. Ekteki resimde şimdiye kadarki modelim. Kare animasyonunun, top çok hızlı hareket ederken başka sorunları olduğunu biliyorum, ancak şimdilik sadece ballDx ve ballDy'yi hesaplamam gerekiyor. Aynı zamanda, ballDx = 0 (yalnızca dikey hareket) mümkündür, ancak top ballDx'i saptığında farklı bir değer alabilir.

Taşınmaz ve hareket ettirilemez bir cismin köşe kenarı ile 2D çarpışması


22
"Köşe davası" dedikleri bu mu?
Andrew Grimm

2
Kuşkusuz, işler gittikçe, yakında bunu çözmek için görelilik teorisini kullanabiliriz - sorun kitleselleşmektir (ive).
Lumis

Yanıtlar:


45

Not: Aşağıdakilerin tümü, topun yüzeyinin sürtünmesiz olduğunu varsayar (yani dönmeye başlamaz veya olduğu gibi farklı şekilde yükselir).

Çarpışma anında, top köşeye değecek. Katı nesneler çarpıştığında, yüzey normal olarak adlandırılan, yani çarpışma noktasında yüzeye dik olan bir kuvvet etki eder.

Bir top olduğundan, yüzeye dik, topun merkezine doğru. Tamam, gücün yönünü biliyoruz, peki ya büyüklüğü? Elastik bir çarpışmanın (ve dikdörtgenin hareket edemediğini) varsayarak, topun çarptığı hızda toparlanması gerekir.

(NDx, nDy) çarpışmadan sonraki hız, (oDx, oDy) çarpışmadan önceki hız ve (x, y) topun çarpışma noktasındaki konumu olsun. Topun çarpıştığı köşede (0,0) olduğunu varsayalım.

İçgörülerimizi formül olarak ifade ederek:

(nDx, nDy) = (oDx, oDy) + c * (x, y)
length (nDx, nDy) = length (oDx, oDy)

Hangi eşdeğerdir:

nDx = oDx + c * x
nDy = oDy + c * y
nDx^2 + nDy^2 = oDx^2 + oDy^2

En sondaki ilk iki denklemi değiştirerek, şunu elde ederiz:

(oDx + c * x)^2 + (oDy + c * y)^2 = oDx^2 + oDy^2

Binom thorem kullanarak genişleyen

(a+b)^2 = a^2 + 2ab + b^2 

verim:

oDx^2 + 2 * oDx * c * x + (c * x) ^ 2 + oDy^2 + 2 * oDy * c * y + (c * y) ^ 2 = oDx^2 + oDy^2
2 * oDx * c * x + 2 * oDy * c * y + (c * x) ^ 2 + (c * y) ^ 2 = 0
(2 * oDx * x + 2 * oDy * y) * c + (x^2 + y^2) * c^2 = 0

Bu ikinci dereceden denklemin c, biri 0 olan iki çözümü vardır. Açıkçası, ilgilendiğimiz çözüm bu değildir, çünkü topun yönü genellikle çarpışma sonucunda değişecektir. Diğer çözümü elde etmek için her iki tarafı da c ile bölüp alırız:

(2 * oDx * x + 2 * oDy * y) + (x^2 + y^2) * c = 0

Yani:

 c = -(2 * oDx * x + 2 * oDy * y) / (x^2 + y^2)

Özetlemek gerekirse, biz var:

c = -(2 * oDx * x + 2 * oDy * y) / (x^2 + y^2)
nDx = oDx + c * x
nDy = oDy + c * y

Düzenleme : Kodda:

if (collision) {
    float x = ballX - cornerX;
    float y = ballY - cornerY;
    float c = -2 * (ballDx * x + ballDy * y) / (x * x + y * y);
    ballDx = ballDx + c * x;
    ballDy = ballDy + c * y;
}

Birkaç uygulama düşüncesi: Simülasyon adımından sonra topun pozisyonuyla yaklaşık (x, y) değerine ulaşabiliyorken, bu yaklaşım sapma açısını değiştirecek ve bu nedenle çok dikkat çekici olacak, böylece simülasyon adımlarınızın çok iyi olması gerekiyor (belki de top adım başına çapının 1 / 20'sinden fazla hareket etmiyor). Daha doğru bir çözüm için, çarpışmanın meydana geldiği zamanı hesaplayabilir ve o zaman o simülasyon adımını bölebilirsiniz, yani çarpışma noktasına kadar kısmi bir adım ve adımın geri kalan kısmı için başka bir kısmi adım yapabilirsiniz.

Düzenleme 2: Etki noktasının hesaplanması

Simülasyonun başlangıcında r'nin yarıçap, (x0, y0) konumu ve (dx, dy) topun hızı olalım. Basit olması için, söz konusu köşenin (0,0) konumunda olduğunu varsayalım.

Biliyoruz:

(x,y) = (x0, y0) + (dx, dy) * t

İstiyoruz

length(x,y) = r

Yani

(x0 + dx * t) ^ 2 + (y0 + dy * t) ^ 2 = r^2
x0^2 + 2 * x0 * dx * t + dx^2 * t^2 + y0^2 + 2 * y0 * dy * t + dy^2 * t^2 = r ^ 2
(dx^2 + dy^2) * t^2 + (2 * x0 * dx + 2 * y0 * dy) * t + (x0^2 + y0^2 - r^2) = 0
\____  _____/         \____________  ___________/       \_______  ________/
     \/                            \/                           \/
     a                             b                            c

Bu, t cinsinden ikinci dereceden bir denklemdir . Ayrımcı ise

D = b^2 - 4 * a * c

negatif, çözümü yok, yani top, mevcut rotasında köşeye asla vuramaz. Aksi takdirde, iki çözümü tarafından verilir

t1 = (-b - sqrt(D)) / (2 * a)
t2 = (-b + sqrt(D)) / (2 * a)

Çarpışmanın başladığı zamanla ilgileniyoruz, ki bu daha önceki zamandır t1.

Yöntemin şöyle olur:

    // compute a,b,c and D as given above

    if (D >= 0) {
        t = (-b - sqrt(D)) / (2 * a);
        if (0 < t && t <= ts) {
            // collision during this timestep!

            x = x + t * dx;
            y = y + t * dy;
            ts = ts - t;

            // change dx and dy using the deflection formula 
        }
    }

    x = x + ts * dx;
    y = y + ts * dy;

1
bu hak +1
dinamik

1
Canlandırmaktan çekinmeyin, ardından :-)
meriton - grevde

3
Bunu çok erken söylüyorsunuz, At the moment of collision, the ball will be touching the cornerancak bu yaklaşımın bir gerekçesini göremiyorum (ve bu bir yaklaşım olmalıdır çünkü doğru değil - top iki köşeye dokunuyor, ikisi de köşe değil).
Peter Taylor

1
@Peter Taylor: OP'nin topu dikdörtgenin dışına çektiğini fark ettiniz ve soruda verilen çarpışma tespit formülü de bunu varsayıyor mu? Burada kutunun dışında düşünmelisin :-)
meriton - grevde

1
Bu cevabı seviyorum, fakat bazı matematiğin $ \ LaTeX $ işaretini kullanabilir.
Martin Wickman

13

İşte bir probleme bakmanın görsel bir yolu.

Orijinal problem seti daireye karşı dikdörtgene karşılık gelir (aşağıdaki resimde gri). Bu, noktaya karşı yuvarlanmış rektife eşittir (siyah ile gösterilmiştir).

Yani bu çok parçalı bir sorundur. Nokta çarpışmanıza karşı 4 çizgiyi (orijinal çemberin yarıçapı tarafından kutunun kenarından çıkarılmış) ve 4 daireyi (dikdörtgenin köşelerinde, orijinal çemberin yarıçapı ile birlikte) test ediyorsunuz.

Orijinal görüntünüzdeki kaba hız ile, nokta sağ alt köşe çemberine çarpacaktır. Yapmanız gereken tek şey, çarpacağınız köşe çemberindeki noktayı bulmak, bunun açısını hesaplamak ve yansıtmak.

görüntü tanımını buraya girin

Bunun türetilmesini okuyucuya alıştırma olarak bırakacağım.


2

Bir oyun üzerinde çalışıyorum ve ayrıca burada kaldım. Ama sanırım bu tarafa gidiyor:

görüntü tanımını buraya girin

Başka bir görüş var Benim sorunum, yeni dx'i hızlı bir şekilde nasıl hesaplayacağımı bilmememdir (bana geleneksel matematik kullanarak çok fazla hesaplama gerektirir).


Benim bakış açım, 2. bağlantıdakikinden farklı, çünkü yeni hız vektörünün bloğun merkezine bu şekilde bağlı olduğunu sanmıyorum. Kardeşim bana topun eski yöne döneceğini söyledi (dx = -dx && dy = - dy) ama sanmıyorum.
Risa

Top köşeye çarparsa ve köşe X ile top X arasındaki mesafe topun 1 / 4'ünden daha küçükse, o zaman geri zıplar, aksi takdirde sağa doğru saptırır. Bu şu anda kullanıyorum, tam açı bulmak için iyi ayarlanmamış basit bir model.
Lumis

0

Kinematik, hesaplamalar için en uygun olduğu gibi referans çerçevesini seçmek için doğru seçimi yapmakla ilgilidir .

Burada , eksenlerimizi topun merkezi ile köşe arasında bir çizgiye paralel ( x ' ) ve dik ( y' ) bileşenlere dönüştüren T dönüşümünü tanımlayacağız . Ters T * dönüşümü orijinal koordinat sistemimizi geri yükleyecektir.

Bu yeni referans çerçevesinde, yansıma (ve fiziğin zaman ve uzay simetrisi) ile, X kontağını tersine çeviren ve y ' bileşenini değiştirmeyen şekilde temas M'nin (bir nokta impuls ) hız dönüşümüne sahibiz . Olarak matris terimleri bu diyagonal diyagonal matris ile 1 ve 1 'dir.

O zaman çarpışmadan sonra hız basitçe: V ' = T * . M . T . Vo .

Etki süresi t sonra sadece (çözüm olarak , T . Do ) + ( X . , T . Vo ) ( t ) = r X X ekseni projeksiyon operatörü ve r, topun yarıçapıdır. Yeniden düzenlenmiş elde ederiz
t = ( r - ( T . Do )) / (( X . , T . Vo ) ( t ))

Bu, tüm karmaşık matematiği titizlikle yazılmış, test edilmiş ve hata ayıklanmış standart grafik kütüphanelerinde gömme özelliğine sahiptir. Bu çözüm 2D ve 3D durumlar için de aynıdır - sadece grafik kütüphanesini değiştirin. Son olarak, herhangi bir fizik problemini çözmeden önce ilk önce uygun referans çerçeveleri hakkında düşünmesi gerektiğini vurgulamaktadır . Her zaman NIH'nin cezbedici yanı vardır, ancak gerçekte, daha özlü çözümler mevcut olduğunda hatalar için sadece bir reçetedir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.