move GetBearing(.) function into FixedPointCoordinate

This commit is contained in:
Dennis Luxen 2014-05-18 13:06:00 +02:00
parent a47467f29b
commit 8983c0f927
5 changed files with 837 additions and 813 deletions

View File

@ -330,6 +330,59 @@ void FixedPointCoordinate::Output(std::ostream &out) const
out << "(" << lat / COORDINATE_PRECISION << "," << lon / COORDINATE_PRECISION << ")"; out << "(" << lat / COORDINATE_PRECISION << "," << lon / COORDINATE_PRECISION << ")";
} }
double FixedPointCoordinate::GetBearing(const FixedPointCoordinate &A, const FixedPointCoordinate &B)
{
double delta_long = DegreeToRadian(B.lon / COORDINATE_PRECISION - A.lon / COORDINATE_PRECISION);
const double lat1 = DegreeToRadian(A.lat / COORDINATE_PRECISION);
const double lat2 = DegreeToRadian(B.lat / COORDINATE_PRECISION);
const double y = sin(delta_long) * cos(lat2);
const double x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(delta_long);
double result = RadianToDegree(atan2(y, x));
while (result < 0.)
{
result += 360.;
}
while (result >= 360.)
{
result -= 360.;
}
return result;
}
double FixedPointCoordinate::GetBearing(const FixedPointCoordinate &other) const
{
double delta_long = DegreeToRadian(lon / COORDINATE_PRECISION - other.lon / COORDINATE_PRECISION);
const double lat1 = DegreeToRadian(other.lat / COORDINATE_PRECISION);
const double lat2 = DegreeToRadian(lat / COORDINATE_PRECISION);
const double y = sin(delta_long) * cos(lat2);
const double x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(delta_long);
double result = RadianToDegree(atan2(y, x));
while (result < 0.)
{
result += 360.;
}
while (result >= 360.)
{
result -= 360.;
}
return result;
}
double FixedPointCoordinate::DegreeToRadian(const double degree)
{
return degree * (M_PI / 180.);
}
double FixedPointCoordinate::RadianToDegree(const double radian)
{
return radian * (180. / M_PI);
}
// double PointSegmentDistanceSquared( double px, double py, // double PointSegmentDistanceSquared( double px, double py,
// double p1x, double p1y, // double p1x, double p1y,

View File

@ -31,39 +31,6 @@ DescriptionFactory::DescriptionFactory() : entireLength(0) {}
DescriptionFactory::~DescriptionFactory() {} DescriptionFactory::~DescriptionFactory() {}
inline double DescriptionFactory::DegreeToRadian(const double degree) const
{
return degree * (M_PI / 180.);
}
inline double DescriptionFactory::RadianToDegree(const double radian) const
{
return radian * (180. / M_PI);
}
double DescriptionFactory::GetBearing(const FixedPointCoordinate &A, const FixedPointCoordinate &B)
const
{
double delta_long = DegreeToRadian(B.lon / COORDINATE_PRECISION - A.lon / COORDINATE_PRECISION);
const double lat1 = DegreeToRadian(A.lat / COORDINATE_PRECISION);
const double lat2 = DegreeToRadian(B.lat / COORDINATE_PRECISION);
const double y = sin(delta_long) * cos(lat2);
const double x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(delta_long);
double result = RadianToDegree(atan2(y, x));
while (result < 0.)
{
result += 360.;
}
while (result >= 360.)
{
result -= 360.;
}
return result;
}
void DescriptionFactory::SetStartSegment(const PhantomNode &source) void DescriptionFactory::SetStartSegment(const PhantomNode &source)
{ {
start_phantom = source; start_phantom = source;

View File

@ -77,7 +77,6 @@ class DescriptionFactory
std::vector<SegmentInformation> path_description; std::vector<SegmentInformation> path_description;
DescriptionFactory(); DescriptionFactory();
virtual ~DescriptionFactory(); virtual ~DescriptionFactory();
double GetBearing(const FixedPointCoordinate &C, const FixedPointCoordinate &B) const;
JSON::Value AppendUnencodedPolylineString() const; JSON::Value AppendUnencodedPolylineString() const;
void AppendSegment(const FixedPointCoordinate &coordinate, const PathData &data); void AppendSegment(const FixedPointCoordinate &coordinate, const PathData &data);
void BuildRouteSummary(const double distance, const unsigned time); void BuildRouteSummary(const double distance, const unsigned time);
@ -196,8 +195,7 @@ class DescriptionFactory
{ {
if (path_description[i].necessary) if (path_description[i].necessary)
{ {
const double angle = const double angle = path_description[i].location.GetBearing(path_description[i + 1].location);
GetBearing(path_description[i].location, path_description[i + 1].location);
path_description[i].bearing = angle * 10; path_description[i].bearing = angle * 10;
} }
} }

View File

@ -44,7 +44,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
template <class DataFacadeT> class JSONDescriptor : public BaseDescriptor<DataFacadeT> template <class DataFacadeT> class JSONDescriptor : public BaseDescriptor<DataFacadeT>
{ {
private: private:
// TODO: initalize in c'tor
DataFacadeT *facade; DataFacadeT *facade;
DescriptorConfig config; DescriptorConfig config;
DescriptionFactory description_factory, alternate_description_factory; DescriptionFactory description_factory, alternate_description_factory;

View File

@ -74,7 +74,14 @@ struct FixedPointCoordinate
FixedPointCoordinate &nearest_location, FixedPointCoordinate &nearest_location,
double &r); double &r);
static double GetBearing(const FixedPointCoordinate &A, const FixedPointCoordinate &B);
double GetBearing(const FixedPointCoordinate &other) const;
void Output(std::ostream &out) const; void Output(std::ostream &out) const;
static double DegreeToRadian(const double degree);
static double RadianToDegree(const double radian);
}; };
inline std::ostream &operator<<(std::ostream &o, FixedPointCoordinate const &c) inline std::ostream &operator<<(std::ostream &o, FixedPointCoordinate const &c)