Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [jQuery] Obliczenie położenia punktu względem punktu A, B i długości od punktu A
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
Hazes
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.
trueblue
Ś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?
Hazes
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.

trueblue
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
Hazes
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 ?
trueblue
dx=Bx-Ax
dy=By-Ay
Hazes
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. });
trueblue
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).
Hazes
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
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.