move GetBearing(.) function into FixedPointCoordinate
This commit is contained in:
parent
a47467f29b
commit
8983c0f927
@ -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,
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user