diff --git a/Util/ComputeAngle.h b/Util/ComputeAngle.h new file mode 100644 index 000000000..f7ea0fb90 --- /dev/null +++ b/Util/ComputeAngle.h @@ -0,0 +1,56 @@ +/* + +Copyright (c) 2013, Project OSRM, Dennis Luxen, others +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list +of conditions and the following disclaimer. +Redistributions in binary form must reproduce the above copyright notice, this +list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#ifndef COMPUTE_ANGLE_H +#define COMPUTE_ANGLE_H + +#include +#include + +#include "../DataStructures/Coordinate.h" +#include "../Util/MercatorUtil.h" + +/* Get angle of line segment (A,C)->(C,B), atan2 magic, formerly cosine theorem*/ +template +inline static double GetAngleBetweenThreeFixedPointCoordinates ( + const CoordinateT & A, + const CoordinateT & C, + const CoordinateT & B +) { + const double v1x = (A.lon - C.lon)/COORDINATE_PRECISION; + const double v1y = lat2y(A.lat/COORDINATE_PRECISION) - lat2y(C.lat/COORDINATE_PRECISION); + const double v2x = (B.lon - C.lon)/COORDINATE_PRECISION; + const double v2y = lat2y(B.lat/COORDINATE_PRECISION) - lat2y(C.lat/COORDINATE_PRECISION); + + double angle = (atan2(v2y,v2x) - atan2(v1y,v1x) )*180/M_PI; + while(angle < 0) + angle += 360; + return angle; +} + + +#endif // COMPUTE_ANGLE_H diff --git a/Util/MercatorUtil.h b/Util/MercatorUtil.h new file mode 100644 index 000000000..633a749d0 --- /dev/null +++ b/Util/MercatorUtil.h @@ -0,0 +1,45 @@ +/* + +Copyright (c) 2013, Project OSRM, Dennis Luxen, others +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list +of conditions and the following disclaimer. +Redistributions in binary form must reproduce the above copyright notice, this +list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#ifndef MERCATORUTIL_H_ +#define MERCATORUTIL_H_ + +#include + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +inline double y2lat(double a) { + return 180./M_PI * (2. * atan(exp(a*M_PI/180.)) - M_PI/2.); +} + +inline double lat2y(double a) { + return 180./M_PI * log(tan(M_PI/4.+a*(M_PI/180.)/2.)); +} + +#endif /* MERCATORUTIL_H_ */ diff --git a/features/testbot/viaroute.feature b/features/testbot/viaroute.feature deleted file mode 100644 index f3c3fdb39..000000000 --- a/features/testbot/viaroute.feature +++ /dev/null @@ -1,40 +0,0 @@ -@routing @testbot @via @oneway -Feature: Via points - - Background: - Given the profile "testbot" - - Scenario: Multiple via points with oneways - Given the node map - | | a | | - | c | b | | - | d | | | - | e | f | | - | | g | i | - | | h | | - | | k | j | - | | l | | - | | m | | - - And the ways - | nodes | oneway | - | ab | | - | fb | yes | - | bcd | yes | - | def | yes | - | fg | | - | gh | | - | hk | | - | gijk | | - | klm | | - - When I route I should get - | waypoints | route | - | a,d,l,m | ab,bcd,def,fg,gh,hk,klm | - | a,f,h,m | ab,bcd,def,fg,gh,hk,klm | - | a,c,m | ab,bcd,def,fg,gh,hk,klm | - | a,d,h,m | ab,bcd,def,fg,gh,hk,klm | - | a,e,h,m | ab,bcd,def,fg,gh,hk,klm | - | a,m | ab,bcd,def,fg,gh,hk,klm | - -