arczi14 Temat założony przez niniejszego użytkownika |
Przemieszczanie się w danym kierunku » 2014-06-03 16:45:51 Witam. Mam pewne pytanie odnośnie przemieszczania się w danym kierunku. Załóżmy, że: http://iv.pl/images/16736759442162787329.pngJakiś obiekt ma się przemieścić z punktu A do punktu B po linii prostej. Jak program ma określić jak przesuwać obiekt aby poruszał się po linii prostej ? Drugie pytanie. Na jakiej zasadzie gra "Achtung die Kurve" ( http://curvefever.com/play.html) określa kierunek w jakim ten wąż ma się poruszać, skąd wie (program) o ile go przesuwać aby poruszał się po linii prostej ? Pozdrawiam :) |
|
OSA_PL |
» 2014-06-03 17:06:11 Jak masz dwa punkty to możesz obliczyć wektor i go znormalizować. Masz wtedy w wektorze informację o ile przesunąć obiekt w osi x i osi y, aby przemieścić go o 1 po tej linii. Co do drugiego pytania to pewnie w zmiennej zapisany jest kąt pod jakim porusza się obiekt i na jego podstawie przy pomocy funkcji trygonometrycznych program oblicza wektor przesunięcia. |
|
arczi14 Temat założony przez niniejszego użytkownika |
» 2014-06-03 17:44:51 Dzięki! Chyba już rozumiem. Np punkt A to 100x100, a punkt B 150x200. Czyli wektor wynosi 50x100 tylko teraz aby przesunąć coś to muszę wiedzieć w ilu obrotach pętli ma się to wykonać? np w 100 obrotach to można przesuwać o wektor X= 50/100 i wektor Y=100/100 (0,5x1,0) co jeśli nie wie się w ilu obrotach pętli ma się to wykonać ? (dla dużych odległości brzydko by animacja wyglądała.) |
|
OSA_PL |
» 2014-06-03 17:54:32 Możesz zrobić tak:
Masz punkty A(10,10) i B(100,300), liczysz wektor V(90,290). Teraz mnożysz ten wektor przez wartość (0.0 - 1.0) i dodajesz do początkowej pozycji. Czyli na przykład chcesz obliczyć pozycje obiektu w połowie drogi V*0.5 = (45,145) i pozycja obiektu to (10,10)+(45,145) = (55,155) - to pozycja w połowie drogi.
Edit: Ehh mój mózg słabo dziś pracuje. Jak chcesz obliczyć w ilu "obrotach" pętli ma się wykonać przemieszczanie to obliczasz długość wektora ( pierwiastek(x^2 + y^2) ) i dzielisz przez skok. Czyli jak masz wektor (3,4) to jego długość to pierwiastek( 3^2 + 4^2 ) = 5 i chcesz mieć skok o 0.1 to dzielisz długość przez skok 5/0.1 = 50 - ilość obrotów pętli. |
|
SeaMonster131 |
» 2014-06-03 18:24:00 W skrócie: kat = atan2(..); x += cos( kat ); y += sin( kat );
|
|
arczi14 Temat założony przez niniejszego użytkownika |
» 2014-06-03 18:29:59 OSA_PL W tym przykładzie co podałeś to wektor(3,4) z przesunięciem o 0.1 wykonany w 50 "obrotach " nie przesunąłby się o 3,4 tylko 1,5 i 2. Albo ja coś źle zrozumiałem ;p
|
|
OSA_PL |
» 2014-06-03 18:49:09 Nie no, jak już obliczyłeś, że potrzeba 50 kroków to dzielisz ten wektor przez 50 czyli (3/50,4/50) = (0.06,0.08) i o tyle przesuwasz co każdy obrót pętli. |
|
arczi14 Temat założony przez niniejszego użytkownika |
» 2014-06-03 19:28:28 Napisałem dzięki waszej pomocy coś takiego: #include <SFML/Graphics.hpp> #include <iostream> #include <cmath> #include <windows.h>
using namespace std;
int main() { sf::RenderWindow WindowApp( sf::VideoMode( 800, 600 ), "Aram 2D" ); sf::CircleShape circle( 20 ); circle.setPosition( 10, 10 ); circle.setFillColor( sf::Color::Green ); float x = 0; float y = 0; int steps = 0; int conststep; while( WindowApp.isOpen() ) { sf::Event event; sf::Vector2f mouse( sf::Mouse::getPosition( WindowApp ) ); while( WindowApp.pollEvent( event ) ) { if( event.type == sf::Event::Closed ) WindowApp.close(); if( event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape ) WindowApp.close(); if( event.type == sf::Event::MouseButtonPressed && event.key.code == sf::Mouse::Left ) { x = mouse.x - circle.getPosition().x; y = mouse.y - circle.getPosition().y; cout << x << " " << y << endl; steps = sqrt( x * x + y * y ); conststep = steps; } } Sleep( 10 ); if( steps != 0 ) { steps--; circle.move( x / conststep, y / conststep ); } WindowApp.draw( circle ); WindowApp.display(); WindowApp.clear(); } return EXIT_SUCCESS; }
Niby działa ale nie wiem czy to jest dobrze bo mam wrażenie, że raz kulka "biegnie szybciej" raz wolniej. |
|
« 1 » 2 |