2018-02-07 15:08:16 +01:00
|
|
|
#include "Ball.hpp"
|
2018-02-12 01:11:23 +01:00
|
|
|
#include <iostream>
|
2018-02-07 15:08:16 +01:00
|
|
|
#include <cmath>
|
|
|
|
|
2018-02-12 18:32:58 +01:00
|
|
|
Ball::Ball(Point& _center, double _min_height, double _v_x, double _v_z, double _p, double _q) :
|
2018-02-07 15:18:53 +01:00
|
|
|
Center(_center),
|
2018-02-12 14:31:08 +01:00
|
|
|
surface(_center, min_height, _p, _q),
|
2018-02-12 18:18:28 +01:00
|
|
|
init_h(_center.y),
|
2018-02-12 11:38:46 +01:00
|
|
|
min_height(_min_height),
|
2018-02-12 10:21:49 +01:00
|
|
|
bounce_number(0.0),
|
2018-02-07 15:18:53 +01:00
|
|
|
crt_time(0),
|
2018-02-12 18:18:28 +01:00
|
|
|
A(_center.y),
|
2018-02-07 15:18:53 +01:00
|
|
|
B(0),
|
2018-02-12 18:18:28 +01:00
|
|
|
U(sqrt(2 * G_CTE * _center.y)),
|
|
|
|
T(sqrt(2.0 * _center.y / G_CTE)),
|
2018-02-12 13:54:39 +01:00
|
|
|
v_x(_v_x),
|
2018-02-12 18:32:58 +01:00
|
|
|
v_z(_v_z)
|
2018-02-07 15:18:53 +01:00
|
|
|
{
|
|
|
|
}
|
2018-02-07 15:08:16 +01:00
|
|
|
|
2018-02-11 22:42:15 +01:00
|
|
|
void Ball::_compute_pos(double dt) {
|
2018-02-12 18:18:28 +01:00
|
|
|
Center.y = fmax(0.0, A + B * crt_time - (G_CTE / 2) * crt_time * crt_time + min_height);
|
2018-02-11 22:42:15 +01:00
|
|
|
Center.x += dt * v_x;
|
2018-02-12 18:32:58 +01:00
|
|
|
Center.z += dt * v_z;
|
2018-02-07 15:08:16 +01:00
|
|
|
surface.update_center_pos(Center);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Ball::_compute_T_n() {
|
2018-02-12 10:21:49 +01:00
|
|
|
double update = (pow(0.5, bounce_number-1) * sqrt(2 * init_h / G_CTE));
|
|
|
|
T += update;
|
2018-02-07 15:08:16 +01:00
|
|
|
}
|
|
|
|
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() {
|
2018-02-12 10:21:49 +01:00
|
|
|
U *= 0.5;
|
2018-02-07 15:08:16 +01:00
|
|
|
}
|
|
|
|
|
2018-02-12 17:41:12 +01:00
|
|
|
void Ball::_compute_v_x(Point normal) {
|
2018-02-12 18:32:58 +01:00
|
|
|
double factor = normal.x / (4*(normal.x + normal.z));
|
2018-02-12 17:41:12 +01:00
|
|
|
v_x *= (0.5 + factor);
|
2018-02-11 22:42:15 +01:00
|
|
|
}
|
|
|
|
|
2018-02-12 18:32:58 +01:00
|
|
|
void Ball::_compute_v_z(Point normal) {
|
|
|
|
double factor = normal.x / (4*(normal.x + normal.z));
|
|
|
|
v_z *= (0.5 + factor);
|
2018-02-11 22:42:15 +01:00
|
|
|
}
|
|
|
|
|
2018-02-07 15:08:16 +01:00
|
|
|
void Ball::update_pos(double dt) {
|
|
|
|
crt_time += dt;
|
|
|
|
if (crt_time >= T) {
|
2018-02-12 17:41:12 +01:00
|
|
|
Point normal = surface.getNormalVector();
|
2018-02-12 10:21:49 +01:00
|
|
|
bounce_number += 1;
|
2018-02-07 15:08:16 +01:00
|
|
|
_compute_U_n();
|
|
|
|
_compute_A_n();
|
|
|
|
_compute_B_n();
|
2018-02-12 10:21:49 +01:00
|
|
|
_compute_T_n();
|
2018-02-12 17:41:12 +01:00
|
|
|
_compute_v_x(normal);
|
2018-02-12 18:32:58 +01:00
|
|
|
_compute_v_z(normal);
|
2018-02-12 10:21:49 +01:00
|
|
|
std::cout << "New bounce :";
|
|
|
|
std::cout << "U:" << U << ":";
|
|
|
|
std::cout << "A:" << A << ":";
|
|
|
|
std::cout << "B:" << B << ":";
|
|
|
|
std::cout << "T:" << T << "\n";
|
2018-02-07 15:08:16 +01:00
|
|
|
}
|
2018-02-11 22:42:15 +01:00
|
|
|
_compute_pos(dt);
|
2018-02-07 15:08:16 +01:00
|
|
|
}
|
2018-02-12 01:11:23 +01:00
|
|
|
|
|
|
|
std::ostream& operator<< (std::ostream &out, Ball const& data) {
|
|
|
|
Point center = data.getCenter();
|
2018-02-12 10:21:49 +01:00
|
|
|
out << "t:" << data.access_crt_time() << ":";
|
|
|
|
out << "T:" << data.accessT() << ":";
|
2018-02-12 01:11:23 +01:00
|
|
|
out << center.x << ':';
|
2018-02-12 10:21:49 +01:00
|
|
|
out << center.z << ':';
|
2018-02-12 18:18:28 +01:00
|
|
|
out << center.y << ':';
|
2018-02-12 01:11:23 +01:00
|
|
|
return out;
|
|
|
|
}
|