Go to the documentation of this file.
13 #ifndef ESYS_LSMPARTICLEFITTER_H
14 #define ESYS_LSMPARTICLEFITTER_H
64 void write(std::ostream &oStream)
const
75 std::stringstream sStream;
104 fitter.
write(oStream);
118 return "Mv to Surface";
128 const double centreDist = centreDiff.
norm();
129 if (centreDist > 0.0) {
130 const Vec3 newCentrePos =
133 (centreDiff/(centreDist))*(stationary.
getRad() + movable.
getRad());
134 moved.
moveTo(newCentrePos);
147 if (neighbours.size() > 0) {
149 (particle.
getPos() - neighbours[0]->getPos()).norm()
151 (particle.
getRad() + neighbours[0]->getRad())
159 }
else if (newParticle.
isValid()) {
189 if (particleVector.size() > 3) {
190 const bool foundFit =
192 particleVector[0]->getPos(),
193 particleVector[1]->getPos(),
194 particleVector[2]->getPos(),
195 particleVector[3]->getPos(),
196 particleVector[0]->getRad(),
197 particleVector[1]->getRad(),
198 particleVector[2]->getRad(),
199 particleVector[3]->getRad(),
207 throw std::runtime_error(
"findAFit: particleVector argument has fewer than 4 elements.");
209 return fittedParticle;
220 if(neighbours.size() > 3){
222 const double ndist=(particle.
getPos()-Pi.
getPos()).norm();
224 newParticle = particle;
230 const double dist_p = plane.
sep(newParticle.
getPos());
231 const double dist_3 = (newParticle.
getPos()-neighbours[3]->getPos()).norm()-neighbours[3]->getRad();
232 if (dist_p > dist_3) {
233 newParticle =
findAFit(newParticle, neighbours);
243 }
else if (newParticle.
isValid()) {
273 if (particleVector.size() > 2) {
274 const bool foundFit =
276 particleVector[0]->getPos(),
277 particleVector[1]->getPos(),
278 particleVector[2]->getPos(),
279 particleVector[0]->getRad(),
280 particleVector[1]->getRad(),
281 particleVector[2]->getRad(),
289 throw std::runtime_error(
"findAFit: particleVector argument has fewer than 3 elements.");
291 return fittedParticle;
302 if(neighbours.size() > 2){
304 const double ndist=(particle.
getPos()-Pi.
getPos()).norm();
306 newParticle = particle;
312 const double dist_p = plane.
sep(newParticle.
getPos());
313 const double dist_2 = (newParticle.
getPos()-neighbours[2]->getPos()).norm()-neighbours[2]->getRad();
314 if (dist_p > dist_2) {
315 newParticle =
findAFit(newParticle, neighbours);
325 }
else if (newParticle.
isValid()) {
354 const int id = particle.
getID();
356 if (particleVector.size() > 1) {
357 const bool foundFit =
359 particleVector[0]->getPos(),
360 particleVector[1]->getPos(),
363 particleVector[0]->getRad(),
364 particleVector[1]->getRad(),
372 throw std::runtime_error(
"findAFit: particleVector vector contains less than 2 particles.");
375 return fittedParticle;
386 if (neighbours.size() >= 2) {
388 const double ndist=(particle.
getPos()-Pi.
getPos()).norm();
393 (neighbours.size() == 2)
398 (particle.
getPos()-neighbours[2]->getPos()).norm()-neighbours[2]->getRad()
402 newParticle = particle;
403 if (ndist < Pi.
getRad()) {
408 newParticle =
findAFit(newParticle, neighbours, plane);
414 }
else if (newParticle.
isValid()) {
443 const int id = particle.
getID();
445 if (particleVector.size() > 2) {
446 const bool foundFit =
448 particleVector[0]->getPos(),
449 particleVector[1]->getPos(),
450 particleVector[2]->getPos(),
453 particleVector[0]->getRad(),
454 particleVector[1]->getRad(),
455 particleVector[2]->getRad(),
463 throw std::runtime_error(
"findAFit: particleVector vector contains less than 3 particles.");
466 return fittedParticle;
477 if (neighbours.size() >= 3) {
479 const double ndist=(particle.
getPos()-Pi.
getPos()).norm();
484 (neighbours.size() == 3)
489 (particle.
getPos()-neighbours[3]->getPos()).norm()-neighbours[3]->getRad()
493 newParticle = particle;
494 if (ndist < Pi.
getRad()) {
499 newParticle =
findAFit(newParticle, neighbours, plane);
505 }
else if (newParticle.
isValid()) {
double getRad() const
Definition: SimpleParticle.hpp:70
virtual bool particleFits(const SimpleParticle &particle) const
Definition: ParticleFitter.h:80
SimpleParticle moveToSurface(const SimpleParticle &stationary, const SimpleParticle &movable)
Definition: ParticleFitter.h:121
Id getID() const
Definition: SimpleParticleData.hpp:109
virtual SimpleParticle getFitParticle(const SimpleParticle &particle, const ParticleVector &neighbours, const Plane3D &plane)
Definition: ParticleFitter.h:139
SimpleParticle findAFit(const SimpleParticle &particle, const ParticleVector &particleVector, const Plane3D &plane)
Definition: ParticleFitter.h:434
virtual SimpleParticle getFitParticle(const SimpleParticle &particle, const ParticleVector &neighbours, const Plane3D &plane)
Definition: ParticleFitter.h:378
SimpleParticle findAFit(const SimpleParticle &Po, const ParticleVector &particleVector)
Definition: ParticleFitter.h:263
Definition: ParticleFitter.h:167
static bool FillIn(const Vec3 &, const Vec3 &, const Vec3 &, double, double, double, Vec3 &, double &)
Definition: Sphere2d.cpp:29
virtual SimpleParticle getFitParticle(const SimpleParticle &particle, const ParticleVector &neighbours, const Plane3D &plane)
Definition: ParticleFitter.h:294
RandomBlockGenerator::ParticleVector ParticleVector
Definition: ParticleFitter.h:27
SimpleParticle findAFit(const SimpleParticle &Po, const ParticleVector &particleVector)
Definition: ParticleFitter.h:179
const Vec3 & getPos() const
Definition: SimpleParticle.hpp:30
bool isValid() const
Definition: SimpleParticle.hpp:80
int m_failedFitCount
Definition: ParticleFitter.h:99
virtual std::string getName() const
Definition: ParticleFitter.h:340
Definition: ParticleFitter.h:25
void incrGetFit()
Definition: ParticleFitter.h:47
ParticleFitter(RandomBlockGenerator &blockGenerator)
Definition: ParticleFitter.h:29
void incrFailedFit()
Definition: ParticleFitter.h:52
const Vec3 & GetW() const
Definition: Plane3D.h:50
const Vec3 & GetO() const
Definition: Plane3D.h:52
Class representing a Plane3D.
Definition: Plane3D.h:29
SimpleParticle findAFit(const SimpleParticle &particle, const ParticleVector &particleVector, const Plane3D &plane)
Definition: ParticleFitter.h:345
int m_successfulFitCount
Definition: ParticleFitter.h:97
Definition: SimpleParticle.h:25
void write(std::ostream &oStream) const
Definition: ParticleFitter.h:64
int m_getFitCount
Definition: ParticleFitter.h:98
VEC3_INLINE double norm() const
Definition: vec3.hpp:211
virtual std::string getName() const =0
Definition: CheckPointable.cpp:17
static const SimpleParticle INVALID
Definition: ParticleFitter.h:45
virtual double sep(const Vec3 &) const
Definition: Plane3D.cpp:87
std::ostream & operator<<(std::ostream &oStream, const SimpleConnectionData &connectionData)
Definition: GeometryReader.cpp:134
virtual std::string getName() const
Definition: ParticleFitter.h:174
RandomBlockGenerator * m_pGenerator
Definition: ParticleFitter.h:96
Definition: ParticleFitter.h:422
ThreeDPlaneParticleFitter(RandomBlockGenerator &blockGenerator)
Definition: ParticleFitter.h:424
MoveToSurfaceFitter(RandomBlockGenerator &blockGenerator)
Definition: ParticleFitter.h:111
static bool FillInWP(const Vec3 &, const Vec3 &, const Vec3 &, const Vec3 &, double, double, Vec3 &, double &)
Definition: Sphere2d.cpp:83
virtual SimpleParticle getFitParticle(const SimpleParticle &particle, const ParticleVector &neighbours, const Plane3D &plane)
Definition: ParticleFitter.h:469
static bool FillInWP(const Vec3 &, const Vec3 &, const Vec3 &, const Vec3 &, const Vec3 &, double, double, double, Vec3 &, double &)
Definition: Sphere3d.cpp:132
std::string toString() const
Definition: ParticleFitter.h:73
virtual std::string getName() const
Definition: ParticleFitter.h:258
Definition: ParticleFitter.h:333
virtual SimpleParticle getFitParticle(const SimpleParticle &particle, const ParticleVector &neighbours, const Plane3D &plane)
Definition: ParticleFitter.h:212
ThreeDParticleFitter(RandomBlockGenerator &blockGenerator)
Definition: ParticleFitter.h:169
TwoDParticleFitter(RandomBlockGenerator &blockGenerator)
Definition: ParticleFitter.h:253
virtual SimpleParticle getFitParticle(const SimpleParticle &particle, const ParticleVector &neighbours, const Plane3D &plane)=0
void incrSuccessfulFit()
Definition: ParticleFitter.h:57
void moveTo(const Vec3 &v)
Definition: SimpleParticle.hpp:40
static const Vec3 ZERO
Definition: vec3.h:52
static bool FillIn(const Vec3 &, const Vec3 &, const Vec3 &, const Vec3 &, double, double, double, double, Vec3 &, double &)
Definition: Sphere3d.cpp:31
virtual std::string getName() const
Definition: ParticleFitter.h:116
static const SimpleParticle INVALID
Definition: SimpleParticle.h:27
Definition: ParticleFitter.h:251
Definition: ParticleFitter.h:109
RandomBlockGenerator & getGenerator()
Definition: ParticleFitter.h:86
virtual std::string getName() const
Definition: ParticleFitter.h:429
virtual bool particleFits(const SimpleParticle &particle) const
Definition: RandomBlockGenerator.cpp:135
TwoDPlaneParticleFitter(RandomBlockGenerator &blockGenerator)
Definition: ParticleFitter.h:335
Definition: RandomBlockGenerator.h:37
NTable::ParticleVector ParticleVector
Definition: BlockGenerator.h:75
virtual ~ParticleFitter()
Definition: ParticleFitter.h:37
const RandomBlockGenerator & getGenerator() const
Definition: ParticleFitter.h:91