LCOV - code coverage report
Current view: top level - src/foreign/eulerspiral - odrSpiral.cpp (source / functions) Hit Total Coverage
Test: lcov.info Lines: 0 41 0.0 %
Date: 2024-05-05 15:31:14 Functions: 0 2 0.0 %

          Line data    Source code
       1             : /* ===================================================
       2             :  *  file:       euler.h
       3             :  * ---------------------------------------------------
       4             :  *  purpose:    free method for computing spirals
       5             :  *              in OpenDRIVE applications
       6             :  * ---------------------------------------------------
       7             :  *  using methods of CEPHES library
       8             :  * ---------------------------------------------------
       9             :  *  first edit: 09.03.2010 by M. Dupuis @ VIRES GmbH
      10             :  *  last mod.:  02.05.2017 by Michael Scholz @ German Aerospace Center (DLR)
      11             :  *  last mod.:  05.07.2017 by Jakob Erdmann @ German Aerospace Center (DLR)
      12             :  *  last mod.:  14.05.2022 by Michael Behrisch @ German Aerospace Center (DLR)
      13             :  * ===================================================
      14             :     Copyright 2010 VIRES Simulationstechnologie GmbH
      15             :         Copyright 2017 German Aerospace Center (DLR)
      16             :     Licensed under the Apache License, Version 2.0 (the "License");
      17             :     you may not use this file except in compliance with the License.
      18             :     You may obtain a copy of the License at
      19             :         http://www.apache.org/licenses/LICENSE-2.0
      20             :     Unless required by applicable law or agreed to in writing, software
      21             :     distributed under the License is distributed on an "AS IS" BASIS,
      22             :     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      23             :     See the License for the specific language governing permissions and
      24             :     limitations under the License.
      25             : 
      26             : 
      27             :     NOTE:
      28             :     The methods have been realized using the CEPHES library
      29             :         http://www.netlib.org/cephes/
      30             :     and do neither constitute the only nor the exclusive way of implementing
      31             :     spirals for OpenDRIVE applications. Their sole purpose is to facilitate
      32             :     the interpretation of OpenDRIVE spiral data.
      33             :  */
      34             : 
      35             : #ifdef _MSC_VER
      36             : #pragma warning(disable:4820 4514 5045)
      37             : #endif
      38             : 
      39             : /* ====== INCLUSIONS ====== */
      40             : #include <stdio.h>
      41             : #include <math.h>
      42             : 
      43             : /* ====== LOCAL VARIABLES ====== */
      44             : #ifndef M_PI
      45             : #define M_PI 3.1415926535897932384626433832795
      46             : #endif
      47             : 
      48             : /* S(x) for small x */
      49             : static double sn[6] = {
      50             : -2.99181919401019853726E3,
      51             :  7.08840045257738576863E5,
      52             : -6.29741486205862506537E7,
      53             :  2.54890880573376359104E9,
      54             : -4.42979518059697779103E10,
      55             :  3.18016297876567817986E11,
      56             : };
      57             : static double sd[6] = {
      58             : /* 1.00000000000000000000E0,*/
      59             :  2.81376268889994315696E2,
      60             :  4.55847810806532581675E4,
      61             :  5.17343888770096400730E6,
      62             :  4.19320245898111231129E8,
      63             :  2.24411795645340920940E10,
      64             :  6.07366389490084639049E11,
      65             : };
      66             : 
      67             : /* C(x) for small x */
      68             : static double cn[6] = {
      69             : -4.98843114573573548651E-8,
      70             :  9.50428062829859605134E-6,
      71             : -6.45191435683965050962E-4,
      72             :  1.88843319396703850064E-2,
      73             : -2.05525900955013891793E-1,
      74             :  9.99999999999999998822E-1,
      75             : };
      76             : static double cd[7] = {
      77             :  3.99982968972495980367E-12,
      78             :  9.15439215774657478799E-10,
      79             :  1.25001862479598821474E-7,
      80             :  1.22262789024179030997E-5,
      81             :  8.68029542941784300606E-4,
      82             :  4.12142090722199792936E-2,
      83             :  1.00000000000000000118E0,
      84             : };
      85             : 
      86             : /* Auxiliary function f(x) */
      87             : static double fn[10] = {
      88             :   4.21543555043677546506E-1,
      89             :   1.43407919780758885261E-1,
      90             :   1.15220955073585758835E-2,
      91             :   3.45017939782574027900E-4,
      92             :   4.63613749287867322088E-6,
      93             :   3.05568983790257605827E-8,
      94             :   1.02304514164907233465E-10,
      95             :   1.72010743268161828879E-13,
      96             :   1.34283276233062758925E-16,
      97             :   3.76329711269987889006E-20,
      98             : };
      99             : static double fd[10] = {
     100             : /*  1.00000000000000000000E0,*/
     101             :   7.51586398353378947175E-1,
     102             :   1.16888925859191382142E-1,
     103             :   6.44051526508858611005E-3,
     104             :   1.55934409164153020873E-4,
     105             :   1.84627567348930545870E-6,
     106             :   1.12699224763999035261E-8,
     107             :   3.60140029589371370404E-11,
     108             :   5.88754533621578410010E-14,
     109             :   4.52001434074129701496E-17,
     110             :   1.25443237090011264384E-20,
     111             : };
     112             : 
     113             : /* Auxiliary function g(x) */
     114             : static double gn[11] = {
     115             :   5.04442073643383265887E-1,
     116             :   1.97102833525523411709E-1,
     117             :   1.87648584092575249293E-2,
     118             :   6.84079380915393090172E-4,
     119             :   1.15138826111884280931E-5,
     120             :   9.82852443688422223854E-8,
     121             :   4.45344415861750144738E-10,
     122             :   1.08268041139020870318E-12,
     123             :   1.37555460633261799868E-15,
     124             :   8.36354435630677421531E-19,
     125             :   1.86958710162783235106E-22,
     126             : };
     127             : static double gd[11] = {
     128             : /*  1.00000000000000000000E0,*/
     129             :   1.47495759925128324529E0,
     130             :   3.37748989120019970451E-1,
     131             :   2.53603741420338795122E-2,
     132             :   8.14679107184306179049E-4,
     133             :   1.27545075667729118702E-5,
     134             :   1.04314589657571990585E-7,
     135             :   4.60680728146520428211E-10,
     136             :   1.10273215066240270757E-12,
     137             :   1.38796531259578871258E-15,
     138             :   8.39158816283118707363E-19,
     139             :   1.86958710162783236342E-22,
     140             : };
     141             : 
     142             : 
     143             : static double polevl( double x, double* coef, int n )
     144             : {
     145             :     double ans;
     146             :     double *p = coef;
     147             :     int i;
     148             : 
     149           0 :     ans = *p++;
     150             :     i   = n;
     151             : 
     152             :     do
     153             :     {
     154           0 :         ans = ans * x + *p++;
     155             :     }
     156           0 :     while (--i);
     157             : 
     158             :     return ans;
     159             : }
     160             : 
     161             : static double p1evl( double x, double* coef, int n )
     162             : {
     163             :     double ans;
     164             :     double *p = coef;
     165             :     int i;
     166             : 
     167           0 :     ans = x + *p++;
     168             :     i   = n - 1;
     169             : 
     170             :     do
     171             :     {
     172           0 :         ans = ans * x + *p++;
     173             :     }
     174           0 :     while (--i);
     175             : 
     176             :     return ans;
     177             : }
     178             : 
     179             : 
     180           0 : static void fresnel( double xxa, double *ssa, double *cca )
     181             : {
     182             :     double f, g, cc, ss, c, s, t, u;
     183             :     double x, x2;
     184             : 
     185           0 :     x  = fabs( xxa );
     186           0 :     x2 = x * x;
     187             : 
     188           0 :     if ( x2 < 2.5625 )
     189             :     {
     190           0 :         t = x2 * x2;
     191           0 :         ss = x * x2 * polevl (t, sn, 5) / p1evl (t, sd, 6);
     192           0 :         cc = x * polevl (t, cn, 5) / polevl (t, cd, 6);
     193             :     }
     194           0 :     else if ( x > 36974.0 )
     195             :     {
     196             :         cc = 0.5;
     197             :         ss = 0.5;
     198             :     }
     199             :     else
     200             :     {
     201             :         x2 = x * x;
     202           0 :         t = M_PI * x2;
     203           0 :         u = 1.0 / (t * t);
     204           0 :         t = 1.0 / t;
     205           0 :         f = 1.0 - u * polevl (u, fn, 9) / p1evl(u, fd, 10);
     206           0 :         g = t * polevl (u, gn, 10) / p1evl (u, gd, 11);
     207             : 
     208           0 :         t = M_PI * 0.5 * x2;
     209           0 :         c = cos (t);
     210           0 :         s = sin (t);
     211           0 :         t = M_PI * x;
     212           0 :         cc = 0.5 + (f * s - g * c) / t;
     213           0 :         ss = 0.5 - (f * c + g * s) / t;
     214             :     }
     215             : 
     216           0 :     if ( xxa < 0.0 )
     217             :     {
     218           0 :         cc = -cc;
     219           0 :         ss = -ss;
     220             :     }
     221             : 
     222           0 :     *cca = cc;
     223           0 :     *ssa = ss;
     224           0 : }
     225             : 
     226             : 
     227             : /**
     228             : * compute the actual "standard" spiral, starting with curvature 0
     229             : * @param s      run-length along spiral
     230             : * @param cDot   first derivative of curvature [1/m2]
     231             : * @param x      resulting x-coordinate in spirals local co-ordinate system [m]
     232             : * @param y      resulting y-coordinate in spirals local co-ordinate system [m]
     233             : * @param t      tangent direction at s [rad]
     234             : */
     235             : 
     236           0 : void odrSpiral( double s, double cDot, double *x, double *y, double *t )
     237             : {
     238             :     double a;
     239             : 
     240           0 :     a = 1.0 / sqrt( fabs( cDot ) );
     241           0 :     a *= sqrt( M_PI );
     242             : 
     243           0 :     fresnel( s / a, y, x );
     244             : 
     245           0 :     *x *= a;
     246           0 :     *y *= a;
     247             : 
     248           0 :     if ( cDot < 0.0 )
     249           0 :         *y *= -1.0;
     250             : 
     251           0 :     *t = s * s * cDot * 0.5;
     252           0 : }

Generated by: LCOV version 1.14