Brief description of class still missing. More...
#include <Triangulator.h>
Public Member Functions | |
void | addDistance (const QString &node1, const QString &node2, double value) |
Node * | addNode (const QString &name) |
void | aggregate (double stddev) |
Covariance | covariance (const QString &nodeName) const |
Node * | node (const QString &name) const |
QList< Node * > | nodes () const |
void | printClusters () |
void | setCoordinates (Node *origin, Node *north, Node *eastward) |
void | setPriorCoordinates (const QMap< QString, Point > &c, double precision) |
QSet< Point2D > | solutions (const QString &nodeName) const |
Triangulator () | |
~Triangulator () |
Brief description of class still missing.
Full description of class still missing
void TapePositioningSystem::Triangulator::addDistance | ( | const QString & | node1, |
const QString & | node2, | ||
double | value | ||
) |
References TapePositioningSystem::Node::addDistance(), addNode(), node(), and TRACE.
Referenced by CoordReader::parse().
Node * TapePositioningSystem::Triangulator::addNode | ( | const QString & | name | ) |
References TapePositioningSystem::Node::setName(), and TRACE.
Referenced by addDistance().
{ TRACE; Node * n=new Node; n->setName(name); _nodes.insert(name, n); return n; }
void TapePositioningSystem::Triangulator::aggregate | ( | double | stddev | ) |
stddev is the estimated precision for distance measurements.
References TapePositioningSystem::Cluster::equal(), TapePositioningSystem::Cluster::lessThan(), TRACE, and QGpCoreTools::uniqueDeleteAll().
Referenced by CoordReader::terminate().
{ TRACE; // Builds all possible clusters made of robust quads, centered around each node // Reference: Moore et al. 2004, SenSys'04, November 3-5, 2004, Baltimore, Maryland, USA QList<Cluster *> quads; for(QMap<QString, Node *>::const_iterator it=_nodes.begin(); it!=_nodes.end(); it++) { quads.append(it.value()->robustQuads(stddev)); } // Eliminate double entries qSort(quads.begin(), quads.end(), Cluster::lessThan); uniqueDeleteAll(quads, Cluster::equal); //App::stream() << tr("Found %1 robust quads").arg(quads.count()) << endl; //for(QList<Cluster *>::const_iterator it=quads.begin(); it!=quads.end(); it++) { // App::stream() << " " << (*it)->name() << endl; //} // Aggregates as much quads as possible for all clusters _clusters.clear(); int nq=quads.count(); for(int iq=0; iq<nq; iq++) { // Make a copy of quads without this one QList<Cluster *> quadsToAdd; quadsToAdd.reserve(nq-1); int ic; for(ic=0; ic<iq; ic++) { quadsToAdd.append(quads.at(ic)); } for(ic++; ic<nq; ic++) { quadsToAdd.append(quads.at(ic)); } aggregate(new Cluster(*quads.at(iq)), quadsToAdd); } qDeleteAll(quads); }
Covariance TapePositioningSystem::Triangulator::covariance | ( | const QString & | nodeName | ) | const |
References QGpCoreTools::Statistics::add(), QGpCoreTools::Covariance::add(), solutions(), TRACE, QGpCoreTools::Point2D::x(), and QGpCoreTools::Point2D::y().
Referenced by CoordReader::terminate().
{ TRACE; QSet<Point2D> coordinates=solutions(nodeName); double p[2]; Statistics statx, staty; Covariance cov(2); for(QSet<Point2D>::iterator its=coordinates.begin(); its!=coordinates.end(); its++) { const Point2D& coord=*its; p[0]=coord.x(); p[1]=coord.y(); statx.add(p[0]); staty.add(p[1]); cov.add(p); } return cov; }
Node * TapePositioningSystem::Triangulator::node | ( | const QString & | name | ) | const |
References TRACE.
Referenced by addDistance(), solutions(), and CoordReader::terminate().
{ TRACE; QMap<QString, Node *>::const_iterator it=_nodes.find(name); if(it!=_nodes.end()) { return it.value(); } else { return 0; } }
QList<Node *> TapePositioningSystem::Triangulator::nodes | ( | ) | const [inline] |
Referenced by printClusters(), and CoordReader::terminate().
{return _nodes.values();}
References TapePositioningSystem::Cluster::coordinates(), TapePositioningSystem::Cluster::name(), nodes(), TapePositioningSystem::Cluster::nodes(), and TRACE.
{ TRACE; QTextStream s(stdout); for(QList<Cluster *>::iterator itc=_clusters.begin(); itc!=_clusters.end(); itc++) { Cluster * c=*itc; s << "# " << c->name() << "\n"; QList<Node *> nodes=c->nodes(); for(QList<Node *>::iterator it=nodes.begin(); it!=nodes.end(); it++) { s << c->coordinates(*it) << " 0 " << (*it)->name() << "\n"; } } s.flush(); }
void TapePositioningSystem::Triangulator::setCoordinates | ( | Node * | origin, |
Node * | north, | ||
Node * | eastward | ||
) |
Sets a consistance coordinate system for clusters. origin defines the translation of the relative coordinates, north defines the rotation and solved the flip ambiguity.
References TapePositioningSystem::Cluster::setCoordinateSystem(), and TRACE.
Referenced by CoordReader::terminate().
{ TRACE; for(int i=_clusters.count()-1; i>=0; i--) { Cluster * c=_clusters.at(i); if(!c->setCoordinateSystem(origin, north, eastward)) { delete c; _clusters.removeAt(i); } } }
void TapePositioningSystem::Triangulator::setPriorCoordinates | ( | const QMap< QString, Point > & | prior, |
double | precision | ||
) |
Removes all clusters that do not match with prior information.
References QGpCoreTools::Point2D::distanceTo(), TapePositioningSystem::Cluster::end(), TapePositioningSystem::Cluster::find(), TapePositioningSystem::Node::name(), and TRACE.
Referenced by CoordReader::terminate().
{ TRACE; for(QMap<QString, Node *>::const_iterator itn=_nodes.begin(); itn!=_nodes.end(); itn++) { Node * n=itn.value(); QMap<QString, Point>::const_iterator itprior=prior.find(n->name()); if(itprior!=prior.end()) { const Point2D& p=itprior.value(); for(int i=_clusters.count()-1; i>=0; i--) { Cluster * c=_clusters.at(i); QMap<Node *, Point2D>::const_iterator itcn=c->find(n); if(itcn!=c->end()) { if(p.distanceTo(itcn.value())>precision) { delete c; _clusters.removeAt(i); } } } } } }
QSet< Point2D > TapePositioningSystem::Triangulator::solutions | ( | const QString & | nodeName | ) | const |
References TapePositioningSystem::Cluster::end(), TapePositioningSystem::Cluster::find(), node(), QGpCoreTools::Point2D::setX(), QGpCoreTools::Point2D::setY(), TRACE, QGpCoreTools::Point2D::x(), and QGpCoreTools::Point2D::y().
Referenced by covariance(), and CoordReader::terminate().
{ TRACE; Node * n=node(nodeName); // Gathers all coordinates in QSet to remove dupplicate entries QSet<Point2D> coordinates; for(QList<Cluster *>::const_iterator itc=_clusters.begin(); itc!=_clusters.end(); itc++) { Cluster * c=*itc; QMap<Node *, Point2D>::const_iterator itcn=c->find(n); if(itcn!=c->end()) { // Do not consider varitions below 1 mm Point2D p= itcn.value(); p.setX(floor(p.x()*1e3)*1e-3); p.setY(floor(p.y()*1e3)*1e-3); coordinates.insert(p); } } return coordinates; }