atan2(y, x)
ma tę nieciągłość przy 180 °, gdzie przechodzi do -180 °. 0 ° zgodnie z ruchem wskazówek zegara.
Jak odwzorować zakres wartości na 0 ° .,360 °?
oto mój kod:
CGSize deltaPoint = CGSizeMake(endPoint.x - startPoint.x, endPoint.y - startPoint.y);
float swipeBearing = atan2f(deltaPoint.height, deltaPoint.width);
Jestem obliczania kierunek zdarzenia dotyku swiping zważywszy na startPoint
i endPoint
, kodowanym punktowe zarówno XY. Kod jest przeznaczony dla iPhone'a, ale każdy obsługiwany język atan2f()
będzie odpowiedni.
Odpowiedzi:
źródło
(x >= 0 ? x : (2*PI + x)) * 180/PI
jak w(x < 0 ? 2*PI + x : x) * 180/PI
Rozwiązanie wykorzystujące Modulo
Proste rozwiązanie, które obejmuje wszystkie przypadki.
Wyjaśnienie
Pozytywny: od 1 do 180
Jeśli zmodyfikujesz dowolną liczbę dodatnią z zakresu od 1 do 180 na 360, otrzymasz dokładnie tę samą liczbę, którą wstawiłeś. Mod tutaj tylko zapewnia, że te liczby dodatnie są zwracane jako ta sama wartość.
Ujemna: od -180 do -1
Użycie mod tutaj zwróci wartości z zakresu od 180 do 359 stopni.
Przypadki specjalne: 0 i 360
Użycie mod oznacza, że zwracane jest 0, dzięki czemu jest to bezpieczne rozwiązanie w zakresie 0-359 stopni.
źródło
-1 % 360 = -1
Po prostu dodaj 360 °, jeśli odpowiedź z atan2 jest mniejsza niż 0 °.
źródło
A jeśli nie lubisz rozgałęziania, po prostu zaneguj dwa parametry i dodaj 180 ° do odpowiedzi.
(Dodanie 180 ° do wartości zwracanej ładnie umieszcza ją w zakresie 0-360, ale odwraca kąt. Negowanie obu parametrów wejściowych odwraca ją.)
źródło
@erikkallen jest blisko, ale nie do końca.
To powinno działać w C ++: (w zależności od tego, jak zaimplementowano fmod, może być szybsze lub wolniejsze niż wyrażenie warunkowe)
Alternatywnie możesz to zrobić:
ponieważ (x, y) i (-x, -y) różnią się kątami o 180 stopni.
źródło
Mam 2 rozwiązania, które wydają się działać dla wszystkich kombinacji dodatnich i ujemnych x i y.
1) Nadużycie atan2 ()
Zgodnie z dokumentacją atan2 przyjmuje parametry y i x w tej kolejności. Jeśli jednak je odwrócisz, możesz wykonać następujące czynności:
2) Użyj atan2 () poprawnie, a następnie przekonwertuj
źródło
@Jason S: Twój wariant „fmod” nie będzie działał z implementacją zgodną ze standardami. Standard C jest jasny i przejrzysty (7.12.10.1, „funkcje fmod”):
a zatem,
jest właściwie tylko szczegółowym przepisaniem:
Twoja trzecia sugestia jest jednak trafna.
źródło
To jest to, co zwykle robię:
źródło
Zrobiłem wzór na ustawienie kąta w zakresie od 0 do 360
źródło
Alternatywnym rozwiązaniem jest użycie funkcji mod () zdefiniowanej jako:
function mod(a, b) {return a - Math.floor (a / b) * b;}
Następnie za pomocą następującej funkcji uzyskuje się kąt między punktami ini (x, y) i końcowymi (x, y) . Kąt jest wyrażony w stopniach znormalizowanych do [0, 360] stopni. i północ w odniesieniu do 360 stopni.
źródło
Geosfera pakietów R obliczy BearingRhumb, który jest stałą linią namiaru z podanym punktem początkowym i współrzędną wschodnią / północną. Kierunek wschodni i północ muszą znajdować się w macierzy lub wektorze. Punkt początkowy róży wiatrów to 0,0. Poniższy kod wydaje się łatwo rozwiązać problem:
źródło
-1
st staje się (-1 + 360) = 359 st -179 st staje się (-179 + 360) = 181 st
źródło
Math.PI
? Czy to jest to samo coM_PI
?Spowoduje to zwrócenie stopnia od 0 ° -360 ° w kierunku przeciwnym do ruchu wskazówek zegara, 0 ° oznacza godzinę 3.
źródło
Formuła mająca zakres wartości od 0 do 360 stopni.
f (x, y) = 180-90 * (1 + znak (x)) * (1-znak (y ^ 2)) - 45 * (2 + znak (x)) * znak (y)
źródło
Oto trochę javascript. Wystarczy wprowadzić wartości x i y.
źródło