diff options
Diffstat (limited to 'ride')
| -rw-r--r-- | ride/climb.go | 4 | ||||
| -rw-r--r-- | ride/difficulty_test.go | 17 | ||||
| -rw-r--r-- | ride/ride.go | 7 |
3 files changed, 26 insertions, 2 deletions
diff --git a/ride/climb.go b/ride/climb.go index df8798d..8ac60fa 100644 --- a/ride/climb.go +++ b/ride/climb.go @@ -45,6 +45,10 @@ func (climb Climb) Score() float64 { return Score(climb.points, 0, len(climb.points)-1) } +func (climb Climb) DifficultyScore() float64 { + return difficultyScore(climb.points) +} + func Slope(start, end Point) float64 { return (end.ElevationM - start.ElevationM) / (end.DistanceM - start.DistanceM) } diff --git a/ride/difficulty_test.go b/ride/difficulty_test.go index 7e652cc..5ba14c7 100644 --- a/ride/difficulty_test.go +++ b/ride/difficulty_test.go @@ -40,3 +40,20 @@ func TestDifficultyScoreExampleRide(t *testing.T) { assert.NoError(t, err) assert.InDelta(t, 3049.0, r.DifficultyScore(), 1) } + +func TestDifficultyScoreClimbNotAtStart(t *testing.T) { + r := RideBuilder{precision: 100}.WithSection("1km at 0%").WithSection("2km at 7%").Build() + climbs := r.AllClimbs() + assert.Len(t, climbs, 1) + assert.InDelta(t, 98.0, climbs[0].DifficultyScore(), 1e-9) +} + +func TestDifficultyScoreHautacamClimbfinderReference(t *testing.T) { + r, err := ride.ParseFile(parser, "../examples/2022-07-21.Pogacar.gpx") + assert.NoError(t, err) + climbs := r.AllClimbs() + assert.Len(t, climbs, 6) + hautacam := climbs[5] + assert.InDelta(t, 128.6, hautacam.Start().DistanceM/1000, 0.1) + assert.InDelta(t, 930.0, hautacam.DifficultyScore(), 10) +} diff --git a/ride/ride.go b/ride/ride.go index 9ce260f..73e7a26 100644 --- a/ride/ride.go +++ b/ride/ride.go @@ -93,7 +93,10 @@ func (r *Ride) ScoreFromKm(start, end float64) float64 { } func (r *Ride) DifficultyScore() float64 { - points := r.points + return difficultyScore(r.points) +} + +func difficultyScore(points []Point) float64 { if len(points) < 2 { return 0 } @@ -103,7 +106,7 @@ func (r *Ride) DifficultyScore() float64 { } score := 0.0 i := 0 - for start := 0.0; start < last.DistanceM; start += 100 { + for start := points[0].DistanceM; start < last.DistanceM; start += 100 { end := math.Min(start+100, last.DistanceM) for i < len(points)-1 && points[i+1].DistanceM <= start { i++ |