2018-02-07 15:07:59 +01:00
|
|
|
/**
|
|
|
|
* Implementation of a spheroid
|
|
|
|
**/
|
|
|
|
|
|
|
|
#include "spheroid.hpp"
|
|
|
|
|
|
|
|
Spheroid::Spheroid(Point& _center, size_t _p, size_t _q) :
|
2018-02-12 11:37:38 +01:00
|
|
|
ImplicitSurface(_center), p(_p), q(_q), stiffness(0) {
|
2018-02-07 15:07:59 +01:00
|
|
|
_compute_volume();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Spheroid::_compute_volume() {
|
|
|
|
V = (4/3) * PI * p * q * q;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Spheroid::set_stiffness(size_t _stiffness) {
|
|
|
|
stiffness = _stiffness;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Spheroid::update_radius() {
|
|
|
|
q = sqrt((3/4) * V / PI / p);
|
|
|
|
}
|
|
|
|
|
2018-02-11 17:29:56 +01:00
|
|
|
void Spheroid::update_height() {
|
|
|
|
q = (3/4) * V / PI / (p*p);
|
|
|
|
}
|
|
|
|
|
2018-02-07 15:07:59 +01:00
|
|
|
|
|
|
|
void Spheroid::update_center_pos(Point& _center) {
|
|
|
|
center = _center;
|
|
|
|
}
|
2018-02-09 20:23:06 +01:00
|
|
|
|
2018-02-11 17:29:56 +01:00
|
|
|
void Spheroid::check_horizontal_plan_collision(double& height) {
|
2018-02-09 20:23:06 +01:00
|
|
|
if ((center.z - p) <= height) {
|
|
|
|
p = center.z-height;
|
|
|
|
update_radius();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-02-11 17:29:56 +01:00
|
|
|
void Spheroid::check_vertical_plan_collision(double& abscissa) {
|
|
|
|
if (center.x <= abscissa) {
|
|
|
|
if ((center.x + q) >= abscissa) {
|
|
|
|
q = abscissa - center.x;
|
|
|
|
update_height();
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if ((center.x - q) <= abscissa) {
|
|
|
|
q = center.x - abscissa;
|
|
|
|
update_height();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|