fractional (decimal) heart rate zone calculation

What's the "best" algorithm to calculate fractional HR zones (i.e: zone: 3.45)?

Splitting from: forums.garmin.com/.../how-edge-calculate-current-heart-zone-decimal-value

  • Ok here's my fixed code (upvoted for visibility). All I had to do was change absolute max to be zone 5 max instead of 220.

    function computeHrZoneFlowState(heartRate as Number, isValidHR as Boolean) as Float {
        var z = INVALID_ZONE;
        var fZ = INVALID_FRACTIONAL_ZONE;
        var heartRateZones = TEST_HR_ZONES;
    
        var absoluteMin = 30;
        var absoluteMax = heartRateZones[5];
    
        // ofc this is superfluous bc Garmin can't read an HR less than 30,
        // but let's pretend we don't know that
        if (heartRate < absoluteMin) {
            heartRate = absoluteMin;
        }
    
        // match garmin behaviour (any hr >= zone 5 max will produce a decimal zone of 6.0)
        if (heartRate > absoluteMax) {
            heartRate = absoluteMax;
        }
    
        for (z = 0; z < 5 && heartRate >= heartRateZones[z]; z++) {}
    
        var min = z > 0 ? heartRateZones[z - 1] : absoluteMin; // use 30 as min for zone 0 to get similar fractional zone number as Garmin
        var max = heartRateZones[z];
    
        // fZ = z + (100.0 * (heartRate - min) / (max - min)) / 100;
        // This is closer to what I originally had in pseudocode
        fZ = z + 1.0 * (heartRate - min) / (max - min);
        return fZ;
    }
    

  • Here's my results with 2 data sets: yours and mine (100, 120, 140, ...)

    I modified the test function to log the hr zones.

    Your data:

    Executing test compareHrZones...
    DEBUG (07:18): HR Zones: [128, 153, 162, 180, 185, 190]
    DEBUG (07:18): HR: 0, HR zone: non-touching: -0.303030, touching: 0.000000, non-touching 'angle': -0.303030, touching 'angle': 0.000000
    DEBUG (07:18): HR: 1, HR zone: non-touching: -0.292929, touching: 0.000000, non-touching 'angle': 0.010101, touching 'angle': 0.000000
    DEBUG (07:18): HR: 2, HR zone: non-touching: -0.282828, touching: 0.000000, non-touching 'angle': 0.010101, touching 'angle': 0.000000
    DEBUG (07:18): HR: 3, HR zone: non-touching: -0.272727, touching: 0.000000, non-touching 'angle': 0.010101, touching 'angle': 0.000000
    DEBUG (07:18): HR: 4, HR zone: non-touching: -0.262626, touching: 0.000000, non-touching 'angle': 0.010101, touching 'angle': 0.000000
    DEBUG (07:18): HR: 5, HR zone: non-touching: -0.252525, touching: 0.000000, non-touching 'angle': 0.010101, touching 'angle': 0.000000
    DEBUG (07:18): HR: 6, HR zone: non-touching: -0.242424, touching: 0.000000, non-touching 'angle': 0.010101, touching 'angle': 0.000000
    DEBUG (07:18): HR: 7, HR zone: non-touching: -0.232323, touching: 0.000000, non-touching 'angle': 0.010101, touching 'angle': 0.000000
    DEBUG (07:18): HR: 8, HR zone: non-touching: -0.222222, touching: 0.000000, non-touching 'angle': 0.010101, touching 'angle': 0.000000
    DEBUG (07:18): HR: 9, HR zone: non-touching: -0.212121, touching: 0.000000, non-touching 'angle': 0.010101, touching 'angle': 0.000000
    DEBUG (07:18): HR: 10, HR zone: non-touching: -0.202020, touching: 0.000000, non-touching 'angle': 0.010101, touching 'angle': 0.000000
    DEBUG (07:18): HR: 11, HR zone: non-touching: -0.191919, touching: 0.000000, non-touching 'angle': 0.010101, touching 'angle': 0.000000
    DEBUG (07:18): HR: 12, HR zone: non-touching: -0.181818, touching: 0.000000, non-touching 'angle': 0.010101, touching 'angle': 0.000000
    DEBUG (07:18): HR: 13, HR zone: non-touching: -0.171717, touching: 0.000000, non-touching 'angle': 0.010101, touching 'angle': 0.000000
    DEBUG (07:18): HR: 14, HR zone: non-touching: -0.161616, touching: 0.000000, non-touching 'angle': 0.010101, touching 'angle': 0.000000
    DEBUG (07:18): HR: 15, HR zone: non-touching: -0.151515, touching: 0.000000, non-touching 'angle': 0.010101, touching 'angle': 0.000000
    DEBUG (07:18): HR: 16, HR zone: non-touching: -0.141414, touching: 0.000000, non-touching 'angle': 0.010101, touching 'angle': 0.000000
    DEBUG (07:18): HR: 17, HR zone: non-touching: -0.131313, touching: 0.000000, non-touching 'angle': 0.010101, touching 'angle': 0.000000
    DEBUG (07:18): HR: 18, HR zone: non-touching: -0.121212, touching: 0.000000, non-touching 'angle': 0.010101, touching 'angle': 0.000000
    DEBUG (07:18): HR: 19, HR zone: non-touching: -0.111111, touching: 0.000000, non-touching 'angle': 0.010101, touching 'angle': 0.000000
    DEBUG (07:18): HR: 20, HR zone: non-touching: -0.101010, touching: 0.000000, non-touching 'angle': 0.010101, touching 'angle': 0.000000
    DEBUG (07:18): HR: 21, HR zone: non-touching: -0.090909, touching: 0.000000, non-touching 'angle': 0.010101, touching 'angle': 0.000000
    DEBUG (07:18): HR: 22, HR zone: non-touching: -0.080808, touching: 0.000000, non-touching 'angle': 0.010101, touching 'angle': 0.000000
    DEBUG (07:18): HR: 23, HR zone: non-touching: -0.070707, touching: 0.000000, non-touching 'angle': 0.010101, touching 'angle': 0.000000
    DEBUG (07:18): HR: 24, HR zone: non-touching: -0.060606, touching: 0.000000, non-touching 'angle': 0.010101, touching 'angle': 0.000000
    DEBUG (07:18): HR: 25, HR zone: non-touching: -0.050505, touching: 0.000000, non-touching 'angle': 0.010101, touching 'angle': 0.000000
    DEBUG (07:18): HR: 26, HR zone: non-touching: -0.040404, touching: 0.000000, non-touching 'angle': 0.010101, touching 'angle': 0.000000
    DEBUG (07:18): HR: 27, HR zone: non-touching: -0.030303, touching: 0.000000, non-touching 'angle': 0.010101, touching 'angle': 0.000000
    DEBUG (07:18): HR: 28, HR zone: non-touching: -0.020202, touching: 0.000000, non-touching 'angle': 0.010101, touching 'angle': 0.000000
    DEBUG (07:18): HR: 29, HR zone: non-touching: -0.010101, touching: 0.000000, non-touching 'angle': 0.010101, touching 'angle': 0.000000
    DEBUG (07:18): HR: 30, HR zone: non-touching: 0.000000, touching: 0.000000, non-touching 'angle': 0.010101, touching 'angle': 0.000000
    DEBUG (07:18): HR: 31, HR zone: non-touching: 0.010101, touching: 0.010204, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 32, HR zone: non-touching: 0.020202, touching: 0.020408, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 33, HR zone: non-touching: 0.030303, touching: 0.030612, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 34, HR zone: non-touching: 0.040404, touching: 0.040816, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 35, HR zone: non-touching: 0.050505, touching: 0.051020, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 36, HR zone: non-touching: 0.060606, touching: 0.061224, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 37, HR zone: non-touching: 0.070707, touching: 0.071429, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 38, HR zone: non-touching: 0.080808, touching: 0.081633, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 39, HR zone: non-touching: 0.090909, touching: 0.091837, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 40, HR zone: non-touching: 0.101010, touching: 0.102041, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 41, HR zone: non-touching: 0.111111, touching: 0.112245, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 42, HR zone: non-touching: 0.121212, touching: 0.122449, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 43, HR zone: non-touching: 0.131313, touching: 0.132653, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 44, HR zone: non-touching: 0.141414, touching: 0.142857, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 45, HR zone: non-touching: 0.151515, touching: 0.153061, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 46, HR zone: non-touching: 0.161616, touching: 0.163265, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 47, HR zone: non-touching: 0.171717, touching: 0.173469, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 48, HR zone: non-touching: 0.181818, touching: 0.183673, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 49, HR zone: non-touching: 0.191919, touching: 0.193878, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 50, HR zone: non-touching: 0.202020, touching: 0.204082, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 51, HR zone: non-touching: 0.212121, touching: 0.214286, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 52, HR zone: non-touching: 0.222222, touching: 0.224490, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 53, HR zone: non-touching: 0.232323, touching: 0.234694, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 54, HR zone: non-touching: 0.242424, touching: 0.244898, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 55, HR zone: non-touching: 0.252525, touching: 0.255102, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 56, HR zone: non-touching: 0.262626, touching: 0.265306, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 57, HR zone: non-touching: 0.272727, touching: 0.275510, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 58, HR zone: non-touching: 0.282828, touching: 0.285714, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 59, HR zone: non-touching: 0.292929, touching: 0.295918, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 60, HR zone: non-touching: 0.303030, touching: 0.306122, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 61, HR zone: non-touching: 0.313131, touching: 0.316327, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 62, HR zone: non-touching: 0.323232, touching: 0.326531, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 63, HR zone: non-touching: 0.333333, touching: 0.336735, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 64, HR zone: non-touching: 0.343434, touching: 0.346939, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 65, HR zone: non-touching: 0.353535, touching: 0.357143, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 66, HR zone: non-touching: 0.363636, touching: 0.367347, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 67, HR zone: non-touching: 0.373737, touching: 0.377551, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 68, HR zone: non-touching: 0.383838, touching: 0.387755, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 69, HR zone: non-touching: 0.393939, touching: 0.397959, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 70, HR zone: non-touching: 0.404040, touching: 0.408163, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 71, HR zone: non-touching: 0.414141, touching: 0.418367, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 72, HR zone: non-touching: 0.424242, touching: 0.428571, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 73, HR zone: non-touching: 0.434343, touching: 0.438776, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 74, HR zone: non-touching: 0.444444, touching: 0.448980, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 75, HR zone: non-touching: 0.454545, touching: 0.459184, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 76, HR zone: non-touching: 0.464646, touching: 0.469388, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 77, HR zone: non-touching: 0.474747, touching: 0.479592, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 78, HR zone: non-touching: 0.484848, touching: 0.489796, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 79, HR zone: non-touching: 0.494949, touching: 0.500000, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 80, HR zone: non-touching: 0.505050, touching: 0.510204, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 81, HR zone: non-touching: 0.515152, touching: 0.520408, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 82, HR zone: non-touching: 0.525253, touching: 0.530612, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 83, HR zone: non-touching: 0.535354, touching: 0.540816, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 84, HR zone: non-touching: 0.545455, touching: 0.551020, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 85, HR zone: non-touching: 0.555556, touching: 0.561224, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 86, HR zone: non-touching: 0.565657, touching: 0.571429, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 87, HR zone: non-touching: 0.575758, touching: 0.581633, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 88, HR zone: non-touching: 0.585859, touching: 0.591837, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 89, HR zone: non-touching: 0.595960, touching: 0.602041, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 90, HR zone: non-touching: 0.606061, touching: 0.612245, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 91, HR zone: non-touching: 0.616162, touching: 0.622449, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 92, HR zone: non-touching: 0.626263, touching: 0.632653, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 93, HR zone: non-touching: 0.636364, touching: 0.642857, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 94, HR zone: non-touching: 0.646465, touching: 0.653061, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 95, HR zone: non-touching: 0.656566, touching: 0.663265, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 96, HR zone: non-touching: 0.666667, touching: 0.673469, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 97, HR zone: non-touching: 0.676768, touching: 0.683673, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 98, HR zone: non-touching: 0.686869, touching: 0.693878, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 99, HR zone: non-touching: 0.696970, touching: 0.704082, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 100, HR zone: non-touching: 0.707071, touching: 0.714286, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 101, HR zone: non-touching: 0.717172, touching: 0.724490, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 102, HR zone: non-touching: 0.727273, touching: 0.734694, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 103, HR zone: non-touching: 0.737374, touching: 0.744898, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 104, HR zone: non-touching: 0.747475, touching: 0.755102, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 105, HR zone: non-touching: 0.757576, touching: 0.765306, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 106, HR zone: non-touching: 0.767677, touching: 0.775510, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 107, HR zone: non-touching: 0.777778, touching: 0.785714, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 108, HR zone: non-touching: 0.787879, touching: 0.795918, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 109, HR zone: non-touching: 0.797980, touching: 0.806122, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 110, HR zone: non-touching: 0.808081, touching: 0.816327, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 111, HR zone: non-touching: 0.818182, touching: 0.826531, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 112, HR zone: non-touching: 0.828283, touching: 0.836735, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 113, HR zone: non-touching: 0.838384, touching: 0.846939, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 114, HR zone: non-touching: 0.848485, touching: 0.857143, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 115, HR zone: non-touching: 0.858586, touching: 0.867347, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 116, HR zone: non-touching: 0.868687, touching: 0.877551, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 117, HR zone: non-touching: 0.878788, touching: 0.887755, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 118, HR zone: non-touching: 0.888889, touching: 0.897959, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 119, HR zone: non-touching: 0.898990, touching: 0.908163, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 120, HR zone: non-touching: 0.909091, touching: 0.918367, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 121, HR zone: non-touching: 0.919192, touching: 0.928571, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 122, HR zone: non-touching: 0.929293, touching: 0.938776, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 123, HR zone: non-touching: 0.939394, touching: 0.948980, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 124, HR zone: non-touching: 0.949495, touching: 0.959184, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 125, HR zone: non-touching: 0.959596, touching: 0.969388, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 126, HR zone: non-touching: 0.969697, touching: 0.979592, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 127, HR zone: non-touching: 0.979798, touching: 0.989796, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 128, HR zone: non-touching: 0.989899, touching: 1.000000, non-touching 'angle': 0.010101, touching 'angle': 0.010204
    DEBUG (07:18): HR: 129, HR zone: non-touching: 1.000000, touching: 1.040000, non-touching 'angle': 0.010101, touching 'angle': 0.040000
    DEBUG (07:18): HR: 130, HR zone: non-touching: 1.040000, touching: 1.080000, non-touching 'angle': 0.040000, touching 'angle': 0.040000
    DEBUG (07:18): HR: 131, HR zone: non-touching: 1.080000, touching: 1.120000, non-touching 'angle': 0.040000, touching 'angle': 0.040000
    DEBUG (07:18): HR: 132, HR zone: non-touching: 1.120000, touching: 1.160000, non-touching 'angle': 0.040000, touching 'angle': 0.040000
    DEBUG (07:18): HR: 133, HR zone: non-touching: 1.160000, touching: 1.200000, non-touching 'angle': 0.040000, touching 'angle': 0.040000
    DEBUG (07:18): HR: 134, HR zone: non-touching: 1.200000, touching: 1.240000, non-touching 'angle': 0.040000, touching 'angle': 0.040000
    DEBUG (07:18): HR: 135, HR zone: non-touching: 1.240000, touching: 1.280000, non-touching 'angle': 0.040000, touching 'angle': 0.040000
    DEBUG (07:18): HR: 136, HR zone: non-touching: 1.280000, touching: 1.320000, non-touching 'angle': 0.040000, touching 'angle': 0.040000
    DEBUG (07:18): HR: 137, HR zone: non-touching: 1.320000, touching: 1.360000, non-touching 'angle': 0.040000, touching 'angle': 0.040000
    DEBUG (07:18): HR: 138, HR zone: non-touching: 1.360000, touching: 1.400000, non-touching 'angle': 0.040000, touching 'angle': 0.040000
    DEBUG (07:18): HR: 139, HR zone: non-touching: 1.400000, touching: 1.440000, non-touching 'angle': 0.040000, touching 'angle': 0.040000
    DEBUG (07:18): HR: 140, HR zone: non-touching: 1.440000, touching: 1.480000, non-touching 'angle': 0.040000, touching 'angle': 0.040000
    DEBUG (07:18): HR: 141, HR zone: non-touching: 1.480000, touching: 1.520000, non-touching 'angle': 0.040000, touching 'angle': 0.040000
    DEBUG (07:18): HR: 142, HR zone: non-touching: 1.520000, touching: 1.560000, non-touching 'angle': 0.040000, touching 'angle': 0.040000
    DEBUG (07:18): HR: 143, HR zone: non-touching: 1.560000, touching: 1.600000, non-touching 'angle': 0.040000, touching 'angle': 0.040000
    DEBUG (07:18): HR: 144, HR zone: non-touching: 1.600000, touching: 1.640000, non-touching 'angle': 0.040000, touching 'angle': 0.040000
    DEBUG (07:18): HR: 145, HR zone: non-touching: 1.640000, touching: 1.680000, non-touching 'angle': 0.040000, touching 'angle': 0.040000
    DEBUG (07:18): HR: 146, HR zone: non-touching: 1.680000, touching: 1.720000, non-touching 'angle': 0.040000, touching 'angle': 0.040000
    DEBUG (07:18): HR: 147, HR zone: non-touching: 1.720000, touching: 1.760000, non-touching 'angle': 0.040000, touching 'angle': 0.040000
    DEBUG (07:18): HR: 148, HR zone: non-touching: 1.760000, touching: 1.800000, non-touching 'angle': 0.040000, touching 'angle': 0.040000
    DEBUG (07:18): HR: 149, HR zone: non-touching: 1.800000, touching: 1.840000, non-touching 'angle': 0.040000, touching 'angle': 0.040000
    DEBUG (07:18): HR: 150, HR zone: non-touching: 1.840000, touching: 1.880000, non-touching 'angle': 0.040000, touching 'angle': 0.040000
    DEBUG (07:18): HR: 151, HR zone: non-touching: 1.880000, touching: 1.920000, non-touching 'angle': 0.040000, touching 'angle': 0.040000
    DEBUG (07:18): HR: 152, HR zone: non-touching: 1.920000, touching: 1.960000, non-touching 'angle': 0.040000, touching 'angle': 0.040000
    DEBUG (07:18): HR: 153, HR zone: non-touching: 1.960000, touching: 2.000000, non-touching 'angle': 0.040000, touching 'angle': 0.040000
    DEBUG (07:18): HR: 154, HR zone: non-touching: 2.000000, touching: 2.111111, non-touching 'angle': 0.040000, touching 'angle': 0.111111
    DEBUG (07:18): HR: 155, HR zone: non-touching: 2.111111, touching: 2.222222, non-touching 'angle': 0.111111, touching 'angle': 0.111111
    DEBUG (07:18): HR: 156, HR zone: non-touching: 2.222222, touching: 2.333333, non-touching 'angle': 0.111111, touching 'angle': 0.111111
    DEBUG (07:18): HR: 157, HR zone: non-touching: 2.333333, touching: 2.444444, non-touching 'angle': 0.111111, touching 'angle': 0.111111
    DEBUG (07:18): HR: 158, HR zone: non-touching: 2.444444, touching: 2.555556, non-touching 'angle': 0.111111, touching 'angle': 0.111111
    DEBUG (07:18): HR: 159, HR zone: non-touching: 2.555556, touching: 2.666667, non-touching 'angle': 0.111111, touching 'angle': 0.111111
    DEBUG (07:18): HR: 160, HR zone: non-touching: 2.666667, touching: 2.777778, non-touching 'angle': 0.111111, touching 'angle': 0.111111
    DEBUG (07:18): HR: 161, HR zone: non-touching: 2.777778, touching: 2.888889, non-touching 'angle': 0.111111, touching 'angle': 0.111111
    DEBUG (07:18): HR: 162, HR zone: non-touching: 2.888889, touching: 3.000000, non-touching 'angle': 0.111111, touching 'angle': 0.111111
    DEBUG (07:18): HR: 163, HR zone: non-touching: 3.000000, touching: 3.055556, non-touching 'angle': 0.111111, touching 'angle': 0.055556
    DEBUG (07:18): HR: 164, HR zone: non-touching: 3.055556, touching: 3.111111, non-touching 'angle': 0.055556, touching 'angle': 0.055556
    DEBUG (07:18): HR: 165, HR zone: non-touching: 3.111111, touching: 3.166667, non-touching 'angle': 0.055556, touching 'angle': 0.055556
    DEBUG (07:18): HR: 166, HR zone: non-touching: 3.166667, touching: 3.222222, non-touching 'angle': 0.055556, touching 'angle': 0.055556
    DEBUG (07:18): HR: 167, HR zone: non-touching: 3.222222, touching: 3.277778, non-touching 'angle': 0.055556, touching 'angle': 0.055555
    DEBUG (07:18): HR: 168, HR zone: non-touching: 3.277778, touching: 3.333333, non-touching 'angle': 0.055555, touching 'angle': 0.055556
    DEBUG (07:18): HR: 169, HR zone: non-touching: 3.333333, touching: 3.388889, non-touching 'angle': 0.055556, touching 'angle': 0.055556
    DEBUG (07:18): HR: 170, HR zone: non-touching: 3.388889, touching: 3.444444, non-touching 'angle': 0.055556, touching 'angle': 0.055556
    DEBUG (07:18): HR: 171, HR zone: non-touching: 3.444444, touching: 3.500000, non-touching 'angle': 0.055556, touching 'angle': 0.055556
    DEBUG (07:18): HR: 172, HR zone: non-touching: 3.500000, touching: 3.555556, non-touching 'angle': 0.055556, touching 'angle': 0.055556
    DEBUG (07:18): HR: 173, HR zone: non-touching: 3.555556, touching: 3.611111, non-touching 'angle': 0.055556, touching 'angle': 0.055556
    DEBUG (07:18): HR: 174, HR zone: non-touching: 3.611111, touching: 3.666667, non-touching 'angle': 0.055556, touching 'angle': 0.055556
    DEBUG (07:18): HR: 175, HR zone: non-touching: 3.666667, touching: 3.722222, non-touching 'angle': 0.055555, touching 'angle': 0.055556
    DEBUG (07:18): HR: 176, HR zone: non-touching: 3.722222, touching: 3.777778, non-touching 'angle': 0.055556, touching 'angle': 0.055555
    DEBUG (07:18): HR: 177, HR zone: non-touching: 3.777778, touching: 3.833333, non-touching 'angle': 0.055555, touching 'angle': 0.055556
    DEBUG (07:18): HR: 178, HR zone: non-touching: 3.833333, touching: 3.888889, non-touching 'angle': 0.055556, touching 'angle': 0.055556
    DEBUG (07:18): HR: 179, HR zone: non-touching: 3.888889, touching: 3.944444, non-touching 'angle': 0.055555, touching 'angle': 0.055556
    DEBUG (07:18): HR: 180, HR zone: non-touching: 3.944444, touching: 4.000000, non-touching 'angle': 0.055556, touching 'angle': 0.055556
    DEBUG (07:18): HR: 181, HR zone: non-touching: 4.000000, touching: 4.200000, non-touching 'angle': 0.055556, touching 'angle': 0.200000
    DEBUG (07:18): HR: 182, HR zone: non-touching: 4.200000, touching: 4.400000, non-touching 'angle': 0.200000, touching 'angle': 0.200000
    DEBUG (07:18): HR: 183, HR zone: non-touching: 4.400000, touching: 4.600000, non-touching 'angle': 0.200000, touching 'angle': 0.200000
    DEBUG (07:18): HR: 184, HR zone: non-touching: 4.600000, touching: 4.800000, non-touching 'angle': 0.200000, touching 'angle': 0.200000
    DEBUG (07:18): HR: 185, HR zone: non-touching: 4.800000, touching: 5.000000, non-touching 'angle': 0.200000, touching 'angle': 0.200000
    DEBUG (07:18): HR: 186, HR zone: non-touching: 5.000000, touching: 5.200000, non-touching 'angle': 0.200000, touching 'angle': 0.200000
    DEBUG (07:18): HR: 187, HR zone: non-touching: 5.200000, touching: 5.400000, non-touching 'angle': 0.200000, touching 'angle': 0.200000
    DEBUG (07:18): HR: 188, HR zone: non-touching: 5.400000, touching: 5.600000, non-touching 'angle': 0.200000, touching 'angle': 0.200000
    DEBUG (07:18): HR: 189, HR zone: non-touching: 5.600000, touching: 5.800000, non-touching 'angle': 0.200000, touching 'angle': 0.200000
    DEBUG (07:18): HR: 190, HR zone: non-touching: 5.800000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.200000
    DEBUG (07:18): HR: 191, HR zone: non-touching: 6.000000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 192, HR zone: non-touching: 6.200000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 193, HR zone: non-touching: 6.400000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 194, HR zone: non-touching: 6.600000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 195, HR zone: non-touching: 6.800000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 196, HR zone: non-touching: 7.000000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 197, HR zone: non-touching: 7.200000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 198, HR zone: non-touching: 7.400000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 199, HR zone: non-touching: 7.600000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 200, HR zone: non-touching: 7.800000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 201, HR zone: non-touching: 8.000000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 202, HR zone: non-touching: 8.200000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 203, HR zone: non-touching: 8.400000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 204, HR zone: non-touching: 8.600000, touching: 6.000000, non-touching 'angle': 0.200001, touching 'angle': 0.000000
    DEBUG (07:18): HR: 205, HR zone: non-touching: 8.800000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 206, HR zone: non-touching: 9.000000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 207, HR zone: non-touching: 9.200000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 208, HR zone: non-touching: 9.400000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 209, HR zone: non-touching: 9.600000, touching: 6.000000, non-touching 'angle': 0.200001, touching 'angle': 0.000000
    DEBUG (07:18): HR: 210, HR zone: non-touching: 9.800000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 211, HR zone: non-touching: 10.000000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 212, HR zone: non-touching: 10.200000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 213, HR zone: non-touching: 10.400000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 214, HR zone: non-touching: 10.600000, touching: 6.000000, non-touching 'angle': 0.200001, touching 'angle': 0.000000
    DEBUG (07:18): HR: 215, HR zone: non-touching: 10.800000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 216, HR zone: non-touching: 11.000000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 217, HR zone: non-touching: 11.200000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 218, HR zone: non-touching: 11.400000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 219, HR zone: non-touching: 11.600000, touching: 6.000000, non-touching 'angle': 0.200001, touching 'angle': 0.000000
    DEBUG (07:18): HR: 220, HR zone: non-touching: 11.800000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 221, HR zone: non-touching: 12.000000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 222, HR zone: non-touching: 12.200000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 223, HR zone: non-touching: 12.400000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 224, HR zone: non-touching: 12.600000, touching: 6.000000, non-touching 'angle': 0.200001, touching 'angle': 0.000000
    DEBUG (07:18): HR: 225, HR zone: non-touching: 12.800000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 226, HR zone: non-touching: 13.000000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 227, HR zone: non-touching: 13.200000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 228, HR zone: non-touching: 13.400000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 229, HR zone: non-touching: 13.600000, touching: 6.000000, non-touching 'angle': 0.200001, touching 'angle': 0.000000
    DEBUG (07:18): HR: 230, HR zone: non-touching: 13.800000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 231, HR zone: non-touching: 14.000000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 232, HR zone: non-touching: 14.200000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 233, HR zone: non-touching: 14.400000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 234, HR zone: non-touching: 14.600000, touching: 6.000000, non-touching 'angle': 0.200001, touching 'angle': 0.000000
    DEBUG (07:18): HR: 235, HR zone: non-touching: 14.800000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 236, HR zone: non-touching: 15.000000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 237, HR zone: non-touching: 15.200000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 238, HR zone: non-touching: 15.400000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 239, HR zone: non-touching: 15.600000, touching: 6.000000, non-touching 'angle': 0.200001, touching 'angle': 0.000000
    DEBUG (07:18): HR: 240, HR zone: non-touching: 15.800000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 241, HR zone: non-touching: 16.000000, touching: 6.000000, non-touching 'angle': 0.200000, touching 'angle': 0.000000
    DEBUG (07:18): HR: 242, HR zone: non-touching: 16.200001, touching: 6.000000, non-touching 'angle': 0.200001, touching 'angle': 0.000000
    DEBUG (07:18): HR: 243, HR zone: non-touching: 16.400000, touching: 6.000000, non-touching 'angle': 0.199999, touching 'angle': 0.000000
    DEBUG (07:18): HR: 244, HR zone: non-touching: 16.600000, touching: 6.000000, non-touching 'angle': 0.200001, touching 'angle': 0.000000
    DEBUG (07:18): HR: 245, HR zone: non-touching: 16.799999, touching: 6.000000, non-touching 'angle': 0.199999, touching 'angle': 0.000000
    DEBUG (07:18): HR: 246, HR zone: non-touching: 17.000000, touching: 6.000000, non-touching 'angle': 0.200001, touching 'angle': 0.000000
    DEBUG (07:18): HR: 247, HR zone: non-touching: 17.200001, touching: 6.000000, non-touching 'angle': 0.200001, touching 'angle': 0.000000
    DEBUG (07:18): HR: 248, HR zone: non-touching: 17.400000, touching: 6.000000, non-touching 'angle': 0.199999, touching 'angle': 0.000000
    DEBUG (07:18): HR: 249, HR zone: non-touching: 17.600000, touching: 6.000000, non-touching 'angle': 0.200001, touching 'angle': 0.000000
    DEBUG (07:18): HR: 250, HR zone: non-touching: 17.799999, touching: 6.000000, non-touching 'angle': 0.199999, touching 'angle': 0.000000
    DEBUG (07:18): HR: 251, HR zone: non-touching: 18.000000, touching: 6.000000, non-touching 'angle': 0.200001, touching 'angle': 0.000000
    DEBUG (07:18): HR: 252, HR zone: non-touching: 18.200001, touching: 6.000000, non-touching 'angle': 0.200001, touching 'angle': 0.000000
    DEBUG (07:18): HR: 253, HR zone: non-touching: 18.400000, touching: 6.000000, non-touching 'angle': 0.199999, touching 'angle': 0.000000
    DEBUG (07:18): HR: 254, HR zone: non-touching: 18.600000, touching: 6.000000, non-touching 'angle': 0.200001, touching 'angle': 0.000000
    DEBUG (07:18): HR: 255, HR zone: non-touching: 18.799999, touching: 6.000000, non-touching 'angle': 0.199999, touching 'angle': 0.000000
    PASS

    My data:

    Executing test compareHrZones...
    DEBUG (07:20): HR Zones: [100, 120, 140, 160, 175, 190]
    DEBUG (07:20): HR: 0, HR zone: non-touching: -0.422535, touching: 0.000000, non-touching 'angle': -0.422535, touching 'angle': 0.000000
    DEBUG (07:20): HR: 1, HR zone: non-touching: -0.408451, touching: 0.000000, non-touching 'angle': 0.014085, touching 'angle': 0.000000
    DEBUG (07:20): HR: 2, HR zone: non-touching: -0.394366, touching: 0.000000, non-touching 'angle': 0.014085, touching 'angle': 0.000000
    DEBUG (07:20): HR: 3, HR zone: non-touching: -0.380282, touching: 0.000000, non-touching 'angle': 0.014084, touching 'angle': 0.000000
    DEBUG (07:20): HR: 4, HR zone: non-touching: -0.366197, touching: 0.000000, non-touching 'angle': 0.014085, touching 'angle': 0.000000
    DEBUG (07:20): HR: 5, HR zone: non-touching: -0.352113, touching: 0.000000, non-touching 'angle': 0.014084, touching 'angle': 0.000000
    DEBUG (07:20): HR: 6, HR zone: non-touching: -0.338028, touching: 0.000000, non-touching 'angle': 0.014084, touching 'angle': 0.000000
    DEBUG (07:20): HR: 7, HR zone: non-touching: -0.323944, touching: 0.000000, non-touching 'angle': 0.014085, touching 'angle': 0.000000
    DEBUG (07:20): HR: 8, HR zone: non-touching: -0.309859, touching: 0.000000, non-touching 'angle': 0.014085, touching 'angle': 0.000000
    DEBUG (07:20): HR: 9, HR zone: non-touching: -0.295775, touching: 0.000000, non-touching 'angle': 0.014085, touching 'angle': 0.000000
    DEBUG (07:20): HR: 10, HR zone: non-touching: -0.281690, touching: 0.000000, non-touching 'angle': 0.014084, touching 'angle': 0.000000
    DEBUG (07:20): HR: 11, HR zone: non-touching: -0.267606, touching: 0.000000, non-touching 'angle': 0.014085, touching 'angle': 0.000000
    DEBUG (07:20): HR: 12, HR zone: non-touching: -0.253521, touching: 0.000000, non-touching 'angle': 0.014085, touching 'angle': 0.000000
    DEBUG (07:20): HR: 13, HR zone: non-touching: -0.239437, touching: 0.000000, non-touching 'angle': 0.014084, touching 'angle': 0.000000
    DEBUG (07:20): HR: 14, HR zone: non-touching: -0.225352, touching: 0.000000, non-touching 'angle': 0.014085, touching 'angle': 0.000000
    DEBUG (07:20): HR: 15, HR zone: non-touching: -0.211268, touching: 0.000000, non-touching 'angle': 0.014085, touching 'angle': 0.000000
    DEBUG (07:20): HR: 16, HR zone: non-touching: -0.197183, touching: 0.000000, non-touching 'angle': 0.014085, touching 'angle': 0.000000
    DEBUG (07:20): HR: 17, HR zone: non-touching: -0.183099, touching: 0.000000, non-touching 'angle': 0.014085, touching 'angle': 0.000000
    DEBUG (07:20): HR: 18, HR zone: non-touching: -0.169014, touching: 0.000000, non-touching 'angle': 0.014084, touching 'angle': 0.000000
    DEBUG (07:20): HR: 19, HR zone: non-touching: -0.154930, touching: 0.000000, non-touching 'angle': 0.014085, touching 'angle': 0.000000
    DEBUG (07:20): HR: 20, HR zone: non-touching: -0.140845, touching: 0.000000, non-touching 'angle': 0.014085, touching 'angle': 0.000000
    DEBUG (07:20): HR: 21, HR zone: non-touching: -0.126761, touching: 0.000000, non-touching 'angle': 0.014085, touching 'angle': 0.000000
    DEBUG (07:20): HR: 22, HR zone: non-touching: -0.112676, touching: 0.000000, non-touching 'angle': 0.014085, touching 'angle': 0.000000
    DEBUG (07:20): HR: 23, HR zone: non-touching: -0.098592, touching: 0.000000, non-touching 'angle': 0.014085, touching 'angle': 0.000000
    DEBUG (07:20): HR: 24, HR zone: non-touching: -0.084507, touching: 0.000000, non-touching 'angle': 0.014084, touching 'angle': 0.000000
    DEBUG (07:20): HR: 25, HR zone: non-touching: -0.070423, touching: 0.000000, non-touching 'angle': 0.014085, touching 'angle': 0.000000
    DEBUG (07:20): HR: 26, HR zone: non-touching: -0.056338, touching: 0.000000, non-touching 'angle': 0.014085, touching 'angle': 0.000000
    DEBUG (07:20): HR: 27, HR zone: non-touching: -0.042254, touching: 0.000000, non-touching 'angle': 0.014085, touching 'angle': 0.000000
    DEBUG (07:20): HR: 28, HR zone: non-touching: -0.028169, touching: 0.000000, non-touching 'angle': 0.014085, touching 'angle': 0.000000
    DEBUG (07:20): HR: 29, HR zone: non-touching: -0.014085, touching: 0.000000, non-touching 'angle': 0.014085, touching 'angle': 0.000000
    DEBUG (07:20): HR: 30, HR zone: non-touching: 0.000000, touching: 0.000000, non-touching 'angle': 0.014085, touching 'angle': 0.000000
    DEBUG (07:20): HR: 31, HR zone: non-touching: 0.014085, touching: 0.014286, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 32, HR zone: non-touching: 0.028169, touching: 0.028571, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 33, HR zone: non-touching: 0.042254, touching: 0.042857, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 34, HR zone: non-touching: 0.056338, touching: 0.057143, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 35, HR zone: non-touching: 0.070423, touching: 0.071429, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 36, HR zone: non-touching: 0.084507, touching: 0.085714, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 37, HR zone: non-touching: 0.098592, touching: 0.100000, non-touching 'angle': 0.014084, touching 'angle': 0.014286
    DEBUG (07:20): HR: 38, HR zone: non-touching: 0.112676, touching: 0.114286, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 39, HR zone: non-touching: 0.126761, touching: 0.128571, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 40, HR zone: non-touching: 0.140845, touching: 0.142857, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 41, HR zone: non-touching: 0.154930, touching: 0.157143, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 42, HR zone: non-touching: 0.169014, touching: 0.171429, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 43, HR zone: non-touching: 0.183099, touching: 0.185714, non-touching 'angle': 0.014084, touching 'angle': 0.014286
    DEBUG (07:20): HR: 44, HR zone: non-touching: 0.197183, touching: 0.200000, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 45, HR zone: non-touching: 0.211268, touching: 0.214286, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 46, HR zone: non-touching: 0.225352, touching: 0.228571, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 47, HR zone: non-touching: 0.239437, touching: 0.242857, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 48, HR zone: non-touching: 0.253521, touching: 0.257143, non-touching 'angle': 0.014084, touching 'angle': 0.014286
    DEBUG (07:20): HR: 49, HR zone: non-touching: 0.267606, touching: 0.271429, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 50, HR zone: non-touching: 0.281690, touching: 0.285714, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 51, HR zone: non-touching: 0.295775, touching: 0.300000, non-touching 'angle': 0.014084, touching 'angle': 0.014286
    DEBUG (07:20): HR: 52, HR zone: non-touching: 0.309859, touching: 0.314286, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 53, HR zone: non-touching: 0.323944, touching: 0.328571, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 54, HR zone: non-touching: 0.338028, touching: 0.342857, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 55, HR zone: non-touching: 0.352113, touching: 0.357143, non-touching 'angle': 0.014084, touching 'angle': 0.014286
    DEBUG (07:20): HR: 56, HR zone: non-touching: 0.366197, touching: 0.371429, non-touching 'angle': 0.014084, touching 'angle': 0.014286
    DEBUG (07:20): HR: 57, HR zone: non-touching: 0.380282, touching: 0.385714, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 58, HR zone: non-touching: 0.394366, touching: 0.400000, non-touching 'angle': 0.014084, touching 'angle': 0.014286
    DEBUG (07:20): HR: 59, HR zone: non-touching: 0.408451, touching: 0.414286, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 60, HR zone: non-touching: 0.422535, touching: 0.428571, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 61, HR zone: non-touching: 0.436620, touching: 0.442857, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 62, HR zone: non-touching: 0.450704, touching: 0.457143, non-touching 'angle': 0.014084, touching 'angle': 0.014286
    DEBUG (07:20): HR: 63, HR zone: non-touching: 0.464789, touching: 0.471429, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 64, HR zone: non-touching: 0.478873, touching: 0.485714, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 65, HR zone: non-touching: 0.492958, touching: 0.500000, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 66, HR zone: non-touching: 0.507042, touching: 0.514286, non-touching 'angle': 0.014084, touching 'angle': 0.014286
    DEBUG (07:20): HR: 67, HR zone: non-touching: 0.521127, touching: 0.528571, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 68, HR zone: non-touching: 0.535211, touching: 0.542857, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 69, HR zone: non-touching: 0.549296, touching: 0.557143, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 70, HR zone: non-touching: 0.563380, touching: 0.571429, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 71, HR zone: non-touching: 0.577465, touching: 0.585714, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 72, HR zone: non-touching: 0.591549, touching: 0.600000, non-touching 'angle': 0.014084, touching 'angle': 0.014286
    DEBUG (07:20): HR: 73, HR zone: non-touching: 0.605634, touching: 0.614286, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 74, HR zone: non-touching: 0.619718, touching: 0.628571, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 75, HR zone: non-touching: 0.633803, touching: 0.642857, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 76, HR zone: non-touching: 0.647887, touching: 0.657143, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 77, HR zone: non-touching: 0.661972, touching: 0.671429, non-touching 'angle': 0.014084, touching 'angle': 0.014286
    DEBUG (07:20): HR: 78, HR zone: non-touching: 0.676056, touching: 0.685714, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 79, HR zone: non-touching: 0.690141, touching: 0.700000, non-touching 'angle': 0.014084, touching 'angle': 0.014286
    DEBUG (07:20): HR: 80, HR zone: non-touching: 0.704225, touching: 0.714286, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 81, HR zone: non-touching: 0.718310, touching: 0.728571, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 82, HR zone: non-touching: 0.732394, touching: 0.742857, non-touching 'angle': 0.014084, touching 'angle': 0.014286
    DEBUG (07:20): HR: 83, HR zone: non-touching: 0.746479, touching: 0.757143, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 84, HR zone: non-touching: 0.760563, touching: 0.771429, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 85, HR zone: non-touching: 0.774648, touching: 0.785714, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 86, HR zone: non-touching: 0.788732, touching: 0.800000, non-touching 'angle': 0.014084, touching 'angle': 0.014286
    DEBUG (07:20): HR: 87, HR zone: non-touching: 0.802817, touching: 0.814286, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 88, HR zone: non-touching: 0.816901, touching: 0.828571, non-touching 'angle': 0.014084, touching 'angle': 0.014286
    DEBUG (07:20): HR: 89, HR zone: non-touching: 0.830986, touching: 0.842857, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 90, HR zone: non-touching: 0.845070, touching: 0.857143, non-touching 'angle': 0.014084, touching 'angle': 0.014286
    DEBUG (07:20): HR: 91, HR zone: non-touching: 0.859155, touching: 0.871429, non-touching 'angle': 0.014084, touching 'angle': 0.014286
    DEBUG (07:20): HR: 92, HR zone: non-touching: 0.873239, touching: 0.885714, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 93, HR zone: non-touching: 0.887324, touching: 0.900000, non-touching 'angle': 0.014084, touching 'angle': 0.014286
    DEBUG (07:20): HR: 94, HR zone: non-touching: 0.901408, touching: 0.914286, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 95, HR zone: non-touching: 0.915493, touching: 0.928571, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 96, HR zone: non-touching: 0.929577, touching: 0.942857, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 97, HR zone: non-touching: 0.943662, touching: 0.957143, non-touching 'angle': 0.014084, touching 'angle': 0.014286
    DEBUG (07:20): HR: 98, HR zone: non-touching: 0.957747, touching: 0.971429, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 99, HR zone: non-touching: 0.971831, touching: 0.985714, non-touching 'angle': 0.014084, touching 'angle': 0.014286
    DEBUG (07:20): HR: 100, HR zone: non-touching: 0.985916, touching: 1.000000, non-touching 'angle': 0.014085, touching 'angle': 0.014286
    DEBUG (07:20): HR: 101, HR zone: non-touching: 1.000000, touching: 1.050000, non-touching 'angle': 0.014084, touching 'angle': 0.050000
    DEBUG (07:20): HR: 102, HR zone: non-touching: 1.050000, touching: 1.100000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 103, HR zone: non-touching: 1.100000, touching: 1.150000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 104, HR zone: non-touching: 1.150000, touching: 1.200000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 105, HR zone: non-touching: 1.200000, touching: 1.250000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 106, HR zone: non-touching: 1.250000, touching: 1.300000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 107, HR zone: non-touching: 1.300000, touching: 1.350000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 108, HR zone: non-touching: 1.350000, touching: 1.400000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 109, HR zone: non-touching: 1.400000, touching: 1.450000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 110, HR zone: non-touching: 1.450000, touching: 1.500000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 111, HR zone: non-touching: 1.500000, touching: 1.550000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 112, HR zone: non-touching: 1.550000, touching: 1.600000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 113, HR zone: non-touching: 1.600000, touching: 1.650000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 114, HR zone: non-touching: 1.650000, touching: 1.700000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 115, HR zone: non-touching: 1.700000, touching: 1.750000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 116, HR zone: non-touching: 1.750000, touching: 1.800000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 117, HR zone: non-touching: 1.800000, touching: 1.850000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 118, HR zone: non-touching: 1.850000, touching: 1.900000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 119, HR zone: non-touching: 1.900000, touching: 1.950000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 120, HR zone: non-touching: 1.950000, touching: 2.000000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 121, HR zone: non-touching: 2.000000, touching: 2.050000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 122, HR zone: non-touching: 2.050000, touching: 2.100000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 123, HR zone: non-touching: 2.100000, touching: 2.150000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 124, HR zone: non-touching: 2.150000, touching: 2.200000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 125, HR zone: non-touching: 2.200000, touching: 2.250000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 126, HR zone: non-touching: 2.250000, touching: 2.300000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 127, HR zone: non-touching: 2.300000, touching: 2.350000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 128, HR zone: non-touching: 2.350000, touching: 2.400000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 129, HR zone: non-touching: 2.400000, touching: 2.450000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 130, HR zone: non-touching: 2.450000, touching: 2.500000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 131, HR zone: non-touching: 2.500000, touching: 2.550000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 132, HR zone: non-touching: 2.550000, touching: 2.600000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 133, HR zone: non-touching: 2.600000, touching: 2.650000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 134, HR zone: non-touching: 2.650000, touching: 2.700000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 135, HR zone: non-touching: 2.700000, touching: 2.750000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 136, HR zone: non-touching: 2.750000, touching: 2.800000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 137, HR zone: non-touching: 2.800000, touching: 2.850000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 138, HR zone: non-touching: 2.850000, touching: 2.900000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 139, HR zone: non-touching: 2.900000, touching: 2.950000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 140, HR zone: non-touching: 2.950000, touching: 3.000000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 141, HR zone: non-touching: 3.000000, touching: 3.050000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 142, HR zone: non-touching: 3.050000, touching: 3.100000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 143, HR zone: non-touching: 3.100000, touching: 3.150000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 144, HR zone: non-touching: 3.150000, touching: 3.200000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 145, HR zone: non-touching: 3.200000, touching: 3.250000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 146, HR zone: non-touching: 3.250000, touching: 3.300000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 147, HR zone: non-touching: 3.300000, touching: 3.350000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 148, HR zone: non-touching: 3.350000, touching: 3.400000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 149, HR zone: non-touching: 3.400000, touching: 3.450000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 150, HR zone: non-touching: 3.450000, touching: 3.500000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 151, HR zone: non-touching: 3.500000, touching: 3.550000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 152, HR zone: non-touching: 3.550000, touching: 3.600000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 153, HR zone: non-touching: 3.600000, touching: 3.650000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 154, HR zone: non-touching: 3.650000, touching: 3.700000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 155, HR zone: non-touching: 3.700000, touching: 3.750000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 156, HR zone: non-touching: 3.750000, touching: 3.800000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 157, HR zone: non-touching: 3.800000, touching: 3.850000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 158, HR zone: non-touching: 3.850000, touching: 3.900000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 159, HR zone: non-touching: 3.900000, touching: 3.950000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 160, HR zone: non-touching: 3.950000, touching: 4.000000, non-touching 'angle': 0.050000, touching 'angle': 0.050000
    DEBUG (07:20): HR: 161, HR zone: non-touching: 4.000000, touching: 4.066667, non-touching 'angle': 0.050000, touching 'angle': 0.066667
    DEBUG (07:20): HR: 162, HR zone: non-touching: 4.066667, touching: 4.133333, non-touching 'angle': 0.066667, touching 'angle': 0.066667
    DEBUG (07:20): HR: 163, HR zone: non-touching: 4.133333, touching: 4.200000, non-touching 'angle': 0.066667, touching 'angle': 0.066667
    DEBUG (07:20): HR: 164, HR zone: non-touching: 4.200000, touching: 4.266667, non-touching 'angle': 0.066667, touching 'angle': 0.066667
    DEBUG (07:20): HR: 165, HR zone: non-touching: 4.266666, touching: 4.333333, non-touching 'angle': 0.066667, touching 'angle': 0.066667
    DEBUG (07:20): HR: 166, HR zone: non-touching: 4.333333, touching: 4.400000, non-touching 'angle': 0.066667, touching 'angle': 0.066667
    DEBUG (07:20): HR: 167, HR zone: non-touching: 4.400000, touching: 4.466667, non-touching 'angle': 0.066667, touching 'angle': 0.066667
    DEBUG (07:20): HR: 168, HR zone: non-touching: 4.466667, touching: 4.533333, non-touching 'angle': 0.066667, touching 'angle': 0.066667
    DEBUG (07:20): HR: 169, HR zone: non-touching: 4.533333, touching: 4.600000, non-touching 'angle': 0.066667, touching 'angle': 0.066667
    DEBUG (07:20): HR: 170, HR zone: non-touching: 4.600000, touching: 4.666667, non-touching 'angle': 0.066667, touching 'angle': 0.066667
    DEBUG (07:20): HR: 171, HR zone: non-touching: 4.666667, touching: 4.733334, non-touching 'angle': 0.066667, touching 'angle': 0.066667
    DEBUG (07:20): HR: 172, HR zone: non-touching: 4.733334, touching: 4.800000, non-touching 'angle': 0.066667, touching 'angle': 0.066667
    DEBUG (07:20): HR: 173, HR zone: non-touching: 4.800000, touching: 4.866667, non-touching 'angle': 0.066667, touching 'angle': 0.066667
    DEBUG (07:20): HR: 174, HR zone: non-touching: 4.866667, touching: 4.933333, non-touching 'angle': 0.066667, touching 'angle': 0.066667
    DEBUG (07:20): HR: 175, HR zone: non-touching: 4.933333, touching: 5.000000, non-touching 'angle': 0.066667, touching 'angle': 0.066667
    DEBUG (07:20): HR: 176, HR zone: non-touching: 5.000000, touching: 5.066667, non-touching 'angle': 0.066667, touching 'angle': 0.066667
    DEBUG (07:20): HR: 177, HR zone: non-touching: 5.066667, touching: 5.133333, non-touching 'angle': 0.066667, touching 'angle': 0.066667
    DEBUG (07:20): HR: 178, HR zone: non-touching: 5.133333, touching: 5.200000, non-touching 'angle': 0.066667, touching 'angle': 0.066667
    DEBUG (07:20): HR: 179, HR zone: non-touching: 5.200000, touching: 5.266667, non-touching 'angle': 0.066667, touching 'angle': 0.066667
    DEBUG (07:20): HR: 180, HR zone: non-touching: 5.266666, touching: 5.333333, non-touching 'angle': 0.066667, touching 'angle': 0.066667
    DEBUG (07:20): HR: 181, HR zone: non-touching: 5.333333, touching: 5.400000, non-touching 'angle': 0.066667, touching 'angle': 0.066667
    DEBUG (07:20): HR: 182, HR zone: non-touching: 5.400000, touching: 5.466667, non-touching 'angle': 0.066667, touching 'angle': 0.066667
    DEBUG (07:20): HR: 183, HR zone: non-touching: 5.466667, touching: 5.533333, non-touching 'angle': 0.066667, touching 'angle': 0.066667
    DEBUG (07:20): HR: 184, HR zone: non-touching: 5.533333, touching: 5.600000, non-touching 'angle': 0.066667, touching 'angle': 0.066667
    DEBUG (07:20): HR: 185, HR zone: non-touching: 5.600000, touching: 5.666667, non-touching 'angle': 0.066667, touching 'angle': 0.066667
    DEBUG (07:20): HR: 186, HR zone: non-touching: 5.666667, touching: 5.733334, non-touching 'angle': 0.066667, touching 'angle': 0.066667
    DEBUG (07:20): HR: 187, HR zone: non-touching: 5.733334, touching: 5.800000, non-touching 'angle': 0.066667, touching 'angle': 0.066667
    DEBUG (07:20): HR: 188, HR zone: non-touching: 5.800000, touching: 5.866667, non-touching 'angle': 0.066667, touching 'angle': 0.066667
    DEBUG (07:20): HR: 189, HR zone: non-touching: 5.866667, touching: 5.933333, non-touching 'angle': 0.066667, touching 'angle': 0.066667
    DEBUG (07:20): HR: 190, HR zone: non-touching: 5.933333, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.066667
    DEBUG (07:20): HR: 191, HR zone: non-touching: 6.000000, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 192, HR zone: non-touching: 6.066667, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 193, HR zone: non-touching: 6.133333, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 194, HR zone: non-touching: 6.200000, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 195, HR zone: non-touching: 6.266666, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 196, HR zone: non-touching: 6.333333, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 197, HR zone: non-touching: 6.400000, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 198, HR zone: non-touching: 6.466667, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 199, HR zone: non-touching: 6.533333, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 200, HR zone: non-touching: 6.600000, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 201, HR zone: non-touching: 6.666667, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 202, HR zone: non-touching: 6.733333, touching: 6.000000, non-touching 'angle': 0.066666, touching 'angle': 0.000000
    DEBUG (07:20): HR: 203, HR zone: non-touching: 6.800000, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 204, HR zone: non-touching: 6.866667, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 205, HR zone: non-touching: 6.933333, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 206, HR zone: non-touching: 7.000000, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 207, HR zone: non-touching: 7.066667, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 208, HR zone: non-touching: 7.133333, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 209, HR zone: non-touching: 7.200000, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 210, HR zone: non-touching: 7.266666, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 211, HR zone: non-touching: 7.333333, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 212, HR zone: non-touching: 7.400000, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 213, HR zone: non-touching: 7.466667, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 214, HR zone: non-touching: 7.533333, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 215, HR zone: non-touching: 7.600000, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 216, HR zone: non-touching: 7.666667, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 217, HR zone: non-touching: 7.733334, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 218, HR zone: non-touching: 7.800000, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 219, HR zone: non-touching: 7.866667, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 220, HR zone: non-touching: 7.933333, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 221, HR zone: non-touching: 8.000000, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 222, HR zone: non-touching: 8.066667, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 223, HR zone: non-touching: 8.133333, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 224, HR zone: non-touching: 8.200000, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 225, HR zone: non-touching: 8.266666, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 226, HR zone: non-touching: 8.333334, touching: 6.000000, non-touching 'angle': 0.066668, touching 'angle': 0.000000
    DEBUG (07:20): HR: 227, HR zone: non-touching: 8.400000, touching: 6.000000, non-touching 'angle': 0.066666, touching 'angle': 0.000000
    DEBUG (07:20): HR: 228, HR zone: non-touching: 8.466666, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 229, HR zone: non-touching: 8.533334, touching: 6.000000, non-touching 'angle': 0.066668, touching 'angle': 0.000000
    DEBUG (07:20): HR: 230, HR zone: non-touching: 8.600000, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 231, HR zone: non-touching: 8.666666, touching: 6.000000, non-touching 'angle': 0.066666, touching 'angle': 0.000000
    DEBUG (07:20): HR: 232, HR zone: non-touching: 8.733334, touching: 6.000000, non-touching 'angle': 0.066668, touching 'angle': 0.000000
    DEBUG (07:20): HR: 233, HR zone: non-touching: 8.800000, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 234, HR zone: non-touching: 8.866667, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 235, HR zone: non-touching: 8.933333, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 236, HR zone: non-touching: 9.000000, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 237, HR zone: non-touching: 9.066667, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 238, HR zone: non-touching: 9.133333, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 239, HR zone: non-touching: 9.200000, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 240, HR zone: non-touching: 9.266666, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 241, HR zone: non-touching: 9.333334, touching: 6.000000, non-touching 'angle': 0.066668, touching 'angle': 0.000000
    DEBUG (07:20): HR: 242, HR zone: non-touching: 9.400000, touching: 6.000000, non-touching 'angle': 0.066666, touching 'angle': 0.000000
    DEBUG (07:20): HR: 243, HR zone: non-touching: 9.466667, touching: 6.000000, non-touching 'angle': 0.066668, touching 'angle': 0.000000
    DEBUG (07:20): HR: 244, HR zone: non-touching: 9.533333, touching: 6.000000, non-touching 'angle': 0.066666, touching 'angle': 0.000000
    DEBUG (07:20): HR: 245, HR zone: non-touching: 9.600000, touching: 6.000000, non-touching 'angle': 0.066668, touching 'angle': 0.000000
    DEBUG (07:20): HR: 246, HR zone: non-touching: 9.666666, touching: 6.000000, non-touching 'angle': 0.066666, touching 'angle': 0.000000
    DEBUG (07:20): HR: 247, HR zone: non-touching: 9.733334, touching: 6.000000, non-touching 'angle': 0.066668, touching 'angle': 0.000000
    DEBUG (07:20): HR: 248, HR zone: non-touching: 9.800000, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 249, HR zone: non-touching: 9.866667, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 250, HR zone: non-touching: 9.933333, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 251, HR zone: non-touching: 10.000000, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 252, HR zone: non-touching: 10.066667, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 253, HR zone: non-touching: 10.133333, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 254, HR zone: non-touching: 10.200000, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000
    DEBUG (07:20): HR: 255, HR zone: non-touching: 10.266666, touching: 6.000000, non-touching 'angle': 0.066667, touching 'angle': 0.000000

    You will see that our algorithms do *not* produce identical results. Yeah maybe they will look similar after rounding to 1 decimal place, and maybe none of this matters at all.

    Actually, definitely none of this matters at all.

    (also, if you're going to log the "angle" or slope, you should be logging it for both algorithms, not just mine, which I've done in the above logs.)

  • As far as the "bends"  thing goes, yeah, your algorithm probably has the same number of bends as mine (0 or 1 per border). Like I said, it's possible that the slope of the line that connects the two zones (which don't touch) is always the same as either the slope of the zone on the left or the zone on the right.

    I just didn't bother to try to prove or disprove it.

    And again, none of this matters.

    But thanks for following me down this rabbit hole! Or do I have that the other way around?

  • I'm not talking theoretically. I ran this already. I can tell you that even now, with your latest version that uses absoluteMax = heartRateZones[5] all the integer inputs between [30, 190]  computeHrZoneTouching and computeHrZoneFlowState are equal 6 digits after the dot! There are a few that differ later (but it doesn't print it so I can't tell what's the difference, but it's obviously less than 0.000001

    You have a bug in your code that prints the lines. There's 1 line shift between the values of either the touching or non-touching. See this:

    (:test)
    function compareHrZones(logger as Logger) as Boolean {
        var prev = 0;
        for (var hr = 0; hr < 256; hr++) {
            var old = computeHrZoneFlocsy(hr);
            var touching = computeHrZoneTouching(hr);
            var flowState = computeHrZoneFlowState(hr);
            logger.debug("HR: " + hr + ", HR zone: old: " + old + ", touching: " + touching + ", FlowState: " + flowState + ", angle: " + (flowState - prev) + ", equal: " + (touching == flowState));
            prev = flowState;
        }
        return true;
    }
    

  • I can tell you that even now, with your latest version that uses absoluteMax = heartRateZones[5] all the integer inputs between [30, 190]  computeHrZoneTouching and computeHrZoneFlowState are equal 6 digits after the dot! There are a few that differ later (but it doesn't print it so I can't tell what's the difference, but it's obviously less than 0.000001

    I ran your original code (in OP) and got different values

    > You have a bug in your code that prints the lines.

    lmao I used a modified version of your code.

    > I'm not talking theoretically

    neither am I. I literally manually "ran" both algorithms on the value of 140 with my favorite partial set of test zones before this thread even existed, and I got the same answer with the code that we have now (adjusted for the fact that the test zones are shifted over by 1)

    DEBUG (07:20): HR: 140, HR zone: non-touching: 2.950000, touching: 3.000000, non-touching 'angle': 0.050000, touching 'angle': 0.050000

    Remember when I predicted that 140 would produce different values for both of our algorithms, with zones that look like ..., 120, 140, 160, ...? Yeah, it works the same when I actually run the code, too.

    If I run the code that you originally posted with ZERO modifications, it shows that our algorithms are different and produce different results. But I really can't understand why you even need to run the code to see that, it should be obvious (as I've been saying for HOURS).

    Go ahead, run this code (by that I mean YOUR CODE):

    https://forums.garmin.com/developer/connect-iq/f/discussion/406008/fractional-decimal-heart-rate-zone-calculation/1909255#1909255

    I just ran it, after only adding the following lines at the global scope:

    const INVALID_ZONE = -1;
    const INVALID_FRACTIONAL_ZONE = -1;

    Here's my output:

    Executing test compareHrZones...
    DEBUG (07:38): HR: 0, HR zone: old: -0.303030, new: -0.306122, angle: -0.306122
    DEBUG (07:38): HR: 1, HR zone: old: -0.292929, new: -0.295918, angle: 0.010204
    DEBUG (07:38): HR: 2, HR zone: old: -0.282828, new: -0.285714, angle: 0.010204
    DEBUG (07:38): HR: 3, HR zone: old: -0.272727, new: -0.275510, angle: 0.010204
    DEBUG (07:38): HR: 4, HR zone: old: -0.262626, new: -0.265306, angle: 0.010204
    DEBUG (07:38): HR: 5, HR zone: old: -0.252525, new: -0.255102, angle: 0.010204
    DEBUG (07:38): HR: 6, HR zone: old: -0.242424, new: -0.244898, angle: 0.010204
    DEBUG (07:38): HR: 7, HR zone: old: -0.232323, new: -0.234694, angle: 0.010204
    DEBUG (07:38): HR: 8, HR zone: old: -0.222222, new: -0.224490, angle: 0.010204
    DEBUG (07:38): HR: 9, HR zone: old: -0.212121, new: -0.214286, angle: 0.010204
    DEBUG (07:38): HR: 10, HR zone: old: -0.202020, new: -0.204082, angle: 0.010204
    DEBUG (07:38): HR: 11, HR zone: old: -0.191919, new: -0.193878, angle: 0.010204
    DEBUG (07:38): HR: 12, HR zone: old: -0.181818, new: -0.183673, angle: 0.010204
    DEBUG (07:38): HR: 13, HR zone: old: -0.171717, new: -0.173469, angle: 0.010204
    DEBUG (07:38): HR: 14, HR zone: old: -0.161616, new: -0.163265, angle: 0.010204
    DEBUG (07:38): HR: 15, HR zone: old: -0.151515, new: -0.153061, angle: 0.010204
    DEBUG (07:38): HR: 16, HR zone: old: -0.141414, new: -0.142857, angle: 0.010204
    DEBUG (07:38): HR: 17, HR zone: old: -0.131313, new: -0.132653, angle: 0.010204
    DEBUG (07:38): HR: 18, HR zone: old: -0.121212, new: -0.122449, angle: 0.010204
    DEBUG (07:38): HR: 19, HR zone: old: -0.111111, new: -0.112245, angle: 0.010204
    DEBUG (07:38): HR: 20, HR zone: old: -0.101010, new: -0.102041, angle: 0.010204
    DEBUG (07:38): HR: 21, HR zone: old: -0.090909, new: -0.091837, angle: 0.010204
    DEBUG (07:38): HR: 22, HR zone: old: -0.080808, new: -0.081633, angle: 0.010204
    DEBUG (07:38): HR: 23, HR zone: old: -0.070707, new: -0.071429, angle: 0.010204
    DEBUG (07:38): HR: 24, HR zone: old: -0.060606, new: -0.061224, angle: 0.010204
    DEBUG (07:38): HR: 25, HR zone: old: -0.050505, new: -0.051020, angle: 0.010204
    DEBUG (07:38): HR: 26, HR zone: old: -0.040404, new: -0.040816, angle: 0.010204
    DEBUG (07:38): HR: 27, HR zone: old: -0.030303, new: -0.030612, angle: 0.010204
    DEBUG (07:38): HR: 28, HR zone: old: -0.020202, new: -0.020408, angle: 0.010204
    DEBUG (07:38): HR: 29, HR zone: old: -0.010101, new: -0.010204, angle: 0.010204
    DEBUG (07:38): HR: 30, HR zone: old: 0.000000, new: 0.000000, angle: 0.010204
    DEBUG (07:38): HR: 31, HR zone: old: 0.010101, new: 0.010204, angle: 0.010204
    DEBUG (07:38): HR: 32, HR zone: old: 0.020202, new: 0.020408, angle: 0.010204
    DEBUG (07:38): HR: 33, HR zone: old: 0.030303, new: 0.030612, angle: 0.010204
    DEBUG (07:38): HR: 34, HR zone: old: 0.040404, new: 0.040816, angle: 0.010204
    DEBUG (07:38): HR: 35, HR zone: old: 0.050505, new: 0.051020, angle: 0.010204
    DEBUG (07:38): HR: 36, HR zone: old: 0.060606, new: 0.061224, angle: 0.010204
    DEBUG (07:38): HR: 37, HR zone: old: 0.070707, new: 0.071429, angle: 0.010204
    DEBUG (07:38): HR: 38, HR zone: old: 0.080808, new: 0.081633, angle: 0.010204
    DEBUG (07:38): HR: 39, HR zone: old: 0.090909, new: 0.091837, angle: 0.010204
    DEBUG (07:38): HR: 40, HR zone: old: 0.101010, new: 0.102041, angle: 0.010204
    DEBUG (07:38): HR: 41, HR zone: old: 0.111111, new: 0.112245, angle: 0.010204
    DEBUG (07:38): HR: 42, HR zone: old: 0.121212, new: 0.122449, angle: 0.010204
    DEBUG (07:38): HR: 43, HR zone: old: 0.131313, new: 0.132653, angle: 0.010204
    DEBUG (07:38): HR: 44, HR zone: old: 0.141414, new: 0.142857, angle: 0.010204
    DEBUG (07:38): HR: 45, HR zone: old: 0.151515, new: 0.153061, angle: 0.010204
    DEBUG (07:38): HR: 46, HR zone: old: 0.161616, new: 0.163265, angle: 0.010204
    DEBUG (07:38): HR: 47, HR zone: old: 0.171717, new: 0.173469, angle: 0.010204
    DEBUG (07:38): HR: 48, HR zone: old: 0.181818, new: 0.183673, angle: 0.010204
    DEBUG (07:38): HR: 49, HR zone: old: 0.191919, new: 0.193878, angle: 0.010204
    DEBUG (07:38): HR: 50, HR zone: old: 0.202020, new: 0.204082, angle: 0.010204
    DEBUG (07:38): HR: 51, HR zone: old: 0.212121, new: 0.214286, angle: 0.010204
    DEBUG (07:38): HR: 52, HR zone: old: 0.222222, new: 0.224490, angle: 0.010204
    DEBUG (07:38): HR: 53, HR zone: old: 0.232323, new: 0.234694, angle: 0.010204
    DEBUG (07:38): HR: 54, HR zone: old: 0.242424, new: 0.244898, angle: 0.010204
    DEBUG (07:38): HR: 55, HR zone: old: 0.252525, new: 0.255102, angle: 0.010204
    DEBUG (07:38): HR: 56, HR zone: old: 0.262626, new: 0.265306, angle: 0.010204
    DEBUG (07:38): HR: 57, HR zone: old: 0.272727, new: 0.275510, angle: 0.010204
    DEBUG (07:38): HR: 58, HR zone: old: 0.282828, new: 0.285714, angle: 0.010204
    DEBUG (07:38): HR: 59, HR zone: old: 0.292929, new: 0.295918, angle: 0.010204
    DEBUG (07:38): HR: 60, HR zone: old: 0.303030, new: 0.306122, angle: 0.010204
    DEBUG (07:38): HR: 61, HR zone: old: 0.313131, new: 0.316327, angle: 0.010204
    DEBUG (07:38): HR: 62, HR zone: old: 0.323232, new: 0.326531, angle: 0.010204
    DEBUG (07:38): HR: 63, HR zone: old: 0.333333, new: 0.336735, angle: 0.010204
    DEBUG (07:38): HR: 64, HR zone: old: 0.343434, new: 0.346939, angle: 0.010204
    DEBUG (07:38): HR: 65, HR zone: old: 0.353535, new: 0.357143, angle: 0.010204
    DEBUG (07:38): HR: 66, HR zone: old: 0.363636, new: 0.367347, angle: 0.010204
    DEBUG (07:38): HR: 67, HR zone: old: 0.373737, new: 0.377551, angle: 0.010204
    DEBUG (07:38): HR: 68, HR zone: old: 0.383838, new: 0.387755, angle: 0.010204
    DEBUG (07:38): HR: 69, HR zone: old: 0.393939, new: 0.397959, angle: 0.010204
    DEBUG (07:38): HR: 70, HR zone: old: 0.404040, new: 0.408163, angle: 0.010204
    DEBUG (07:38): HR: 71, HR zone: old: 0.414141, new: 0.418367, angle: 0.010204
    DEBUG (07:38): HR: 72, HR zone: old: 0.424242, new: 0.428571, angle: 0.010204
    DEBUG (07:38): HR: 73, HR zone: old: 0.434343, new: 0.438776, angle: 0.010204
    DEBUG (07:38): HR: 74, HR zone: old: 0.444444, new: 0.448980, angle: 0.010204
    DEBUG (07:38): HR: 75, HR zone: old: 0.454545, new: 0.459184, angle: 0.010204
    DEBUG (07:38): HR: 76, HR zone: old: 0.464646, new: 0.469388, angle: 0.010204
    DEBUG (07:38): HR: 77, HR zone: old: 0.474747, new: 0.479592, angle: 0.010204
    DEBUG (07:38): HR: 78, HR zone: old: 0.484848, new: 0.489796, angle: 0.010204
    DEBUG (07:38): HR: 79, HR zone: old: 0.494949, new: 0.500000, angle: 0.010204
    DEBUG (07:38): HR: 80, HR zone: old: 0.505050, new: 0.510204, angle: 0.010204
    DEBUG (07:38): HR: 81, HR zone: old: 0.515152, new: 0.520408, angle: 0.010204
    DEBUG (07:38): HR: 82, HR zone: old: 0.525253, new: 0.530612, angle: 0.010204
    DEBUG (07:38): HR: 83, HR zone: old: 0.535354, new: 0.540816, angle: 0.010204
    DEBUG (07:38): HR: 84, HR zone: old: 0.545455, new: 0.551020, angle: 0.010204
    DEBUG (07:38): HR: 85, HR zone: old: 0.555556, new: 0.561224, angle: 0.010204
    DEBUG (07:38): HR: 86, HR zone: old: 0.565657, new: 0.571429, angle: 0.010204
    DEBUG (07:38): HR: 87, HR zone: old: 0.575758, new: 0.581633, angle: 0.010204
    DEBUG (07:38): HR: 88, HR zone: old: 0.585859, new: 0.591837, angle: 0.010204
    DEBUG (07:38): HR: 89, HR zone: old: 0.595960, new: 0.602041, angle: 0.010204
    DEBUG (07:38): HR: 90, HR zone: old: 0.606061, new: 0.612245, angle: 0.010204
    DEBUG (07:38): HR: 91, HR zone: old: 0.616162, new: 0.622449, angle: 0.010204
    DEBUG (07:38): HR: 92, HR zone: old: 0.626263, new: 0.632653, angle: 0.010204
    DEBUG (07:38): HR: 93, HR zone: old: 0.636364, new: 0.642857, angle: 0.010204
    DEBUG (07:38): HR: 94, HR zone: old: 0.646465, new: 0.653061, angle: 0.010204
    DEBUG (07:38): HR: 95, HR zone: old: 0.656566, new: 0.663265, angle: 0.010204
    DEBUG (07:38): HR: 96, HR zone: old: 0.666667, new: 0.673469, angle: 0.010204
    DEBUG (07:38): HR: 97, HR zone: old: 0.676768, new: 0.683674, angle: 0.010204
    DEBUG (07:38): HR: 98, HR zone: old: 0.686869, new: 0.693878, angle: 0.010204
    DEBUG (07:38): HR: 99, HR zone: old: 0.696970, new: 0.704082, angle: 0.010204
    DEBUG (07:38): HR: 100, HR zone: old: 0.707071, new: 0.714286, angle: 0.010204
    DEBUG (07:38): HR: 101, HR zone: old: 0.717172, new: 0.724490, angle: 0.010204
    DEBUG (07:38): HR: 102, HR zone: old: 0.727273, new: 0.734694, angle: 0.010204
    DEBUG (07:38): HR: 103, HR zone: old: 0.737374, new: 0.744898, angle: 0.010204
    DEBUG (07:38): HR: 104, HR zone: old: 0.747475, new: 0.755102, angle: 0.010204
    DEBUG (07:38): HR: 105, HR zone: old: 0.757576, new: 0.765306, angle: 0.010204
    DEBUG (07:38): HR: 106, HR zone: old: 0.767677, new: 0.775510, angle: 0.010204
    DEBUG (07:38): HR: 107, HR zone: old: 0.777778, new: 0.785714, angle: 0.010204
    DEBUG (07:38): HR: 108, HR zone: old: 0.787879, new: 0.795918, angle: 0.010204
    DEBUG (07:38): HR: 109, HR zone: old: 0.797980, new: 0.806122, angle: 0.010204
    DEBUG (07:38): HR: 110, HR zone: old: 0.808081, new: 0.816326, angle: 0.010204
    DEBUG (07:38): HR: 111, HR zone: old: 0.818182, new: 0.826531, angle: 0.010204
    DEBUG (07:38): HR: 112, HR zone: old: 0.828283, new: 0.836735, angle: 0.010204
    DEBUG (07:38): HR: 113, HR zone: old: 0.838384, new: 0.846939, angle: 0.010204
    DEBUG (07:38): HR: 114, HR zone: old: 0.848485, new: 0.857143, angle: 0.010204
    DEBUG (07:38): HR: 115, HR zone: old: 0.858586, new: 0.867347, angle: 0.010204
    DEBUG (07:38): HR: 116, HR zone: old: 0.868687, new: 0.877551, angle: 0.010204
    DEBUG (07:38): HR: 117, HR zone: old: 0.878788, new: 0.887755, angle: 0.010204
    DEBUG (07:38): HR: 118, HR zone: old: 0.888889, new: 0.897959, angle: 0.010204
    DEBUG (07:38): HR: 119, HR zone: old: 0.898990, new: 0.908163, angle: 0.010204
    DEBUG (07:38): HR: 120, HR zone: old: 0.909091, new: 0.918367, angle: 0.010204
    DEBUG (07:38): HR: 121, HR zone: old: 0.919192, new: 0.928571, angle: 0.010204
    DEBUG (07:38): HR: 122, HR zone: old: 0.929293, new: 0.938775, angle: 0.010204
    DEBUG (07:38): HR: 123, HR zone: old: 0.939394, new: 0.948980, angle: 0.010204
    DEBUG (07:38): HR: 124, HR zone: old: 0.949495, new: 0.959184, angle: 0.010204
    DEBUG (07:38): HR: 125, HR zone: old: 0.959596, new: 0.969388, angle: 0.010204
    DEBUG (07:38): HR: 126, HR zone: old: 0.969697, new: 0.979592, angle: 0.010204
    DEBUG (07:38): HR: 127, HR zone: old: 0.979798, new: 0.989796, angle: 0.010204
    DEBUG (07:38): HR: 128, HR zone: old: 0.989899, new: 1.000000, angle: 0.010204
    DEBUG (07:38): HR: 129, HR zone: old: 1.000000, new: 1.040000, angle: 0.040000
    DEBUG (07:38): HR: 130, HR zone: old: 1.040000, new: 1.080000, angle: 0.040000
    DEBUG (07:38): HR: 131, HR zone: old: 1.080000, new: 1.120000, angle: 0.040000
    DEBUG (07:38): HR: 132, HR zone: old: 1.120000, new: 1.160000, angle: 0.040000
    DEBUG (07:38): HR: 133, HR zone: old: 1.160000, new: 1.200000, angle: 0.040000
    DEBUG (07:38): HR: 134, HR zone: old: 1.200000, new: 1.240000, angle: 0.040000
    DEBUG (07:38): HR: 135, HR zone: old: 1.240000, new: 1.280000, angle: 0.040000
    DEBUG (07:38): HR: 136, HR zone: old: 1.280000, new: 1.320000, angle: 0.040000
    DEBUG (07:38): HR: 137, HR zone: old: 1.320000, new: 1.360000, angle: 0.040000
    DEBUG (07:38): HR: 138, HR zone: old: 1.360000, new: 1.400000, angle: 0.040000
    DEBUG (07:38): HR: 139, HR zone: old: 1.400000, new: 1.440000, angle: 0.040000
    DEBUG (07:38): HR: 140, HR zone: old: 1.440000, new: 1.480000, angle: 0.040000
    DEBUG (07:38): HR: 141, HR zone: old: 1.480000, new: 1.520000, angle: 0.040000
    DEBUG (07:38): HR: 142, HR zone: old: 1.520000, new: 1.560000, angle: 0.040000
    DEBUG (07:38): HR: 143, HR zone: old: 1.560000, new: 1.600000, angle: 0.040000
    DEBUG (07:38): HR: 144, HR zone: old: 1.600000, new: 1.640000, angle: 0.040000
    DEBUG (07:38): HR: 145, HR zone: old: 1.640000, new: 1.680000, angle: 0.040000
    DEBUG (07:38): HR: 146, HR zone: old: 1.680000, new: 1.720000, angle: 0.040000
    DEBUG (07:38): HR: 147, HR zone: old: 1.720000, new: 1.760000, angle: 0.040000
    DEBUG (07:38): HR: 148, HR zone: old: 1.760000, new: 1.800000, angle: 0.040000
    DEBUG (07:38): HR: 149, HR zone: old: 1.800000, new: 1.840000, angle: 0.040000
    DEBUG (07:38): HR: 150, HR zone: old: 1.840000, new: 1.880000, angle: 0.040000
    DEBUG (07:38): HR: 151, HR zone: old: 1.880000, new: 1.920000, angle: 0.040000
    DEBUG (07:38): HR: 152, HR zone: old: 1.920000, new: 1.960000, angle: 0.040000
    DEBUG (07:38): HR: 153, HR zone: old: 1.960000, new: 2.000000, angle: 0.040000
    DEBUG (07:38): HR: 154, HR zone: old: 2.000000, new: 2.111111, angle: 0.111111
    DEBUG (07:38): HR: 155, HR zone: old: 2.111111, new: 2.222222, angle: 0.111111
    DEBUG (07:38): HR: 156, HR zone: old: 2.222222, new: 2.333333, angle: 0.111111
    DEBUG (07:38): HR: 157, HR zone: old: 2.333333, new: 2.444444, angle: 0.111111
    DEBUG (07:38): HR: 158, HR zone: old: 2.444444, new: 2.555556, angle: 0.111111
    DEBUG (07:38): HR: 159, HR zone: old: 2.555556, new: 2.666667, angle: 0.111111
    DEBUG (07:38): HR: 160, HR zone: old: 2.666667, new: 2.777778, angle: 0.111111
    DEBUG (07:38): HR: 161, HR zone: old: 2.777778, new: 2.888889, angle: 0.111111
    DEBUG (07:38): HR: 162, HR zone: old: 2.888889, new: 3.000000, angle: 0.111111
    DEBUG (07:38): HR: 163, HR zone: old: 3.000000, new: 3.055556, angle: 0.055556
    DEBUG (07:38): HR: 164, HR zone: old: 3.055556, new: 3.111111, angle: 0.055556
    DEBUG (07:38): HR: 165, HR zone: old: 3.111111, new: 3.166667, angle: 0.055556
    DEBUG (07:38): HR: 166, HR zone: old: 3.166667, new: 3.222222, angle: 0.055556
    DEBUG (07:38): HR: 167, HR zone: old: 3.222222, new: 3.277778, angle: 0.055555
    DEBUG (07:38): HR: 168, HR zone: old: 3.277778, new: 3.333333, angle: 0.055556
    DEBUG (07:38): HR: 169, HR zone: old: 3.333333, new: 3.388889, angle: 0.055556
    DEBUG (07:38): HR: 170, HR zone: old: 3.388889, new: 3.444444, angle: 0.055556
    DEBUG (07:38): HR: 171, HR zone: old: 3.444444, new: 3.500000, angle: 0.055556
    DEBUG (07:38): HR: 172, HR zone: old: 3.500000, new: 3.555556, angle: 0.055556
    DEBUG (07:38): HR: 173, HR zone: old: 3.555556, new: 3.611111, angle: 0.055556
    DEBUG (07:38): HR: 174, HR zone: old: 3.611111, new: 3.666667, angle: 0.055555
    DEBUG (07:38): HR: 175, HR zone: old: 3.666667, new: 3.722222, angle: 0.055556
    DEBUG (07:38): HR: 176, HR zone: old: 3.722222, new: 3.777778, angle: 0.055555
    DEBUG (07:38): HR: 177, HR zone: old: 3.777778, new: 3.833333, angle: 0.055556
    DEBUG (07:38): HR: 178, HR zone: old: 3.833333, new: 3.888889, angle: 0.055555
    DEBUG (07:38): HR: 179, HR zone: old: 3.888889, new: 3.944444, angle: 0.055556
    DEBUG (07:38): HR: 180, HR zone: old: 3.944444, new: 4.000000, angle: 0.055556
    DEBUG (07:38): HR: 181, HR zone: old: 4.000000, new: 4.200000, angle: 0.200000
    DEBUG (07:38): HR: 182, HR zone: old: 4.200000, new: 4.400000, angle: 0.200000
    DEBUG (07:38): HR: 183, HR zone: old: 4.400000, new: 4.600000, angle: 0.200000
    DEBUG (07:38): HR: 184, HR zone: old: 4.600000, new: 4.800000, angle: 0.200000
    DEBUG (07:38): HR: 185, HR zone: old: 4.800000, new: 5.000000, angle: 0.200000
    DEBUG (07:38): HR: 186, HR zone: old: 5.000000, new: 5.200000, angle: 0.200000
    DEBUG (07:38): HR: 187, HR zone: old: 5.200000, new: 5.400000, angle: 0.200000
    DEBUG (07:38): HR: 188, HR zone: old: 5.400000, new: 5.600000, angle: 0.200000
    DEBUG (07:38): HR: 189, HR zone: old: 5.600000, new: 5.800000, angle: 0.200000
    DEBUG (07:38): HR: 190, HR zone: old: 5.800000, new: 6.000000, angle: 0.200000
    DEBUG (07:38): HR: 191, HR zone: old: 6.000000, new: 6.200000, angle: 0.200000
    DEBUG (07:38): HR: 192, HR zone: old: 6.200000, new: 6.400000, angle: 0.200000
    DEBUG (07:38): HR: 193, HR zone: old: 6.400000, new: 6.600000, angle: 0.200000
    DEBUG (07:38): HR: 194, HR zone: old: 6.600000, new: 6.800000, angle: 0.200000
    DEBUG (07:38): HR: 195, HR zone: old: 6.800000, new: 7.000000, angle: 0.200000
    DEBUG (07:38): HR: 196, HR zone: old: 7.000000, new: 7.200000, angle: 0.200000
    DEBUG (07:38): HR: 197, HR zone: old: 7.200000, new: 7.400000, angle: 0.200000
    DEBUG (07:38): HR: 198, HR zone: old: 7.400000, new: 7.600000, angle: 0.200000
    DEBUG (07:38): HR: 199, HR zone: old: 7.600000, new: 7.800000, angle: 0.200000
    DEBUG (07:38): HR: 200, HR zone: old: 7.800000, new: 8.000000, angle: 0.200000
    DEBUG (07:38): HR: 201, HR zone: old: 8.000000, new: 8.200000, angle: 0.200000
    DEBUG (07:38): HR: 202, HR zone: old: 8.200000, new: 8.400000, angle: 0.200000
    DEBUG (07:38): HR: 203, HR zone: old: 8.400000, new: 8.600000, angle: 0.200001
    DEBUG (07:38): HR: 204, HR zone: old: 8.600000, new: 8.800000, angle: 0.200000
    DEBUG (07:38): HR: 205, HR zone: old: 8.800000, new: 9.000000, angle: 0.200000
    DEBUG (07:38): HR: 206, HR zone: old: 9.000000, new: 9.200000, angle: 0.200000
    DEBUG (07:38): HR: 207, HR zone: old: 9.200000, new: 9.400000, angle: 0.200000
    DEBUG (07:38): HR: 208, HR zone: old: 9.400000, new: 9.600000, angle: 0.200001
    DEBUG (07:38): HR: 209, HR zone: old: 9.600000, new: 9.800000, angle: 0.200000
    DEBUG (07:38): HR: 210, HR zone: old: 9.800000, new: 10.000000, angle: 0.200000
    DEBUG (07:38): HR: 211, HR zone: old: 10.000000, new: 10.200000, angle: 0.200000
    DEBUG (07:38): HR: 212, HR zone: old: 10.200000, new: 10.400000, angle: 0.200000
    DEBUG (07:38): HR: 213, HR zone: old: 10.400000, new: 10.600000, angle: 0.200001
    DEBUG (07:38): HR: 214, HR zone: old: 10.600000, new: 10.800000, angle: 0.200000
    DEBUG (07:38): HR: 215, HR zone: old: 10.800000, new: 11.000000, angle: 0.200000
    DEBUG (07:38): HR: 216, HR zone: old: 11.000000, new: 11.200000, angle: 0.200000
    DEBUG (07:38): HR: 217, HR zone: old: 11.200000, new: 11.400000, angle: 0.200000
    DEBUG (07:38): HR: 218, HR zone: old: 11.400000, new: 11.600000, angle: 0.200001
    DEBUG (07:38): HR: 219, HR zone: old: 11.600000, new: 11.800000, angle: 0.200000
    DEBUG (07:38): HR: 220, HR zone: old: 11.800000, new: 12.000000, angle: 0.200000
    DEBUG (07:38): HR: 221, HR zone: old: 12.000000, new: 12.200000, angle: 0.200000
    DEBUG (07:38): HR: 222, HR zone: old: 12.200000, new: 12.400000, angle: 0.200000
    DEBUG (07:38): HR: 223, HR zone: old: 12.400000, new: 12.600000, angle: 0.200001
    DEBUG (07:38): HR: 224, HR zone: old: 12.600000, new: 12.800000, angle: 0.200000
    DEBUG (07:38): HR: 225, HR zone: old: 12.800000, new: 13.000000, angle: 0.200000
    DEBUG (07:38): HR: 226, HR zone: old: 13.000000, new: 13.200000, angle: 0.200000
    DEBUG (07:38): HR: 227, HR zone: old: 13.200000, new: 13.400000, angle: 0.200000
    DEBUG (07:38): HR: 228, HR zone: old: 13.400000, new: 13.600000, angle: 0.200001
    DEBUG (07:38): HR: 229, HR zone: old: 13.600000, new: 13.800000, angle: 0.200000
    DEBUG (07:38): HR: 230, HR zone: old: 13.800000, new: 14.000000, angle: 0.200000
    DEBUG (07:38): HR: 231, HR zone: old: 14.000000, new: 14.200000, angle: 0.200000
    DEBUG (07:38): HR: 232, HR zone: old: 14.200000, new: 14.400000, angle: 0.200000
    DEBUG (07:38): HR: 233, HR zone: old: 14.400000, new: 14.600000, angle: 0.200001
    DEBUG (07:38): HR: 234, HR zone: old: 14.600000, new: 14.800000, angle: 0.200000
    DEBUG (07:38): HR: 235, HR zone: old: 14.800000, new: 15.000000, angle: 0.200000
    DEBUG (07:38): HR: 236, HR zone: old: 15.000000, new: 15.200000, angle: 0.200000
    DEBUG (07:38): HR: 237, HR zone: old: 15.200000, new: 15.400000, angle: 0.200000
    DEBUG (07:38): HR: 238, HR zone: old: 15.400000, new: 15.600000, angle: 0.200001
    DEBUG (07:38): HR: 239, HR zone: old: 15.600000, new: 15.800000, angle: 0.200000
    DEBUG (07:38): HR: 240, HR zone: old: 15.800000, new: 16.000000, angle: 0.200000
    DEBUG (07:38): HR: 241, HR zone: old: 16.000000, new: 16.200001, angle: 0.200001
    DEBUG (07:38): HR: 242, HR zone: old: 16.200001, new: 16.400000, angle: 0.199999
    DEBUG (07:38): HR: 243, HR zone: old: 16.400000, new: 16.600000, angle: 0.200001
    DEBUG (07:38): HR: 244, HR zone: old: 16.600000, new: 16.799999, angle: 0.199999
    DEBUG (07:38): HR: 245, HR zone: old: 16.799999, new: 17.000000, angle: 0.200001
    DEBUG (07:38): HR: 246, HR zone: old: 17.000000, new: 17.200001, angle: 0.200001
    DEBUG (07:38): HR: 247, HR zone: old: 17.200001, new: 17.400000, angle: 0.199999
    DEBUG (07:38): HR: 248, HR zone: old: 17.400000, new: 17.600000, angle: 0.200001
    DEBUG (07:38): HR: 249, HR zone: old: 17.600000, new: 17.799999, angle: 0.199999
    DEBUG (07:38): HR: 250, HR zone: old: 17.799999, new: 18.000000, angle: 0.200001
    DEBUG (07:38): HR: 251, HR zone: old: 18.000000, new: 18.200001, angle: 0.200001
    DEBUG (07:38): HR: 252, HR zone: old: 18.200001, new: 18.400000, angle: 0.199999
    DEBUG (07:38): HR: 253, HR zone: old: 18.400000, new: 18.600000, angle: 0.200001
    DEBUG (07:38): HR: 254, HR zone: old: 18.600000, new: 18.799999, angle: 0.199999
    DEBUG (07:38): HR: 255, HR zone: old: 18.799999, new: 19.000000, angle: 0.200001
    PASS

    The reason you think "my code" (actually your code) has a bug which has a 1-line shift between the 2 algos is because that's literally the nature of the difference between the algos: by shifting the min zone value by 1, you're shifting all your answers to the "right" by 1.

    That's also why (as you pointed out), our graphs won't be substantially different (in terms of shape or "bends"), at least for zones in the interval [1.0, 6.0). Everything in that interval is just shifted to the right by 1.

  • Now here's the code I actually tested with (again, based on YOUR CODE).

    I'm sure you'll let me know where the problem is:

    (: test)
    function compareHrZones(logger as Logger) as Boolean {
        var prev1 = 0;
        var prev2 = 0;
        logger.debug("HR Zones: " + TEST_HR_ZONES);
        for (var hr = 0; hr < 256; hr++) {
            var current1 = computeHrZoneFlocsy(hr, true);
            var current2 = computeHrZoneFlowState(hr, true);
            logger.debug("HR: " + hr + ", HR zone: non-touching: " + current1 + ", touching: " + current2 + ", non-touching 'angle': " + (current1 - prev1) + ", touching 'angle': " + (current2 - prev2));
            prev1 = current1;
            prev2 = current2;
        }
        return true;
    }
    

  • I think you missed my link to pastebin: https://pastebin.com/W7AwEPj5 

    I "compare" (well print the results) 3 functions: 1. my original: computeHrZoneFlocsy, 2. a modified version of that, that is called computeHrZoneTouching and your last pasted code: computeHrZoneFlowState. We have long established that computeHrZoneFlocsy is different. I now only look at computeHrZoneTouching and computeHrZoneFlowState

    At their current state the only "real" difference between them (for hr: [30, maxHR]) is:

    fZ = z + (100.0 * (heartRate - min) / (max - min)) / 100;
    vs
    fZ = z + (((heartRate - min) * 1.0) / (max - min));
    so not surprisingly they both create the same results for those inputs.
  • And now back to the real question. Forget the math stuff above. As a Garmin user, when your HR zones are set to (this is what UserProfile.getHeartRateZones returns):

    minZ1:128, maxZ1:153, maxZ2:162, maxZ3:180, maxZ4:185, maxZ5:190
    what would you expect to see your HR zone is when your HR is 152, 153, 154?
    Because the real difference between my original computeHrZoneFlocsy and your computeHrZoneFlowState is that:
    HR: 152, HR zone: flocsy: 1.920000, FlowState: 1.960000
    HR: 153, HR zone: flocsy: 1.960000, FlowState: 2.000000
    HR: 154, HR zone: flocsy: 2.000000, FlowState: 2.111111
    so when my HR is maxZ1 (153) then am I in zone 1.x or 2.x?
    My interpretation was that if my max HR for zone 1 is 153 and my HR is 153 then I must be in zone 1.x
  • I didn't miss the pastebin, I just didn't bother looking at it (which would normally be hypocritical of me), as again this is not my job and I have literally been up all night discussing this.

    It's now 8:00 AM where I live.

    I now only look at computeHrZoneTouching and computeHrZoneFlowState

    Uhhhhhhh, for a guy who joked that I'm hard to understand (which is fair), it's really hard for me to understand why:

    - you would want to compare 2 different versions of my algorithm in a topic dedicated to asking "what's the best algorithm (originally between flocsy and flowstate)"

    - you would expect me to understand the above quote of yours from the following statement:

    "But I just checked it, and the function I called computeHrZoneFlowState above (now renamed to  computeHrZoneTouching) and your's give the exact same numbers for all hr values [30, 220]"

    Actually, your original statement makes more sense now.

    But yeah, now I see that:

    - you renamed computeHrZoneFlowState (the implementation you wrote for me) to computeHrZoneTouching

    - you made a *new* function computeHrZoneFlowState to represent my latest implementation

    - every time you said "same results" (except for zone 0 and 6) you were comparing your implementation of my algorithm to my implementation of my algorithm

    Yeah, that's super easy to understand

    I thought the point was to compare the *best* (most correct or most preferred) implementation of each of our respective algorithms? Isn't that the point of this topic???

    What is the point of comparing 2 implementations of the SAME algorithm, when it's known that the 2nd implementation is just a refinement of the 1st one?

    IOW: The actual question is which algorithm is better?

    And we determine that by giving an implementation for each algorithm.

    I expected my implementation of my algorithm to replace your implementation of my algorithm, not for the 2 implementations to be compared to each other.

    What's the point?

    - we already know that my (latest) implementation is closer to my actual algorithm in terms of zone 6 and HR that goes above zone 5 max

    - I took out the multiplication and division by 100.0, and added multiplication by 1.0, but we both know that wouldn't really materially affect the results.

    I just don't see the point anymore.

    If anyone else is crazy enough to be following this thread, just use flocsy's implementation. I was wrong about the "bends" in the graph, and the only real difference (other than HR in zone 0 or above zone 5 max) is that his values are "shifted over to the right by 1" (if you graphed hr on the x-axis and hr zone on the y-axis.)

  • I will also note that in the previous thread, you claimed that both our algorithms would produce the same graphs if all points were connected, which implies that they would produce the same results in general (neither of those things are true), so you can kind of understand my confusion when you started talking about "same results" in the context of 2 implementations of *my algorithm* (one of which was written by you).