mpri-graphics-project/spheroid.cpp

59 lines
1.3 KiB
C++
Raw Normal View History

/**
* Implementation of a spheroid
**/
#include "spheroid.hpp"
Spheroid::Spheroid(Point& _center, double _min_p, size_t _p, size_t _q) :
ImplicitSurface(_center), min_p(_min_p), init_p(_p), p(_p), q(_q) {
_compute_volume();
}
void Spheroid::_compute_volume() {
V = (4/3) * PI * p * q * q;
}
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);
}
void Spheroid::update_center_pos(Point& _center) {
center = _center;
}
2018-02-11 17:29:56 +01:00
void Spheroid::check_horizontal_plan_collision(double& height) {
if ((center.z - p) <= height) {
p = fmin(init_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();
}
}
}
Cuboid Spheroid::max_bounding_box() const {
double max_radius = sqrt((3/4) * V / PI / min_p);
double max_height = init_p;
Point _bd1(max_radius, max_radius, max_height);
Point _bd2(-max_radius, -max_radius, -max_height);
return Cuboid(_bd1, _bd2);
}