Brief description of class still missing. More...
#include <PointLocate.h>
Public Member Functions | |
| double | azimuth (int index) const |
| double | distance (int index) const |
| bool | fromString (const QString &log) |
| bool | isAzimuth (int index) const |
| bool | isDistance (int index) const |
| PointLocate () | |
| Point | position (const QMap< QString, const Point * > &references, Point &uncertainty, int &nSolutions) const |
| QString | reference (int index) const |
| void | setAzimuth (int index, double az) |
| void | setAzimuth (int index) |
| void | setDistance (int index, double d) |
| void | setDistance (int index) |
| void | setReference (int index, const QString &s) |
| void | setSolutionIndex (int i) |
| int | solutionIndex () const |
| QString | toString () const |
| ~PointLocate () | |
Brief description of class still missing.
Full description of class still missing
| double QGpCoreTools::PointLocate::azimuth | ( | int | index | ) | const |
| double QGpCoreTools::PointLocate::distance | ( | int | index | ) | const |
| bool QGpCoreTools::PointLocate::fromString | ( | const QString & | s | ) |
Initialize from a string (format returned by toString()). Return false in case of error.
References QGpCoreTools::Angle::degreesToRadians(), and TRACE.
{
TRACE;
QString head=s.left(4);
QString info=s.right(s.length() - 4);
if(head=="3d__") {
_references[0]=info.section(':', 0, 0);
head=info.section(':', 1, 1);
_distances[0]=head.left(head.length() - 1).toDouble();
_isDistance[0]=true;
_isAzimuth[0]=false;
_references[1]=info.section(':', 2, 2);
head=info.section(':', 3, 3);
_distances[1]=head.left(head.length() - 1).toDouble();
_isDistance[1]=true;
_isAzimuth[1]=false;
_references[2]=info.section(':', 4, 4);
head=info.section(':', 5, 5);
_distances[2]=head.left(head.length() - 1).toDouble();
_isDistance[2]=true;
_isAzimuth[2]=false;
} else if(head=="2d__") {
_references[0]=info.section(':', 0, 0);
head=info.section(':', 1, 1);
_distances[0]=head.left(head.length() - 1).toDouble();
_isDistance[0]=true;
_isAzimuth[0]=false;
_references[1]=info.section(':', 2, 2);
head=info.section(':', 3, 3);
_distances[1]=head.left(head.length() - 1).toDouble();
_isDistance[1]=true;
_isAzimuth[1]=false;
_solutionIndex=info.section(':', 4, 4).toInt();
_isDistance[2]=false;
_isAzimuth[2]=false;
} else if(head=="3az_") {
_references[0]=info.section(':', 0, 0);
head=info.section(':', 1, 1);
_azimuths[0]=Angle::degreesToRadians(head.left(head.length()).toDouble());
_isDistance[0]=false;
_isAzimuth[0]=true;
_references[1]=info.section(':', 2, 2);
head=info.section(':', 3, 3);
_azimuths[1]=Angle::degreesToRadians(head.left(head.length()).toDouble());
_isDistance[1]=false;
_isAzimuth[1]=true;
_references[2]=info.section(':', 4, 4);
head=info.section(':', 5, 5);
_azimuths[2]=Angle::degreesToRadians(head.left(head.length()).toDouble());
_isDistance[2]=false;
_isAzimuth[2]=true;
} else if(head=="1___") {
_references[0]=info.section(':', 0, 0);
head=info.section(':', 1, 1);
_distances[0]=head.left(head.length() - 1).toDouble();
head=info.section(':', 2, 2);
_azimuths[0]=Angle::degreesToRadians(head.left(head.length()).toDouble());
_isDistance[0]=true;
_isAzimuth[0]=true;
_isDistance[1]=false;
_isAzimuth[1]=false;
_isDistance[2]=false;
_isAzimuth[2]=false;
} else {
return false;
}
return true;
}
| bool QGpCoreTools::PointLocate::isAzimuth | ( | int | index | ) | const |
| bool QGpCoreTools::PointLocate::isDistance | ( | int | index | ) | const |
| Point QGpCoreTools::PointLocate::position | ( | const QMap< QString, const Point * > & | references, |
| Point & | uncertainty, | ||
| int & | nSolutions | ||
| ) | const |
References QGpCoreTools::cos(), QGpCoreTools::Circle::intersect(), QGpCoreTools::Line2D::intersect(), QGpCoreTools::Point2D::setX(), QGpCoreTools::Point2D::setY(), QGpCoreTools::sin(), QGpCoreTools::sqrt(), TRACE, QGpCoreTools::Point2D::x(), and QGpCoreTools::Point2D::y().
{
TRACE;
nSolutions=0;
Point solution(0, 0, 0);
uncertainty=Point(0, 0, 0);
// Check available information
int distCount, azimuthCount, id, iaz;
availableInformation(distCount, azimuthCount, id, iaz);
if(azimuthCount==0) {
if(distCount==3) {
const Point * refPoints[3];
refPoints[0]=references[_references[0]];
if(!refPoints[0]) return solution;
refPoints[1]=references[_references[1]];
if(!refPoints[1]) return solution;
refPoints[2]=references[_references[2]];
if(!refPoints[2]) return solution;
Circle c1(refPoints[0]->x(), refPoints[0]->y(), _distances[0]);
Circle c2(refPoints[1]->x(), refPoints[1]->y(), _distances[1]);
Circle c3(refPoints[2]->x(), refPoints[2]->y(), _distances[2]);
bool ok;
int n=0;
Point2D p;
p=c1.intersect(c2, ok, c3);
if(ok) {solution += p; uncertainty += p * p; n++;}
p=c1.intersect(c3, ok, c2);
if(ok) {solution += p; uncertainty += p * p; n++;}
p=c2.intersect(c3, ok, c1);
if(ok) {solution += p; uncertainty += p * p; n++;}
if(n!=0) {
solution/=n;
uncertainty.setX(::sqrt(uncertainty.x()/n-solution.x()*solution.x()));
uncertainty.setY(::sqrt(uncertainty.y()/n-solution.y()*solution.y()));
nSolutions=1;
}
} else if(distCount==2) {
const Point * refPoints[2];
refPoints[0]=references[_references[0]];
if(!refPoints[0]) return solution;
refPoints[1]=references[_references[1]];
if(!refPoints[1]) return solution;
Circle c1(refPoints[0]->x(), refPoints[0]->y(), _distances[0]);
Circle c2(refPoints[1]->x(), refPoints[1]->y(), _distances[1]);
QVector<Point2D> solutions=c1.intersect(c2);
nSolutions=solutions.count();
switch(solutions.count()) {
case 1:
solution=solutions[0];
break;
case 2:
solution=solutions[_solutionIndex];
break;
default:
break;
}
}
} else if(azimuthCount==3) {
const Point * refPoints[3];
refPoints[0]=references[_references[0]];
if(!refPoints[0]) return solution;
refPoints[1]=references[_references[1]];
if(!refPoints[1]) return solution;
refPoints[2]=references[_references[2]];
if(!refPoints[2]) return solution;
Line2D l1(refPoints[0]->x(), refPoints[0]->y(), _azimuths[0]);
Line2D l2(refPoints[1]->x(), refPoints[1]->y(), _azimuths[1]);
Line2D l3(refPoints[2]->x(), refPoints[2]->y(), _azimuths[2]);
bool ok;
int n=0;
Point2D p;
p=l1.intersect(l2, ok);
if(ok) {solution += p; uncertainty += p * p; n++;}
p=l1.intersect(l3, ok);
if(ok) {solution += p; uncertainty += p * p; n++;}
p=l2.intersect(l3, ok);
if(ok) {solution += p; uncertainty += p * p; n++;}
if(n!=0) {
solution/=n;
uncertainty.setX(::sqrt(uncertainty.x()/n-solution.x()*solution.x()));
uncertainty.setY(::sqrt(uncertainty.y()/n-solution.y()*solution.y()));
nSolutions=1;
}
} else if(distCount==1 && azimuthCount==1 && id==iaz) {
const Point * refPoint;
refPoint=references[_references[id]];
if(!refPoint) return solution;
solution.setX(refPoint->x()+_distances[id]*::cos(0.5 * M_PI - _azimuths[id]));
solution.setY(refPoint->y()+_distances[id]*::sin(0.5 * M_PI - _azimuths[id]));
nSolutions=1;
}
return solution;
}
| QString QGpCoreTools::PointLocate::reference | ( | int | index | ) | const |
| void QGpCoreTools::PointLocate::setAzimuth | ( | int | index, |
| double | az | ||
| ) |
| void QGpCoreTools::PointLocate::setAzimuth | ( | int | index | ) |
| void QGpCoreTools::PointLocate::setDistance | ( | int | index, |
| double | d | ||
| ) |
| void QGpCoreTools::PointLocate::setDistance | ( | int | index | ) |
| void QGpCoreTools::PointLocate::setReference | ( | int | index, |
| const QString & | s | ||
| ) |
| void QGpCoreTools::PointLocate::setSolutionIndex | ( | int | i | ) | [inline] |
{_solutionIndex=i;}
| int QGpCoreTools::PointLocate::solutionIndex | ( | ) | const [inline] |
{return _solutionIndex;}
| QString QGpCoreTools::PointLocate::toString | ( | ) | const |
Return this location as a string
References QGpCoreTools::Angle::radiansToDegrees(), and TRACE.
{
TRACE;
// Check available information
int distCount, azimuthCount, id, iaz;
availableInformation(distCount, azimuthCount, id, iaz);
if(azimuthCount==0) {
if(distCount==3) {
return QString("3d__%1:%2m:%3:%4m:%5:%6m")
.arg(_references[0])
.arg(_distances[0])
.arg(_references[1])
.arg(_distances[1])
.arg(_references[2])
.arg(_distances[2]);
} else if(distCount==2) {
return QString("2d__%1:%2m:%3:%4m:%5")
.arg(_references[0])
.arg(_distances[0])
.arg(_references[1])
.arg(_distances[1])
.arg(_solutionIndex);
}
} else if(azimuthCount==3) {
return QString("3az_%1:%2:%3:%4:%5:%6")
.arg(_references[0])
.arg(Angle::radiansToDegrees(_azimuths[0]))
.arg(_references[1])
.arg(Angle::radiansToDegrees(_azimuths[1]))
.arg(_references[2])
.arg(Angle::radiansToDegrees(_azimuths[2]));
} else if(distCount==1 && azimuthCount==1 && id==iaz) {
return QString("1___%1:%2m:%3")
.arg(_references[id])
.arg(_distances[id])
.arg(Angle::radiansToDegrees(_azimuths[id]));
}
return QString::null;
}