2018-02-07 15:08:16 +01:00
|
|
|
#include "Ball.hpp"
|
|
|
|
#include <cmath>
|
|
|
|
|
2018-02-07 15:18:53 +01:00
|
|
|
Ball::Ball(Point& _center, double _p, double _q) :
|
|
|
|
Center(_center),
|
|
|
|
surface(_center, _p, _q),
|
|
|
|
init_h(_center.z),
|
|
|
|
bounce_number(0),
|
|
|
|
crt_time(0),
|
|
|
|
A(_center.z),
|
|
|
|
B(0),
|
|
|
|
U(sqrt(2 * G_CTE * _center.z)),
|
|
|
|
T(0)
|
|
|
|
{
|
|
|
|
}
|
2018-02-07 15:08:16 +01:00
|
|
|
|
|
|
|
void Ball::_compute_pos() {
|
|
|
|
Center.x = A + B * crt_time - (G_CTE / 2) * crt_time * crt_time;
|
|
|
|
surface.update_center_pos(Center);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Ball::_compute_T_n() {
|
|
|
|
double swap = T;
|
|
|
|
T = swap + 2/G_CTE * pow(1/2, bounce_number - 2) * sqrt(2 * init_h / G_CTE);
|
|
|
|
}
|
|
|
|
void Ball::_compute_B_n() {
|
|
|
|
B = G_CTE * T + U;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Ball::_compute_A_n() {
|
|
|
|
A = - G_CTE * T * T / 2 - (U * T);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Ball::_compute_U_n() {
|
|
|
|
U *= 1/2;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Ball::update_pos(double dt) {
|
|
|
|
crt_time += dt;
|
|
|
|
if (crt_time >= T) {
|
|
|
|
_compute_T_n();
|
|
|
|
_compute_U_n();
|
|
|
|
_compute_A_n();
|
|
|
|
_compute_B_n();
|
|
|
|
}
|
|
|
|
_compute_pos();
|
|
|
|
}
|