Witam, chciałem napisać program który obliczy mi parabole (A dokładnie odległość na jaką poleci) lotu.
W tym celu stworzyłem prosty program, wyświetlający wszystko w oknie.
Jednak, jest pewna niedokładność w obliczeniach programu.
https://pastebin.com/ct3vty36
Nie musicie analizować całego kodu. Podam tutaj "newralgiczne" momenty tegoż kodu.
Zmienna GRAVITY, trzyma w sobie wartość grawitacji, która jest dodawana do ruchu kulki w każdej klatce.
Dodałem do kodu funkcjonalność, która wyświetla najkrótszą drogę między zwykłą kulką, a tą pokazująca gdzie poleci w czasie lotu. Różnica ta, waha się od 2-5 pikseli. (Co jest widoczne, kulka ma 5 pikseli promienia).
Obliczanie pozycji x kulki która ma nam pokazywać gdzie poleci normalna kulka.
sf::Vector2f deltaMouse = normalizeVector(getDeltaPosition({ 5,650 }, (sf::Vector2f)sf::Mouse::getPosition(window)), 7);
float vectorLength = getVectorLength(deltaMouse);
if (isBallFlying == false && releaseBall == false) {
float x =
vectorLength * vectorLength * sin(
2 * std::asin( std::abs(deltaMouse.y)/vectorLength )
)
/ GRAVITY;
predictBall.setPosition(sf::Vector2f(x, 650));
//std::cout << x << std::endl;
}
No i te trzy używane przeze mnie funkcje:
float getVectorLength(const sf::Vector2f &vector) {
return sqrt(vector.x*vector.x + vector.y*vector.y);
}
sf::Vector2f normalizeVector(const sf::Vector2f &vector, const float &scale = 1.f) {
return (vector / getVectorLength(vector) ) * scale;
}
sf::Vector2f getDeltaPosition(const sf::Vector2f &startPosition, const sf::Vector2f &endPosition) {
return sf::Vector2f( endPosition - startPosition );
}
Wzór na obliczanie X znajduje się na tej stronie:
https://pl.wikipedia.org/wiki/Krzywa_balistyczna
Pozdrawiam :)
EDIT: Zapomniałem napisać jakie mam pytanie:
Z czego wynika ta niedoskonałość w obliczeniach. Ze wzoru, czy ja coś źle zrobiłem?