Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Przemieszczanie się w danym kierunku

Ostatnio zmodyfikowano 2014-06-03 22:26
Autor Wiadomość
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.png

Jakiś 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 :)
P-111356
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.
P-111357
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.)
P-111367
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.
P-111369
SeaMonster131
» 2014-06-03 18:24:00
W skrócie:
C/C++
kat = atan2(..);
x += cos( kat );
y += sin( kat );
P-111372
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

P-111373
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.
P-111374
arczi14
Temat założony przez niniejszego użytkownika
» 2014-06-03 19:28:28
Napisałem dzięki waszej pomocy coś takiego:
C/C++
#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 ); // tworzymy koło
    circle.setPosition( 10, 10 ); // a teraz ustawiamy jego pozycję
    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.
P-111378
« 1 » 2
  Strona 1 z 2 Następna strona