summaryrefslogtreecommitdiff
path: root/ride
diff options
context:
space:
mode:
Diffstat (limited to 'ride')
-rw-r--r--ride/climb.go4
-rw-r--r--ride/difficulty_test.go17
-rw-r--r--ride/ride.go7
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++