W języku programowania (Python, C # itp.) Muszę ustalić, jak obliczyć kąt między linią a osią poziomą?
Myślę, że obraz najlepiej opisuje to, czego chcę:
Biorąc pod uwagę (P1 x , P1 y ) i (P2 x , P2 y ), jaki jest najlepszy sposób obliczenia tego kąta? Początek znajduje się w lewym górnym rogu i używana jest tylko dodatnia ćwiartka.
c#
python
trigonometry
orlp
źródło
źródło
Odpowiedzi:
Najpierw znajdź różnicę między punktem początkowym i końcowym (tutaj jest to bardziej ukierunkowany odcinek linii, a nie „linia”, ponieważ linie rozciągają się nieskończenie i nie zaczynają w określonym punkcie).
Następnie obliczyć kąt (który biegnie od dodatniej osi X
P1
do dodatniej osi Y wP1
).Ale
arctan
może nie być idealny, ponieważ podzielenie różnic w ten sposób usunie rozróżnienie potrzebne do rozróżnienia, w której kwadrancie znajduje się kąt (patrz poniżej). Zamiast tego zastosuj następujące informacje, jeśli Twój język zawieraatan2
funkcję:EDIT (22 lutego 2017): Na ogół jednak, nazywając
atan2(deltaY,deltaX)
tak aby uzyskać odpowiedni kąt dlacos
isin
może być nieeleganckie. W takich przypadkach często można zamiast tego wykonać następujące czynności:(deltaX, deltaY)
jak wektor.deltaX
ideltaY
przez długość wektora (sqrt(deltaX*deltaX+deltaY*deltaY)
), chyba że długość wynosi 0.deltaX
będzie cosinus kąta między wektorem a osią poziomą (w kierunku od dodatniego X do dodatniej osi Y wP1
).deltaY
będzie teraz sinus tego kąta.EDYCJA (28 lutego 2017 r.): Nawet bez normalizacji
(deltaX, deltaY)
:deltaX
wskazuje, czy cosinus opisany w kroku 3 jest dodatni czy ujemny.deltaY
wskazuje, czy sinus opisany w kroku 4 jest dodatni czy ujemny.deltaX
ideltaY
powiedzą, w której kwadrancie znajduje się kąt, w stosunku do dodatniej osi X wP1
:+deltaX
,+deltaY
: Od 0 do 90 stopni.-deltaX
,+deltaY
: Od 90 do 180 stopni.-deltaX
,-deltaY
: 180 do 270 stopni (-180 do -90 stopni).+deltaX
,-deltaY
: 270 do 360 stopni (od -90 do 0 stopni).Implementacja w Pythonie przy użyciu radianów (dostarczona 19 lipca 2015 r. Przez Erica Leschinskiego, który zredagował moją odpowiedź):
Wszystkie testy przeszły pomyślnie. Zobacz https://en.wikipedia.org/wiki/Unit_circle
źródło
90 - angleInDegrees
?Przepraszam, ale jestem pewien, że odpowiedź Petera jest zła. Zauważ, że oś y idzie w dół strony (często w grafice). W związku z tym obliczenia delta muszą zostać odwrócone, w przeciwnym razie otrzymasz błędną odpowiedź.
Rozważać:
daje
Więc jeśli w powyższym przykładzie P1 to (1,1), a P2 to (2,2) [ponieważ Y zwiększa się w dół strony], powyższy kod da 45,0 stopni dla pokazanego przykładu, co jest błędne. Zmień kolejność obliczania delta i działa poprawnie.
źródło
double arc = Math.atan2(mouse.y - obj.getPy(), mouse.x - obj.getPx()); degrees = Math.toDegrees(arc); if (degrees < 0) degrees += 360; else if (degrees > 360) degrees -= 360;
Znalazłem rozwiązanie w Pythonie, które działa dobrze!
źródło
Biorąc pod uwagę dokładne pytanie, umieszczając nas w „specjalnym” układzie współrzędnych, w którym oś dodatnia oznacza przesuwanie się W DÓŁ (jak ekran lub widok interfejsu), musisz dostosować tę funkcję w ten sposób, a ujemne współrzędne Y:
Przykład w Swift 2.0
Ta funkcja daje prawidłową odpowiedź na pytanie. Odpowiedź jest w radianach, więc użycie, aby zobaczyć kąty w stopniach, jest następujące:
źródło
Na podstawie referencji „Peter O” .. Oto wersja Java
źródło
funkcja matlab:
źródło
Wzór na kąt od 0 do 2pi.
Jest x = x2-x1 i y = y2-y1. Formuła działa
dowolna wartość xiy. Dla x = y = 0 wynik jest niezdefiniowany.
f (x, y) = pi () - pi () / 2 * (1 + znak (x)) * (1-znak (y ^ 2))
źródło
źródło
Testowanie
Do testowania pozwalam hipotezie generować przypadki testowe.
źródło