Add a vertical plan collision
This commit is contained in:
parent
98fe6ebc12
commit
22e24258cd
2 changed files with 21 additions and 2 deletions
19
spheroid.cpp
19
spheroid.cpp
|
@ -22,15 +22,32 @@ void Spheroid::update_radius() {
|
||||||
q = sqrt((3/4) * V / PI / p);
|
q = sqrt((3/4) * V / PI / p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Spheroid::update_height() {
|
||||||
|
q = (3/4) * V / PI / (p*p);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Spheroid::update_center_pos(Point& _center) {
|
void Spheroid::update_center_pos(Point& _center) {
|
||||||
center = _center;
|
center = _center;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Spheroid::check_plan_collision(double& height) {
|
void Spheroid::check_horizontal_plan_collision(double& height) {
|
||||||
if ((center.z - p) <= height) {
|
if ((center.z - p) <= height) {
|
||||||
p = center.z-height;
|
p = center.z-height;
|
||||||
update_radius();
|
update_radius();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -15,8 +15,10 @@ class Spheroid : public ImplicitSurface {
|
||||||
Spheroid(Point& _center, size_t _p, size_t _q);
|
Spheroid(Point& _center, size_t _p, size_t _q);
|
||||||
void update_center_pos(Point& _center);
|
void update_center_pos(Point& _center);
|
||||||
void update_radius();
|
void update_radius();
|
||||||
|
void update_height();
|
||||||
void set_stiffness(size_t _stiffness);
|
void set_stiffness(size_t _stiffness);
|
||||||
void check_plan_collision(double& height);
|
void check_horizontal_plan_collision(double& height);
|
||||||
|
void check_vertical_plan_collision(double& abscissa);
|
||||||
double operator() (double _x, double _y, double _z) {
|
double operator() (double _x, double _y, double _z) {
|
||||||
return (pow(_x - center.x, 2) / pow(q, 2)
|
return (pow(_x - center.x, 2) / pow(q, 2)
|
||||||
+ pow(_y - center.y, 2) / pow(q, 2)
|
+ pow(_y - center.y, 2) / pow(q, 2)
|
||||||
|
|
Loading…
Reference in a new issue