All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines
Public Member Functions
TapePositioningSystem::Triangulator Class Reference

Brief description of class still missing. More...

#include <Triangulator.h>

List of all members.

Public Member Functions

void addDistance (const QString &node1, const QString &node2, double value)
NodeaddNode (const QString &name)
void aggregate (double stddev)
Covariance covariance (const QString &nodeName) const
Nodenode (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< Point2Dsolutions (const QString &nodeName) const
 Triangulator ()
 ~Triangulator ()

Detailed Description

Brief description of class still missing.

Full description of class still missing


Constructor & Destructor Documentation

Description of constructor still missing

References TRACE.

  {
    TRACE;
  }

Description of destructor still missing

References TRACE.

  {
    TRACE;
    qDeleteAll(_clusters);
    for(QMap<QString, Node *>::const_iterator it=_nodes.begin(); it!=_nodes.end(); it++) {
      delete it.value();
    }
  }

Member Function Documentation

void TapePositioningSystem::Triangulator::addDistance ( const QString &  node1,
const QString &  node2,
double  value 
)

References TapePositioningSystem::Node::addDistance(), addNode(), node(), and TRACE.

Referenced by CoordReader::parse().

  {
    TRACE;
    Node * n1=node(node1);
    if(!n1) {
      n1=addNode(node1);
    }
    Node * n2=node(node2);
    if(!n2) {
      n2=addNode(node2);
    }
    n1->addDistance(n2, value);
    n2->addDistance(n1, value);
  }

References TapePositioningSystem::Node::setName(), and TRACE.

Referenced by addDistance().

  {
    TRACE;
    Node * n=new Node;
    n->setName(name);
    _nodes.insert(name, n);
    return n;
  }

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;
  }

The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines