Gepost door: gert | februari 7, 2008

Circle- circle collision detection

Een botsing tussen twee cirkels detecteren, is niet zo eenvoudig. Het vraagt een goede basis van Wiskunde. Even diep ademhalen… daar gaan we.

Doel

We berekenen of er een botsing zal optreden tussen twee cirkels, na een bepaalde tijd, in memory. Daarvoor hebben we nodig:

  • de plaats van de cirkels: x1, y1, x2, y2
  • de snelheid waarmee ze bewegen: x1Mov, y1Mov, x2Mov, y2Mov
  • de tijd waarnaar we rekenen: t

Wanneer is er een botsing?

Twee cirkels botsen als de som van hun stralen kleiner of gelijk is aan de afstand tussen de cirkels.

circle-circle-collision.gif

We berekenen

snelheid = afstand / tijd
afstand = snelheid * tijd

x1 = xo1 + x1Mov * t -> xo1 is de oude x1
y1 = yo1 + y1Mov * t
x2 = xo2 + x2Mov * t
y2 = yo2 + y2Mov * t

afstand = Math.sqrt((x1 – x2)² + (y1 – y2)²) -> Pythagoras
afstand = R1 + R2 = d -> zie tekening

d² = (x1 – x2)² + (y1 – y2)²
d² = x1² – 2*x1*x2 + x2² + y1² – 2*y1*y2 + y2²

De afstand berekenen na een bepaalde tijd

x1² = ( xo1 + x1Mov * t)²
x1² = xo1² + 2*xo1*x1Mov * t + x1Mov²*t²

-2*x1*x2 = -2*(xo1 + x1Mov * t)*(xo2 + x2Mov * t)
-2*x1*x2 = -2*(xo1*xo2 + xo1*x2Mov*t + x1Mov*t*xo2 + x1Mov*x2Mov*t²)
-2*x1*x2 = (-2* x1Mov*x2Mov)*t² + (-2*xo1*x2Mov -2*xo2* x1Mov) *t – 2*xo1*xo2

x2² = ( xo2 + x2Mov * t)²
x2² = xo2² + 2*xo2*x2Mov * t + x2Mov²*t²

y1² = ( yo1 + y1Mov * t)²
y1² = yo1² + 2*yo1*y1Mov * t + y1Mov²*t²

-2*y1*y2 = -2*(yo1 + y1Mov * t)*(yo2 + y2Mov * t)
-2*y1*y2 = -2*(yo1*yo2 + yo1*y2Mov*t + y1Mov*t*yo2 + y1Mov*y2Mov*t²)
-2*y1*y2 = (-2* y1Mov*y2Mov)*t² + (-2*yo1*y2Mov -2*yo2* y1Mov) *t – 2*yo1*yo2

y2² = ( yo2 + y2Mov * t)²
y2² = yo2² + 2*yo2*y2Mov * t + y2Mov²*t²

We vereenvoudigen door constanten in te voegen

Om tot een kwadratische functie te komen, voegen we de factoren van t² en t, samen.

Voor x

ax = x1Mov² -2* x1Mov*x2Mov + x2Mov² -> t²
bx = 2*xo1*x1Mov -2*xo1*x2Mov -2*xo2* x1Mov + 2*xo2*x2Mov -> t
cx = xo1² – 2*xo1*xo2 + xo2² -> geen t

Voor y

ay = y1Mov² -2* y1Mov*y2Mov + y2Mov² -> t²
by = 2*yo1*y1Mov -2*yo1*y2Mov -2*yo2* y1Mov + 2*yo2*y2Mov -> t
cy = yo1² – 2*yo1*yo2 + yo2² -> geen t

x en y samentellen

a = ax + ay
b = bx + by
c = cx + cy – d² (zie hoger)

Alles samenvoegen

a*t² + b*t + c = 0

Berekenen van de tijd

Met deze kwadratische vergelijking kunnen we de tijd berekenen, nadat een bepaalde afstand is afgelegd.

t = -b +/- Math.sqrt(b² – 4ac)/2a

Dit levert 2 oplossingen op. Inderdaad, als twee cirkels naar elkaar toe bewegen, zullen ze exact 2 maal raken: als ze elkaar tegenkomen en als ze elkaar verlaten.


Reacties

  1. в конце концов: отлично..


Geef een reactie

Fill in your details below or click an icon to log in:

WordPress.com logo

Je reageert onder je WordPress.com account. Log Out / Bijwerken )

Twitter-afbeelding

Je reageert onder je Twitter account. Log Out / Bijwerken )

Facebook foto

Je reageert onder je Facebook account. Log Out / Bijwerken )

Verbinden met %s

Categorieën

Follow

Get every new post delivered to your Inbox.