Ref T111, lat/lng/angle changes

* get struct CAngle::DegMinSecFractionalSec to obtain parts
* round to epsilon utility functions and fix (qint64)
This commit is contained in:
Klaus Basan
2017-07-26 14:38:49 +02:00
committed by Mathew Sutcliffe
parent 77546a46b1
commit e55480737e
15 changed files with 328 additions and 102 deletions

View File

@@ -14,10 +14,60 @@
#include <cmath>
using namespace BlackMisc::Math;
namespace BlackMisc
{
namespace PhysicalQuantities
{
CAngle::CAngle(int degrees, int minutes, double seconds) :
CPhysicalQuantity(
degrees + minutes / 100.0 + seconds / 10000.0,
CAngleUnit::sexagesimalDeg())
{
Q_ASSERT_X((degrees >= 0 && minutes >= 0 && seconds >= 0) ||
(degrees <= 0 && minutes <= 0 && seconds <= 0), Q_FUNC_INFO, "Same sign required");
}
CAngle::CAngle(int degrees, double minutes) :
CPhysicalQuantity(
degrees + minutes / 100.0,
CAngleUnit::sexagesimalDeg())
{
Q_ASSERT_X((degrees >= 0 && minutes >= 0) || (degrees <= 0 && minutes <= 0),
Q_FUNC_INFO, "Same sign required");
}
void CAngle::unifySign(int &degrees, int &minutes, double &seconds)
{
if (degrees < 0)
{
if (minutes > 0) minutes *= -1;
if (seconds > 0) seconds *= -1.0;
}
else if (degrees > 0)
{
if (minutes < 0) minutes *= -1;
if (seconds < 0) seconds *= -1.0;
}
else
{
// degrees was 0
if ((minutes > 0 && seconds < 0) || (minutes < 0 && seconds > 0))
{
seconds *= -1.0;
}
}
}
void CAngle::unifySign(int &degrees, int &minutes)
{
if ((degrees > 0 && minutes < 0) || (degrees < 0 && minutes > 0))
{
minutes *= -1.0;
}
}
BlackMisc::CIcon CAngle::toIcon() const
{
BlackMisc::CIcon i = CIcon::iconByIndex(CIcons::StandardIconArrowMediumNorth16);
@@ -25,6 +75,37 @@ namespace BlackMisc
return i;
}
CAngle::DegMinSecFractionalSec CAngle::asSexagesimalDegMinSec(bool range180Degrees) const
{
double v = this->value(CAngleUnit::deg());
v = CAngleUnit::deg().roundToEpsilon(v);
// range -179-180 ?
if (range180Degrees)
{
v = std::fmod(v + 180.0, 360.0);
v += (v < 0) ? 180.0 : -180.0;
}
DegMinSecFractionalSec values;
if (v < 0)
{
values.sign = -1;
v *= -1.0;
}
values.deg = v;
v -= values.deg;
v = v * 100.0 * 0.6;
values.min = v;
v -= values.min;
v = v * 100.0 * 0.6;
values.sec = v;
v -= values.sec;
values.fractionalSec = CMathUtils::round(v, 6);
return values;
}
double CAngle::piFactor() const
{
return BlackMisc::Math::CMathUtils::round(this->value(CAngleUnit::rad()) / BlackMisc::Math::CMathUtils::PI() , 6);
@@ -49,5 +130,5 @@ namespace BlackMisc
{
return std::tan(this->value(CAngleUnit::rad()));
}
}
}
} // ns
} // ns