Zaokrąglanie podanej liczby do najbliższej ze zbioru

1

Witam, mam do napisania funkcję, która na wejściu dostaje liczbę naturalną z przedziału 0-360 i ma za zadanie zwrócić konkretne wartości:

0, 90, 180, 270 i 360

w zależności od tego do której z tych liczb nasz input ma "najbliżej". Czyli:

 f(1) = 0 f(47) = 90; f(136)=180

Jedyne co mi przychodzi do głowy to rozpisać cały przedział i sporządzić funkcję która będzie miała 5 instrukcji if..

int f(int X)
{
    if(X > 0 && X <= 45) return 0;
    if(X > 45 && X <= 135) return 90;
    if(X > 135 && X <= 225) return 180;
    if(X > 225&& X <= 315) return 270;
    if(X > 315&& X <= 360) return 360;
}

Może jest jakiś sposób który byłby bardziej elegancki i wydajniejszy ?

0

Pewnie jakoś tak:

public static int f(int number) {
    number += 45;
    return 90 * (Math.round(number / 90));
}

Trzeba by to sprawdzić, ale ogólna idea zachowana, no i napisałem w Javie :]

5
angle = (int)((angle + 45 - (FLT_EPSILON * FLT_MIN)) / 90) * 90;

Ewentualnie uproszczona wersja (int)((angle + 44.999999) / 90) * 90;.
Ważne są dwie rzeczy

  • przetworzenie kąta na liczby naturalne 0, 1, 2 będące odpowiednikami tego, która to ćwiartka układu współrzędnych, uzyskasz to zaokrąglając w górę wynik dzielenia kąta przez 90; potem trzeba jeszcze tylko pomnożyć z powrotem przez 90;
  • oraz wcześniejsze "obrócenie" tego kąta o liczbę możliwie bliską 45' od dolnej strony. Czyli o (45 - eps)', gdzie eps to rozdzielczość Twojego typu zmiennoprzecinkowego, zwykle jest to bodajże float.

1 użytkowników online, w tym zalogowanych: 0, gości: 1