-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathParticle.cpp
71 lines (66 loc) · 1.91 KB
/
Particle.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/*
* Particle.cpp
*
* Created on: 15/04/2016
* Author: josh
*/
#include "Particle.h"
#include "constants.h"
#include <cmath>
#include <iostream>
Particle::Particle(Eigen::VectorXd _location, Eigen::VectorXd _velocity, double _mass, double _density):
location(_location),
velocity(_velocity),
mass(_mass),
density(_density)
{
radius = 1;
active = true;
}
Particle::~Particle() {
}
bool
Particle::interact(Particle *p, double delta_time) {
Eigen::VectorXd forceVector = p->location - location;
double distance = forceVector.norm();
if (distance > (radius+p->radius)) {
// Do gravity
forceVector.normalize();
double force = G * (mass*p->mass) / std::pow(distance,location.rows()-1) * delta_time;
forceVector *= force;
forceVector /= mass;
velocity += forceVector;
return false;
} else {
// Do collision
double CR = 0.2;
Eigen::VectorXd v1 = ((p->velocity-velocity)*CR*p->mass + velocity*mass + p->velocity*p->mass) / (mass+p->mass);
Eigen::VectorXd v2 = ((velocity-p->velocity)*CR*mass + velocity*mass + p->velocity*p->mass) / (mass+p->mass);
velocity = v1;
p->velocity = v2;
//std::cout << velocity << std::endl;
//std::cout << " - " << velocity.dot(p->velocity) / velocity.norm() << " " << (std::abs(velocity.dot(p->velocity) / velocity.norm() )-1) << std::endl;
if (std::abs(velocity.normalized().dot(p->velocity.normalized()) -1) < 0.10) {
velocity = (velocity*mass + p->velocity*p->mass) / (mass + p->mass);
location = (location*mass + p->location*p->mass) / (mass + p->mass);
mass += p->mass;
p->active = false;
std::cout << "Particles merged\n";
return true;
} else {
return false;
}
}
}
void
Particle::step(float delta_time) {
double volume = mass / density;
int dimensions = location.rows();
if (dimensions == 2) {
radius = sqrt(volume / PI);
}
else if (dimensions == 3) {
radius = cbrt(volume / (PI*PI/3.0f));
}
location += velocity*delta_time;
}