Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [jQuery] Obliczenie położenia punktu względem punktu A, B i długości od punktu A
Hazes
post 1.09.2016, 13:06:33
Post #1





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 9.03.2016

Ostrzeżenie: (0%)
-----


Witam,

Mam dość niewygodny problem. Nie jestem aż tak dobry z matematyki żeby z tym sobie poradzić. Chodzi o to, że mam stworzoną mapę do gry. Gracz może się po niej przemieszczać. Gdy zaczyna się przemieszczać do bazy zapisują się wszystkie informacje o podróży wraz z czasem. Jeśli wejdzie na stronę ponownie - podróż jest nadal kontynuowana. Działa to na takiej zasadzie że czas który pozostał do ukończenia podróży zamieniany jest na milisekundy i daje wtedy pozostały czas animacji. Wtedy za pomocą $.animate() przesuwam gracza do pozycji końcowych X i Y. Problem w tym, że nie mogę rozgryźć równania, które względem koordynacji Ax, Ay, Bx, By, oraz długości ścieżki wyliczy gdzie teraz znajduje się gracz.

Mam już takie obliczenia: Całkowity czas podróży, czas który pozostał, czas który gracz już przebył, odcinek który gracz już przebył (w px), nawet procent który przebył. Ale nie mogę nadal wyliczyć tych końcowych koordynatów X i Y. Proszę o pomoc, bo męczę się z tym już długi czas.

Oto kod:

  1. //FUNKCJA ZNAJDUJĄCA POZYCJĘ GRACZA WZGLĘDEM PUNKTU A I B, ORAZ WZGLĘDEM CZASU KTÓRY GRACZ PRZEBYŁ
  2. function findPosition(aX, aY, bX, bY) {
  3.  
  4. var travelTime = localStorage.travel;
  5.  
  6. var startPos = gridToPos(aX, aY); //to po prostu zamienia numer grid'a na pozycję w pikselach
  7. var endPos = gridToPos(bX, bY); //to również
  8.  
  9. var timeFull = tileDistanceTo(aX, aY, bX, bY); //to wylicza czas który zajmie graczowi przejście do grida zaokrąglając do jednej dziesiętnej
  10. var timeFullSeconds = (timeFull[0]*60*60) + timeFull[1]*60; //zamienia czas z funkcji wyżej na sekundy
  11.  
  12. var timeNow = new Date().getTime();
  13. timeNowSeconds = timeNow/1000;
  14.  
  15. var secondsDifference = travelTime - timeNowSeconds; //różnica między czasem teraz a czasem przyszłym - w którym gracz dotrze na miejsce
  16.  
  17. var timeTraveled = timeFullSeconds - secondsDifference; //czas który przebył już gracz
  18.  
  19. var timeStart = timeNow - timeTraveled; //czas w którym gracz rozpoczął podróż (unix)
  20.  
  21. var pathLength = pixelDistanceTo(startPos[0], startPos[1], endPos[0], endPos[1]); //znajduje długość ścieżki od punktu A do punktu B, zwraca długość ścieżki w px
  22.  
  23. var pathTraveled = (timeTraveled * pathLength) / timeFullSeconds; //cała droga którą przebył od początku gracz (w px)
  24.  
  25. var percent = (pathTraveled / pathLength) * 100; //procent przebytej drogi
  26.  
  27. var startX = startPos[0];
  28. var startY = startPos[1];
  29. var endX = endPos[0];
  30. var endY = endPos[1];
  31.  
  32. var A = [startX, startY];
  33. var B = [endX, endY];
  34. var r = pathTraveled;
  35.  
  36. var a = A[1] - B[1];
  37. a = a / A[0] - B[0];
  38. var b = A[1] - (a * A[0]);
  39.  
  40. alert(a+" "+b);
  41.  
  42. var Dx = r*Math.sqrt(Math.pow(a, 2) + Math.pow(1, 2))+2*b; //to powinno wyliczyć moją pozycję X.
  43. Dx = Dx / 2*a; //a to pozycję Y.
  44. var Dy = a*Dx+b;
  45.  
  46.  
  47.  
  48. window.player.css({
  49. left: Dx+"px",
  50. top: Dy+"px"
  51. });
  52. }


Niestety funkcja nie działa, numery wychodzą ujemne albo ekstremalnie duże. Proszę o pomoc.

Pozdrawiam,
Hazes.
Go to the top of the page
+Quote Post
trueblue
post 1.09.2016, 14:58:15
Post #2





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Ścieżka jest linią prostą?
X,Y to mają być koordynaty w danej chwili czy końca ścieżki (piszesz o końcowych)?

Czy dobrze rozumiem, że początek to punkt (Ax,Ay), koniec (Bx,By), a chcesz na podstawie np. procentowej wartości przebycia ścieżki, znaleźć punkt (X,Y) na tej ścieżce, tak?


--------------------
Go to the top of the page
+Quote Post
Hazes
post 1.09.2016, 17:18:03
Post #3





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 9.03.2016

Ostrzeżenie: (0%)
-----


Cytat(trueblue @ 1.09.2016, 15:58:15 ) *
Ścieżka jest linią prostą?
X,Y to mają być koordynaty w danej chwili czy końca ścieżki (piszesz o końcowych)?

