Kolize bodu a rotovaného obdélníku
V jednom projektu potřebuju zjišťovat, zda bod leží v obdélníku. Můj problém ale trochu zkomplikoval fakt, že obdélník může být rotovaný. Z pohledu člověka brnkačka, z pohledu počítače už to tak jednoduché není.
Podmínka kontrolující jestli bod leží v obdélníku je jednoduchá a vypadá následovně:
point.x >= rectangle.x
&& point.x <= rectangle.x + rectangle.width
&& point.y >= rectangle.y
&& point.y <= rectangle.y + rectangle.height
Jak ale kontrolovat, zda bod leží v obdélníku, který je rotovaný? Záleží na tom, jak je obdélník zadaný.
Rotovaný obdélník
Mějme rotovaný obdélník \( ABCD \) (tj. rotace je obsažena v bodech obdélníku) a bod \( V \).
Teorie je taková, že: Rovná-li se součet obsahu trojúhelníků \( ABV \), \( ADV \), \( BCV \), \( DCV \) s obsahem obdélníku \( ABCD \), pak bod v daném obdélníku leží. Je-li obsah větší, pak logicky bod leží mimo obdélník.
Základem je zjistění délek všech stran trojúhelníku:
$$ \mathbf{x} = \lvert Vx - Qx\rvert \ \mathbf{y} = \lvert Vy - Qy\rvert \ \mathbf{d} = \sqrt{x^2 + y^2} $$
a následná aplikace Heronova vzorce:
$$ \mathbf{s} = \frac{a + b + c}{2} \ \mathbf{S} = \sqrt{s * (s - a) * (s - b) * (s - c)} $$
Nerotovaný obdélník
Mějme nerotovaný obdélník \( ABCD \) (tj. rotace není obsažena v bodech obdélníku), bod \( V \) a rotaci obdélníku \( r \). Rotovat totiž budeme bod \( V \) a to podle bodu \( S \), což je střed obdélníku \( ABCD \). Kolize nastává v případě, že výsledný bod \( V' \) (obraz bodu \( V \)) leží v obdélníku \( ABCD \) (což zkontrolujeme tou jednoduchou podmínkou nahoře).
Rotace bodu \( V \) podle \( S \) (střed obdélníku) o \( r \) (v radiánech):
$$ \mathbf{V}'{x} = \cos{r} * (Vx - Sx) - \sin{r} * (Vy - Sy) + Sx \ \mathbf{V}'{y} = \sin{r} * (Vx - Sx) + \cos{r} * (Vy - Sy) + Sy $$
Příště se budu věnovat kolizi dvou rotovaných obdélníků.