2018-01-31 16:43:53 +01:00
|
|
|
/**
|
2018-02-11 17:29:17 +01:00
|
|
|
* Defines a spheroid, which is a basic interpretaion of the ball when it is
|
2018-01-31 16:43:53 +01:00
|
|
|
* bouncing.
|
|
|
|
**/
|
|
|
|
|
|
|
|
#include <cstddef>
|
2018-02-07 15:07:59 +01:00
|
|
|
#include <cmath>
|
2018-01-31 16:43:53 +01:00
|
|
|
#include "Implicit.hpp"
|
|
|
|
#include "common_structures.hpp"
|
2018-02-12 17:40:50 +01:00
|
|
|
#include "PerlinNoise.hpp"
|
2018-01-31 16:43:53 +01:00
|
|
|
|
|
|
|
const double PI = 3.141592653589793;
|
|
|
|
|
2018-02-07 15:07:59 +01:00
|
|
|
class Spheroid : public ImplicitSurface {
|
2018-01-31 16:43:53 +01:00
|
|
|
public:
|
2018-02-12 18:45:35 +01:00
|
|
|
Spheroid(const Point& _center, double _min_p, double _p, double _q);
|
2018-02-07 15:07:59 +01:00
|
|
|
void update_center_pos(Point& _center);
|
|
|
|
void update_radius();
|
2018-02-11 17:29:56 +01:00
|
|
|
void update_height();
|
2018-02-13 01:02:58 +01:00
|
|
|
void check_horizontal_plan_collision(double height);
|
2018-02-11 17:29:56 +01:00
|
|
|
void check_vertical_plan_collision(double& abscissa);
|
2018-02-12 14:31:08 +01:00
|
|
|
Cuboid max_bounding_box() const;
|
2018-02-12 17:40:50 +01:00
|
|
|
void check_perlin_collision(PerlinNoise perlin);
|
|
|
|
Point getNormalVector() const { return normal_vector;}
|
2018-02-12 14:15:30 +01:00
|
|
|
double operator() (double _x, double _y, double _z) const;
|
2018-01-31 16:43:53 +01:00
|
|
|
private:
|
|
|
|
/**
|
|
|
|
* p corresponds to the half-height of the ball,
|
|
|
|
* q to the radius of the ball,
|
|
|
|
* V is the volume. Extremely useful to have a constant volume in the
|
|
|
|
* ball
|
|
|
|
**/
|
2018-02-12 17:40:50 +01:00
|
|
|
Point normal_vector;
|
2018-02-12 14:31:08 +01:00
|
|
|
double min_p, init_p, p, q;
|
2018-02-07 15:18:53 +01:00
|
|
|
size_t stiffness;
|
2018-01-31 16:43:53 +01:00
|
|
|
double V;
|
|
|
|
void _compute_volume();
|
|
|
|
};
|