X-Git-Url: https://fleuret.org/cgi-bin/gitweb/gitweb.cgi?p=flatland.git;a=blobdiff_plain;f=polygon.cc;h=b8999503e3c14cec184aa0820c33574da269bd60;hp=353486e9e5c6ef1689f1a48a9651df8aef091fdf;hb=c99cbb5f30e1e2052bfc36880a1425db600454b5;hpb=33bfa28983025c2387388e0e5f7d7bdd0ceb0f8a diff --git a/polygon.cc b/polygon.cc index 353486e..b899950 100644 --- a/polygon.cc +++ b/polygon.cc @@ -32,6 +32,7 @@ using namespace std; static const scalar_t dl = 20.0; static const scalar_t repulsion_constant = 0.2; static const scalar_t speed_max = 1e2; +static const scalar_t angular_speed_max = M_PI / 10; Polygon::Polygon(scalar_t mass, scalar_t red, scalar_t green, scalar_t blue, @@ -307,10 +308,19 @@ void Polygon::initialize(int nb_polygons) { bool Polygon::update(scalar_t dt) { scalar_t speed = sqrt(_dcenter_x * _dcenter_x + _dcenter_y * _dcenter_y); - scalar_t speed_target = speed_max - exp(-speed / speed_max) * speed_max; - _dcenter_x = speed_target * _dcenter_x / speed; - _dcenter_y = speed_target * _dcenter_y / speed; + if(speed > 0) { + scalar_t speed_target = speed_max - exp(-speed / speed_max) * speed_max; + _dcenter_x = speed_target * _dcenter_x / speed; + _dcenter_y = speed_target * _dcenter_y / speed; + } + + scalar_t angular_speed = abs(_dtheta); + + if(angular_speed > 0) { + scalar_t angular_speed_target = angular_speed_max - exp(-angular_speed / angular_speed_max) * angular_speed_max; + _dtheta = angular_speed_target * _dtheta / angular_speed; + } if(!_nailed) { _center_x += _dcenter_x * dt;