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:

a následná aplikace Heronova vzorce:

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):

Příště se budu věnovat kolizi dvou rotovaných obdélníků.