2015-03-25 17 views
5

OK najpierw przeprosiny, ponieważ wiem, że tego rodzaju pytanie zostało zadane przed więcej niż raz. Jednak nawet po zapoznaniu się z pozostałymi pytaniami i odpowiedziami nie byłem w stanie zrobić tego dla mojej sytuacji. Poniżej znajduje się przykład: Fig. 1Java: kąt determinacji między dwoma punktami

Wszystko Ja po prostu próbuje się wypracować kąt pomiędzy P1 i P2, przy założeniu, że 0 stopni jest jak przedstawiono powyżej, aby można było wskazać strzałę między 2 we właściwym kierunku. Więc robię coś takiego ...

Point p1 = new Point(200,300); Point p2 = new Point(300,200); 
double difX = p2.x - p1.x; double difY = p2.y - p1.y; 
double rotAng = Math.toDegrees(Math.atan2(difY,difX)); 

Który wychodzi jako: -45, gdzie powinien być 45? Jednak nie jest to po prostu przypadek, w którym nie myślę o tym, aby zwracał wynik ujemny, jak na przykład, jeśli zmieniłem P1 na 300 300 (poniżej P2), wtedy kąt powinien wynosić 0, ale jest zwracany jako -90.

Więc zastanawiam się, czy ktoś może wskazać, co robię źle, aby to obliczyć, czy jest to możliwe, aby to zrobić w ten sposób?

+0

Powinieneś umieścić to w funkcji i obliczyć i porównać z oczekiwaniami kąty dla punktów "O" i "P2", które są bliżej siebie. Podstawowy pomysł użycia "atan2" jest dobry. – LutzL

+0

Hmm 0 nie ma być punktem, właśnie to, czego oczekiwałbym 0 stopni do punktu od P1. Eksperymentowanie z metodą/funkcją dla tego teraz, chociaż z ustawieniem P1 jako 0,0, ale nie jestem pewien co to znaczyło: o –

+0

Nie, miałem na myśli lokalizację wokół znaku 0 lub O. – LutzL

Odpowiedz

3

oblicza w standardowym układzie współrzędnych kartezjańskich z orientacją dodatnią przeciwnie do ruchu wskazówek zegara kąt punktu (X,Y) na promieniu przez (1,0). Co oznacza, że ​​X jest współrzędną wzdłuż promienia zerowego, w twojej sytuacji X=-difY, a Y jest współrzędną w kierunku (małych) dodatnich kątów, co daje, z twoimi preferencjami dla przedstawionego kąta 45 °, Y=difX . Tak więc

3

Jesteś mylący z układem współrzędnych zastosowanym w geometrii w porównaniu do układu używanego na ekranie komputera. W geometrii jesteś regularny, że 0,0 jest punktem w lewym dolnym rogu. Pozostało jednak 0,0 na ekranie - górny róg.

Teraz obróć zdjęcie zgodnie z współrzędnymi ekranu i zobacz, czy kąt jest obliczany poprawnie.

Tak więc, w ogólnym przypadku można wybrać jedno z następujących rozwiązań: 1. przeliczyć corrdinates punktów na współrzędne ekranu iz powrotem. 2. Jeśli problem występuje tylko pod kątem, możesz dodać π/2 (90 stopni) do wyniku.

+0

Och? Nie myślałem o tym i prawdopodobnie to wyjaśniłem. Przez moje eksperymenty próbowałem po prostu dodać 90 do wyniku, ale nie zawsze daje to prawidłową odpowiedź. W tej chwili nie wiesz, jak postąpić zgodnie ze wskazówkami, ponieważ musisz sprawdzić, jak konwertować współrzędne punktu na ekranowe ...^ –

+0

Konwersja jest prosta. X jest taki sam. Y to (wysokość ekranu - y). – AlexR

+0

"ale nie zawsze daje to prawidłową odpowiedź" w takim przypadku? – weston

1

Za pomocą linii double difX = p2.x - p1.x; double difY = p2.y - p1.y; obliczasz swój kąt z p2 na 0, więc -45 to poprawna odpowiedź. Spróbuj odwrócić p1 z p2.

Również, jeśli P1 zostanie zmieniony na 300,300, to masz kąt od 0 (0 do P1 i P1 do P2). Kąt wynosi rzeczywiście 90 lub -90 w zależności od tego, czy widzisz od P2 do 0, czy od 0 do P2.

+0

Wygląda na to, że dziękuję za wskazanie tego, co też zrobiła LutzL poniżej, i to właśnie skończyło się robi i teraz wydaje się działać. Dzięki! –

Powiązane problemy