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 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
|
/////////////////////////////////////////////////////////////
// //
// Copyright (c) 2003-2011 by The University of Queensland //
// Earth Systems Science Computational Centre (ESSCC) //
// http://www.uq.edu.au/esscc //
// //
// Primary Business: Brisbane, Queensland, Australia //
// Licensed under the Open Software License version 3.0 //
// http://www.opensource.org/licenses/osl-3.0.php //
// //
/////////////////////////////////////////////////////////////
SimpleParticle::SimpleParticle(const Vec3& pos,double rad,int id, int tag)
: SimpleParticleData(pos, rad, id, tag)
{
}
SimpleParticle::SimpleParticle(const SimpleParticle& p)
: SimpleParticleData(p)
{
}
SimpleParticle &SimpleParticle::operator=(const SimpleParticle& p)
{
SimpleParticleData::operator=(p);
return *this;
}
const Vec3 &SimpleParticle::getPos() const
{
return getPosition();
}
void SimpleParticle::setPos(const Vec3 &pos)
{
setPosition(pos);
}
void SimpleParticle::moveTo(const Vec3 &v)
{
setPosition(v);
}
void SimpleParticle::translateBy(const Vec3 &v)
{
setPosition(getPosition()+v);
}
void SimpleParticle::moveBy(const Vec3 &v)
{
translateBy(v);
}
void SimpleParticle::rotate(const Vec3 &rotation, const Vec3 &posn)
{
// From http://mathworld.wolfram.com/RotationFormula.html
const double phi = rotation.norm();
if (phi > 0.0)
{
const Vec3 r = getPosition() - posn;
const Vec3 n = rotation/phi;
const double cosPhi = cos(phi);
const Vec3 rotatedR =
r*cosPhi + n*((dot(n, r))*(1-cosPhi)) + cross(r, n)*sin(phi);
setPosition(rotatedR + posn);
}
}
double SimpleParticle::getRad() const
{
return getRadius();
}
void SimpleParticle::setRad(double r)
{
setRadius(r);
}
bool SimpleParticle::isValid() const
{
return (getID() >= 0);
}
template <typename TmplVisitor>
void SimpleParticle::visit(const TmplVisitor &visitor) const
{
visitor.visitSimpleParticle(*this);
}
template <typename TmplVisitor>
void SimpleParticle::visit(TmplVisitor &visitor)
{
visitor.visitSimpleParticle(*this);
}
ostream& operator<<(ostream& ost,const SimpleParticle& p)
{
ost
<< "Particle- id " << p.getId()
<< " pos: " << p.getPosition()
<< " rad: " << p.getRadius()
<< " tag : " << p.getTag() << std::endl;
return ost;
}
ParticleComparer::ParticleComparer(const SimpleParticle &particle) : m_pParticle(&particle)
{
}
/*!
\param p1
\param p2
*/
bool ParticleComparer::operator()(const SimpleParticle &p1, const SimpleParticle &p2) const
{
return (((p1.getPos() - m_pParticle->getPos()).norm() - p1.getRad())<
((p2.getPos() - m_pParticle->getPos()).norm() - p2.getRad()));
}
/*!
\param p1
\param p2
*/
bool ParticleComparer::operator()(const SimpleParticle *p1, const SimpleParticle *p2) const
{
return (*this)(*p1, *p2);
}
|