28 template <
typename TmplParticle>
51 template<
typename TmplTraits>
54 int maxInsertionFailures,
58 m_fitPlaneVector(fitPlaneVector),
59 m_maxInsertionFailures(maxInsertionFailures),
62 m_next(
Fitter::getInvalidParticle()),
69 std::string(
"isValid method returns true for INVALID particle:")
77 template<
typename TmplTraits>
81 return m_fitPlaneVector;
84 template<
typename TmplTraits>
87 return m_maxInsertionFailures;
90 template<
typename TmplTraits>
97 template<
typename TmplTraits>
104 template<
typename TmplTraits>
110 if (getPacker().is2d())
113 if (getFitPlaneVector().size() > 0) {
120 if (getFitPlaneVector().size() > 0) {
125 m_fitterPtrVector = fitters;
128 template<
typename TmplTraits>
132 return m_fitterPtrVector;
135 template<
typename TmplTraits>
139 return m_fitterPtrVector;
142 template<
typename TmplTraits>
149 if (fitPlanes.size() > 0) {
154 return Plane3D(
Vec3(-1.0, 0, 0),
Vec3(DBL_MAX/2, DBL_MAX/2, DBL_MAX/2));
157 template<
typename TmplTraits>
160 return getPacker().getRandomPoint();
163 template<
typename TmplTraits>
169 return getPacker().getCandidateParticle(point);
172 template<
typename TmplTraits>
179 return getPacker().getClosestNeighbours(particle, numClosest);
182 template<
typename TmplTraits>
186 m_next = Fitter::getInvalidParticle();
187 if (m_lastFailCount < getMaxInsertionFailures())
192 Particle particle = Fitter::getInvalidParticle();
196 while ((!fitParticle.isValid()) && (numFails < getMaxInsertionFailures()))
198 particle = getCandidateParticle(getRandomPoint());
199 neighbours = getClosestNeighbours(particle, 4);
200 plane = getClosestFitPlane(particle);
203 typename FitterPtrVector::iterator it = getFitterPtrVector().begin();
205 (it != getFitterPtrVector().end())
207 (!fitParticle.isValid())
212 fitParticle = (*it)->getFitParticle(particle, neighbours, plane);
216 m_lastFailCount = numFails;
218 <<
"FittedParticleIterator<T>::generateNext: numFails="
220 m_successCount += ((fitParticle.isValid()) ? 1 : 0);
221 m_next = fitParticle;
226 template<
typename TmplTraits>
229 return (m_next.isValid() || generateNext().isValid());
232 template<
typename TmplTraits>
236 if (!(m_next.isValid()))
241 m_next = Fitter::getInvalidParticle();
245 template<
typename TmplTraits>
249 <<
"BoundingBox: minPt = " << getPacker().getBBox().getMinPt()
250 <<
", maxPt = " << getPacker().getBBox().getMaxPt() <<
"\n"
251 <<
"BoundingBox: sizes = " << getPacker().getBBox().getSizes() <<
"\n";
254 typename FitterPtrVector::iterator it = getFitterPtrVector().begin();
255 (it != getFitterPtrVector().end());
260 console.
Info() <<
"Total successful fits = " << m_successCount <<
"\n";
289 template <
typename TPartGen,
template <
typename TTPartGen>
class TCubicPackWrap>
297 double cubicPackRadius,
298 int maxInsertionFailures,
302 particleGeneratorPtr,
310 m_fitPlaneVector(fitPlaneVector),
311 m_maxInsertionFailures(maxInsertionFailures)
315 template <
typename TPartGen,
template <
typename TTPartGen>
class TCubicPackWrap>
323 double cubicPackRadius,
324 int maxInsertionFailures
327 particleGeneratorPtr,
336 m_maxInsertionFailures(maxInsertionFailures)
341 template <
typename TPartGen,
template <
typename TTPartGen>
class TCubicPackWrap>
346 if ((!this->getPeriodicDimensions()[1])) {
347 fitPlaneVector.push_back(
350 fitPlaneVector.push_back(
354 if ((!this->getPeriodicDimensions()[0])) {
355 fitPlaneVector.push_back(
358 fitPlaneVector.push_back(
365 (!this->getPeriodicDimensions()[2])
367 fitPlaneVector.push_back(
370 fitPlaneVector.push_back(
374 return fitPlaneVector;
377 template <
typename TPartGen,
template <
typename TTPartGen>
class TCubicPackWrap>
382 template <
typename TPartGen,
template <
typename TTPartGen>
class TCubicPackWrap>
392 template <
typename TPartGen,
template <
typename TTPartGen>
class TCubicPackWrap>
396 return m_fitPlaneVector;
400 template <
typename TPartGen,
template <
typename TTPartGen>
class TCubicPackWrap>
405 getRandom(this->
getBBox().getMinPt().X(), this->
getBBox().getMaxPt().X()),
406 getRandom(this->
getBBox().getMinPt().Y(), this->
getBBox().getMaxPt().Y()),
407 getRandom(this->
getBBox().getMinPt().Z(), this->
getBBox().getMaxPt().Z())
411 template <
typename TPartGen,
template <
typename TTPartGen>
class TCubicPackWrap>
419 this->getNTable().getUniqueNeighbourVector(
424 if (static_cast<int>(neighbourVector.size()) < numClosest)
427 this->getNTable().getUniqueNeighbourVector(
429 particle.getRad() + this->getTolerance()
431 if (static_cast<int>(neighbourVector.size()) < numClosest)
434 this->getNTable().getUniqueNeighbourVector(
436 this->getParticleGenerator().getMaxFitRadius() + this->getTolerance()
442 neighbourVector.begin(),
443 neighbourVector.end(),
447 if (static_cast<int>(neighbourVector.size()) > numClosest) {
448 neighbourVector.erase(
449 neighbourVector.begin() + numClosest,
450 neighbourVector.end()
454 return neighbourVector;
457 template <
typename TPartGen,
template <
typename TTPartGen>
class TCubicPackWrap>
464 this->getParticleGenerator().isValidFitRadius(particle.getRad())
466 Inherited::particleFitsInBBoxWithNeighbours(particle)
470 template <
typename TPartGen,
template <
typename TTPartGen>
class TCubicPackWrap>
473 return m_maxInsertionFailures;
476 template <
typename TPartGen,
template <
typename TTPartGen>
class TCubicPackWrap>
482 getMaxInsertionFailures(),
488 this->createAndInsertParticle(p);
493 template <
typename TPartGen,
template <
typename TTPartGen>
class TCubicPackWrap>
496 this->generateCubicPacking();
497 this->generateRandomFill();