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