Autor Wątek: znajdowanie sciezki na plaszczyznie  (Przeczytany 2014 razy)

Offline fetchAll

  • Użytkownik

# Sierpień 26, 2007, 18:46:34
chcialbym obliczyc punkty odcinka ktory laczy 2 punkty

mowiac krocej, pisze sobie gre gdzie ludzik bedzie poruszal sie po kliknieciu myszka na plansze z punkty x1, y1 do x2, y2 - podobna zasada jak np w diablo - nie pytam o A*

chyba ze jest to popularny algorytm, to jak on sie nazywa?

obrazek zalaczam jak ja to widze



czyli jak moj ludzik jest w x1, y1, klikam na y2, y2 i on tam 'idzie'
chcialbym w zalezonosci od wspolczynnika speed (float) wyznaczac kolejne punkty po ktorych animowac sprite

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

therealremi

  • Gość
# Sierpień 26, 2007, 18:53:18
to jest matematyka na poziomie szkoły podstawowej :) po prostu obliczasz średnią ważoną tych dwóch punktów, a waga zmienia się od 0 do 1.
p1*w + p2*(1-w)
« Ostatnia zmiana: Sierpień 26, 2007, 18:55:04 wysłana przez therealremi »

Offline fetchAll

  • Użytkownik

# Sierpień 26, 2007, 19:06:01
to jest matematyka na poziomie szkoły podstawowej :) po prostu obliczasz średnią ważoną tych dwóch punktów, a waga zmienia się od 0 do 1.
p1*w + p2*(1-w)


probuje sobie to rozpisac, ale nie wiem jak traktowac p1 -> p1 to x i y
wspomniana waga to moj 'speed'?

moglbys jasniej?

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Sierpień 26, 2007, 19:17:52
probuje sobie to rozpisac, ale nie wiem jak traktowac p1 -> p1 to x i y
Matematyka na wektorach się kłania. :)

therealremi

  • Gość
# Sierpień 26, 2007, 19:33:00
p1 [x1, y1]
p2 [x2, y2]

punkty między tymi punktami wyznaczasz tak:
[x1*w + x2*(1-w), y1*w + y2*(1-w)]
gdzie w zmienia się od 1 do 0.

Offline Grabarz

  • Użytkownik

# Sierpień 26, 2007, 19:42:32
Tylko po co ci wyznaczać punkty pomiędzy tymi punktami. W grze i tak musisz uzależnić animację od czasu, a wtedy potrzebujesz tylko wektorka, który można obliczyć na podstawie dwóch punktów.

Offline Xion

  • Redaktor
    • xion.log

# Sierpień 26, 2007, 20:24:23
Widzę tutaj dwa dość różne zagadnienia, które zostały pomieszane. A właściwie dwie możliwości tego, co faktycznie chcesz zrobić.

1. Chcesz narysować linię piksel po pikselu. Pomińmy kwestię, dlaczego. Jeśli tak jest, to przydatne będą odpowiedzi przedmówców na temat równania odcinka. Możesz też zainteresować się algorytmem Bresenhama (sp?).

2. Chcesz poruszać jakiś obiekt między dwoma punktami z określoną prędkością. W takim razie powinieneś w każdej klatce wyznaczyć wektor przesunięcia w oparciu o ustaloną prędkość i czas od poprzedniej klatki. Pseudokod:
// dt - czas od poprzedniej klatki; speed-  szybkość w pikselach na sekundę
// pos - pozycja obiektu

Vector v = pt2 - pt1;
v.normalize(); // v /= v.length();
v = v * speed * dt;

pos += v;

Offline fetchAll

  • Użytkownik

# Sierpień 26, 2007, 22:58:18
Cytuj
Vector v = pt2 - pt1;
v.normalize(); // v /= v.length();
v = v * speed * dt;

pos += v;

nie moge wydumac jak to ma dzialac :/
rozumiem ze pt2 i pt1 to wektory, ale sam typ Vector to przeciez dynamiczna lista

czyli:

1. odejmuje vektor1 od vektora2 (nie wiem dlaczego mam to robic!!!!! <- ?)
2. wynikowy normalizuje, to bylo dlugosc na 1
3. robie z nim *= delay (* predkosc dla manipulacji)

zatem czy ja myle vector (http://www.cplusplus.com/reference/stl/vector/)z matematycznym vectorem w tym przykladzie?

therealremi

  • Gość
# Sierpień 26, 2007, 23:10:58
rozumiem ze pt2 i pt1 to wektory, ale sam typ Vector to przeciez dynamiczna lista
zatem czy ja myle vector (http://www.cplusplus.com/reference/stl/vector/)z matematycznym vectorem w tym przykladzie?

tak, mylisz.
odejmujesz od siebie punkty, co daje ci wektor kierunku (punkty najczęściej korzystają z tej samej klasy co wektory).
dodając (v = v * speed * dt) do punktu wyjściowego po prostu zbliżasz się w kierunku punktu końcowego.

dodatkowo trzebaby w twoim przypadku (poruszanie się z punktu do punktu) obliczyć odległość między dwoma punktami i za każdym razem sprawdzać czy się jej nie przekroczyło.
« Ostatnia zmiana: Sierpień 26, 2007, 23:14:33 wysłana przez therealremi »

Offline Xion

  • Redaktor
    • xion.log

# Sierpień 26, 2007, 23:48:04
Cytuj
zatem czy ja myle vector (http://www.cplusplus.com/reference/stl/vector/)z matematycznym vectorem w tym przykladzie?
Właśnie dlatego napisałem Vector z wielkiej litery żeby nie było niejednoznaczności ;p Ehh... Generalnie polecam zapoznanie się z jakimiś podstawami odnośne wektorów i geometrii, po zaprezentowany problem jest naprawdę trywialny.

Offline fetchAll

  • Użytkownik

# Sierpień 27, 2007, 00:25:38
no dobra..
matematyke mialem w skzole jakies 10 lat temu.. nie pamietam

ale dla podobnych mi maruderow male info:
http://www.gamedev.net/reference/articles/article1019.asp

trywialne czy nie do tej pory nie znalazlem podstawowej implementacji zeby chocby zobaczyc jak na wektorach w rysowaniu grafiki operowac...
« Ostatnia zmiana: Sierpień 27, 2007, 01:57:23 wysłana przez fetchAll »

Offline zephyr

  • Użytkownik

# Sierpień 27, 2007, 16:13:00
Jeśli nadal jest niejasne mogę spróbować opisać algorytm Xiona jeszcze przystępniej:

[wektor = strzałka]
1) tworzymy vector p2-p1, czyli otrzymujemy strzałkę od p1 do p2
2) normalizujemy go, otrzymujemy strzałkę o długości 1 w odpowiednim kierunku
3) skalujemy go żeby odpowiadał prędkości *dt*speed zmieni długość strzałki na odpowiednią
4) przesuwamy się o nowy wektor, ma odpowiedni kierunek, zwrot i długość

przed krokiem nr 3 przydałoby sie jeszcze sprawdzić czy odległość od p2 nie jest mniejsza niż speed*dt, jak jest to zamiast 3) i 4) można od razu zmienić pozycją na p2