Coverage Report

Created: 2026-05-16 06:09

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/sofars-0.6.1/src/vm/pv2s.rs
Line
Count
Source
1
/// Convert position/velocity from Cartesian to spherical coordinates.
2
#[inline]
3
0
pub fn pv2s(pv: &[[f64; 3]; 2]) -> (f64, f64, f64, f64, f64, f64) {
4
    let (theta, phi, r, td, pd, rd): (f64, f64, f64, f64, f64, f64);
5
6
    let (mut x, mut y, mut z): (f64, f64, f64);
7
    let (xd, yd, zd, mut rxy2, rxy): (f64, f64, f64, f64, f64);
8
    let (mut r2, rtrue, mut rw, xyp): (f64, f64, f64, f64);
9
10
    /* Components of position/velocity vector. */
11
0
    x = pv[0][0];
12
0
    y = pv[0][1];
13
0
    z = pv[0][2];
14
0
    xd = pv[1][0];
15
0
    yd = pv[1][1];
16
0
    zd = pv[1][2];
17
18
    /* Component of r in XY plane squared. */
19
0
    rxy2 = x * x + y * y;
20
21
    /* Modulus squared. */
22
0
    r2 = rxy2 + z * z;
23
24
    /* Modulus. */
25
0
    rtrue = r2.sqrt();
26
27
    /* If null vector, move the origin along the direction of movement. */
28
0
    rw = rtrue;
29
0
    if rtrue == 0.0 {
30
0
        x = xd;
31
0
        y = yd;
32
0
        z = zd;
33
0
        rxy2 = x * x + y * y;
34
0
        r2 = rxy2 + z * z;
35
0
        rw = r2.sqrt();
36
0
    }
37
38
    /* Position and velocity in spherical coordinates. */
39
0
    rxy = rxy2.sqrt();
40
0
    xyp = x * xd + y * yd;
41
0
    if rxy2 != 0.0 {
42
0
        theta = y.atan2(x);
43
0
        phi = z.atan2(rxy);
44
0
        td = (x * yd - y * xd) / rxy2;
45
0
        pd = (zd * rxy2 - z * xyp) / (r2 * rxy);
46
0
    } else {
47
0
        theta = 0.0;
48
0
        phi = if z != 0.0 { z.atan2(rxy) } else { 0.0 };
49
0
        td = 0.0;
50
0
        pd = 0.0;
51
    }
52
0
    r = rtrue;
53
0
    rd = if rw != 0.0 { (xyp + z * zd) / rw } else { 0.0 };
54
55
0
    (theta, phi, r, td, pd, rd)
56
0
}