Witam, planuje zrobić program symulujący jakąś prostą formę fizyki, na początek nie przejmuje się jeszcze wektorem grawitacji a tworzę system odbijania się obiektu od krawędzi, wyglądać to może w ten sposób:
eksperymentując zauważyłem taką zasadę odbijania się piłki:
Jeśli kulka uderza o płaszczyznę L pod kątem alfa ( V to jej wektor ruchu ), to odbija się w "sposób lustrzany" jak to widać na obrazku. Zauważyłem że żeby uzyskać wektor V' musimy dokonać rotacji wektora V o kąt 180-alfa. Problem jest tylko ze sprawdzeniem ile wynosi kąt alfa. Jedyne co przecież znamy to wymiary wektorów V oraz L ( płaszczyzny ). Dużo eksperymentowałem ale nic z tego, co więcej rozwiązanie problemu być może jest znacznie prostsze niż ja to próbuję zrobić, wobec czego zadam pytanie:
Jak znając wektor V oraz L obliczyć wektor V'? ( oczywiście mowa tu o wektorach jednostkowych i zależy mi na znajomości składowych x i y wektora V', czyli nowy tor ruchu piłki ).
To jest mój kod gdzie eksperymentowałem ( użyłem sfml ), pewnie nie wiele się tu przyda ale to taki mój dowód że sam usiłowałem to rozwiązać ;(
#include <SFML/Graphics.hpp>
#include "Area.h"
#include <iostream>
#include <cmath>
int main() {
sf::RenderWindow window(sf::VideoMode(500, 500), "SFML works!", sf::Style::Close);
sf::VertexArray vertex(sf::Lines, 4);
vertex[0] = sf::Vertex(sf::Vector2f(0, 0), sf::Color(255, 255, 255));
vertex[1] = sf::Vertex(sf::Vector2f(250.f, 250.f), sf::Color(255, 255, 255));
vertex[2] = sf::Vertex(sf::Vector2f(250.f, 250.f), sf::Color(255, 255, 255));
vertex[3] = sf::Vertex(sf::Vector2f(0, 0), sf::Color(255, 255, 255));
sf::VertexArray surface(sf::Lines, 2);
surface[0] = sf::Vertex(sf::Vector2f(-1000.f, 250.f), sf::Color(34, 177, 76));
surface[1] = sf::Vertex(sf::Vector2f(1000.f, 250.f), sf::Color(34, 177, 76));
sf::Transform surfaceTransform;
sf::Event event;
while (window.isOpen()) {
while (window.pollEvent(event)) {
if (event.type == sf::Event::Closed)
window.close();
}
//obracanie nachylenia ściany
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Q)) {
surfaceTransform.rotate(-0.5f, sf::Vector2f(250.f, 250.f));
}if (sf::Keyboard::isKeyPressed(sf::Keyboard::W)) {
surfaceTransform.rotate(0.5f, sf::Vector2f(250.f, 250.f));
}
vertex[0].position = window.mapPixelToCoords(sf::Mouse::getPosition(window));
float bside = std::hypotf(vertex[0].position.x - vertex[1].position.x,
vertex[0].position.y - vertex[1].position.y);
float aside = std::abs(vertex[1].position.x - vertex[0].position.x);
float angle = std::acos(aside / bside);
float angleToMove = 180.f - angle;
sf::Vector2f av = vertex[1].position;
sf::Vector2f bv = vertex[0].position;
sf::Vector2f nvec;
nvec.x = ((bv.x - av.x) * std::cos(angleToMove)) - ((bv.y - av.y) * std::sin(angleToMove)) + av.x;
nvec.y = ((bv.x - av.x) * std::sin(angleToMove)) + ((bv.y - av.y) * std::cos(angleToMove)) + av.y;
vertex[3].position = nvec;
window.clear(sf::Color(0,0,0));
window.draw(surface, surfaceTransform);
window.draw(vertex);
window.display();
}
}
Z góry dziękuje za pomoc.