2010. dec. 10.

Közelebbi szög

Nemrégiben több alkalommal is találkoztam azzal a problémával, hogy két szög közül melyik áll közelebb egy harmadikhoz. Nyilván az, amelyiket kivonva a harmadikból és annak véve az abszolút értékét kisebb számot kapunk. Ez jó is lenne, ha a szögek nem fordulnának körbe 2π-nél.
De körbefordulnak.
Tehát például a 3°-hoz közelebb van a 355°, mint a 20°. Érthető?

Nem akartam azzal szórakozni, hogy mindegyiket adott intervallumba forgassam, meg megnézzem, hogy van-e közöttük "körbefordulási hely".

Ezután egy unalmas irodalomórán jutott eszembe az egyszerű, nagyszerű, bár inefficiens (Van ilyen szó! Már van.) megoldás: (Nyilván nem nekem először.)

double get_closer_angle(double to, double a, double b)
{
  return ((cos(a-to) > cos(b-to))?a:b);
}

Nyilván lehetne bele sokféle ellenőrzést, hogy melyik mivel egyenlő, és akkor rögtön visszatérni vele, mert két koszinusz nem megy olyan hamar, de ahova kellett, elég volt így.
C++-ban a szögfüggvények miatt radiánban dolgozik, de ez a módszer lényegén nem változtat.