Czy dobrze rozumiem, że początek to punkt (Ax,Ay), koniec (Bx,By), a chcesz na podstawie np. procentowej wartości przebycia ścieżki, znaleźć punkt (X,Y) na tej ścieżce, tak?


Tak, ścieżka jest linią prostą. X, Y to mają być koordynaty w danej chwili. Czyli mam punkt a i punkt b, wiem ile pixeli od punktu a powinien być położony punkt w którym aktualnie jestem ale nie wiem jak wyliczyć koordynaty. Tak, początek to (Ax,Ay), koniec to (Bx,By) i tak, na podstawie procentowej wartości przebycia ścieżki chcę wyliczyć jak daleko przeszedł już gracz. W sumie nie trzeba męczyć procentów (chyba że tak będzie łatwiej) bo wyliczyłem już całą odległość którą przeszedłem od punktu A - (pathTraveled).

//EDIT: Grid wygląda tak. Jeśli jest to potrzebne. Liczby zwiększają się od lewego górnego rogu.



Ten post edytował Hazes 1.09.2016, 17:38:04
Go to the top of the page
+Quote Post
trueblue
post 1.09.2016, 18:07:04
Post #4





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


To co mi pierwsze przychodzi do głowy (według standardowego układu współrzędnych):
1. Współczynnik nachylenia prostej=tan(dx/dy)
2. Kąt nachylenia prostej=atan(dx/dy)
3. Odległość od punktu Ax,Ay: X=Ax+d*cos(kąt) Y=Ay+d*sin(kąt)

Czyli:
X=Ax+d*cos(atan(dx/dy))
Y=Ay+d*sin(atan(dx/dy))

d=dystans
dx=delta X
dy=delta Y


--------------------
Go to the top of the page
+Quote Post
Hazes
post 1.09.2016, 18:55:01
Post #5





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 9.03.2016

Ostrzeżenie: (0%)
-----


Cytat(trueblue @ 1.09.2016, 19:07:04 ) *
To co mi pierwsze przychodzi do głowy (według standardowego układu współrzędnych):
1. Współczynnik nachylenia prostej=tan(dx/dy)
2. Kąt nachylenia prostej=atan(dx/dy)
3. Odległość od punktu Ax,Ay: X=Ax+d*cos(kąt) Y=Ay+d*sin(kąt)

Czyli:
X=Ax+d*cos(atan(dx/dy))
Y=Ay+d*sin(atan(dx/dy))

d=dystans
dx=delta X
dy=delta Y


Rozumiem co masz na myśli, ale nie mam pojęcia jak to zapisać. Jeśli wyliczam X lub Y muszę skorzystać z dx i dy. W takim razie czy dx to niewiadoma ?

Ten post edytował Hazes 1.09.2016, 18:55:28
Go to the top of the page
+Quote Post
trueblue
post 1.09.2016, 19:29:38
Post #6





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


dx=Bx-Ax
dy=By-Ay


--------------------
Go to the top of the page
+Quote Post
Hazes
post 1.09.2016, 19:52:05
Post #7





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 9.03.2016

Ostrzeżenie: (0%)
-----


Cytat(trueblue @ 1.09.2016, 20:29:38 ) *
dx=Bx-Ax
dy=By-Ay


Okej, zrobiłem. Z tym że im dłużej moja postać idzie w daną stronę tym bardziej obiekt jest odsunięty. Jeśli idę w prawo, postać pojawia się za wysoko z czasem. Jeśli idę do góry obiekt przesuwa się za bardzo w prawo. Jeśli idę w prawo to przesuwa mnie znów w lewo. Generalnie na początku jest dobrze, cały czas jest na linii.

Wygląda to u mnie tak:

  1. var A = [startX, startY];
  2. var B = [endX, endY];
  3. var r = pathTraveled;
  4.  
  5. var Dx = B[0]-A[0];
  6. var Dy = B[1]-A[1];
  7.  
  8. X = A[0]+r*Math.cos(Math.atan(Dx/Dy));
  9. Y = A[1]+r*Math.sin(Math.atan(Dx/Dy));
  10.  
  11. window.player.css({
  12. left: X+"px",
  13. top: Y+"px"
  14. });


Ten post edytował Hazes 1.09.2016, 19:54:10
Go to the top of the page
+Quote Post
trueblue
post 1.09.2016, 19:58:25
Post #8





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Podałem wzór dla standardowego układu współrzędnych, Ty masz obrócony.
Prawdopodobnie trzeba jeszcze badać kąt nachylenia prostej (w jest której kwarcie).


--------------------
Go to the top of the page
+Quote Post
Hazes
post 1.09.2016, 20:49:46
Post #9





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 9.03.2016

Ostrzeżenie: (0%)
-----


Cytat(trueblue @ 1.09.2016, 20:58:25 ) *
Podałem wzór dla standardowego układu współrzędnych, Ty masz obrócony.
Prawdopodobnie trzeba jeszcze badać kąt nachylenia prostej (w jest której kwarcie).


Dzięki, postaram się to zrobić. wink.gif
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 20.07.2025 - 05:51