summaryrefslogtreecommitdiff
path: root/mountain_pass
diff options
context:
space:
mode:
Diffstat (limited to 'mountain_pass')
-rw-r--r--mountain_pass/detection.go17
-rw-r--r--mountain_pass/detection_test.go46
2 files changed, 33 insertions, 30 deletions
diff --git a/mountain_pass/detection.go b/mountain_pass/detection.go
index e30fddc..4be2f94 100644
--- a/mountain_pass/detection.go
+++ b/mountain_pass/detection.go
@@ -60,7 +60,8 @@ func DetectCrossings(ride ride.Ride, passes []MountainPass, radiusM, elevationTo
// climb's highest point and whose elevation is within elevationToleranceM of
// that point's elevation, nearest first. Found is false when no pass matches.
func MatchClimb(climb ride.Climb, passes []MountainPass, radiusM, elevationToleranceM float64) (MountainPass, bool) {
- top := climb.Top()
+ topCoord := climb.TopCoord()
+ topElevation := climb.TopElevationM()
var best MountainPass
bestDistanceM := radiusM
found := false
@@ -68,12 +69,12 @@ func MatchClimb(climb ride.Climb, passes []MountainPass, radiusM, elevationToler
if mountainPass.Coord == nil {
continue
}
- distanceKm, _ := geodist.HaversineDistance(top.Coord, *mountainPass.Coord)
+ distanceKm, _ := geodist.HaversineDistance(topCoord, *mountainPass.Coord)
distanceM := distanceKm * 1000
if distanceM > bestDistanceM {
continue
}
- elevationDiff := absFloat64(top.ElevationM - float64(mountainPass.Elevation))
+ elevationDiff := absFloat64(topElevation - float64(mountainPass.Elevation))
if elevationDiff > elevationToleranceM {
continue
}
@@ -86,14 +87,14 @@ func MatchClimb(climb ride.Climb, passes []MountainPass, radiusM, elevationToler
func nearestCrossing(ride ride.Ride, mountainPass MountainPass) (Crossing, bool) {
best := Crossing{Pass: mountainPass, DistanceToM: 1e18}
- for _, point := range ride.Points() {
- distanceKm, _ := geodist.HaversineDistance(point.Coord, *mountainPass.Coord)
+ for i := 0; i < ride.Len(); i++ {
+ distanceKm, _ := geodist.HaversineDistance(ride.Coord(i), *mountainPass.Coord)
distanceM := distanceKm * 1000
if distanceM < best.DistanceToM {
best.DistanceToM = distanceM
- best.RideDistanceM = point.DistanceM
- best.RideElevation = point.ElevationM
- best.ElevationDiff = absFloat64(point.ElevationM - float64(mountainPass.Elevation))
+ best.RideDistanceM = ride.DistanceM(i)
+ best.RideElevation = ride.ElevationM(i)
+ best.ElevationDiff = absFloat64(ride.ElevationM(i) - float64(mountainPass.Elevation))
}
}
if best.DistanceToM > 1e17 {
diff --git a/mountain_pass/detection_test.go b/mountain_pass/detection_test.go
index 3208061..d6cba9f 100644
--- a/mountain_pass/detection_test.go
+++ b/mountain_pass/detection_test.go
@@ -2,6 +2,7 @@ package mountain_pass_test
import (
"testing"
+ "time"
"github.com/jftuga/geodist"
"github.com/martinlehoux/biking_home/mountain_pass"
@@ -48,19 +49,20 @@ func TestDetectCrossingsRequiresElevationAgreement(t *testing.T) {
func rideFromPoint(t *testing.T, latitude, longitude, elevation float64) ride.Ride {
t.Helper()
- points := []ride.Point{
- {DistanceM: 0, ElevationM: 100, Coord: geodist.Coord{Lat: latitude - 0.01, Lon: longitude - 0.01}},
- {DistanceM: 1000, ElevationM: elevation, Coord: geodist.Coord{Lat: latitude, Lon: longitude}},
- }
- return ride.FromPoints(points)
+ return ride.FromColumns(
+ []float64{0, 1000},
+ []float64{100, elevation},
+ []geodist.Coord{{Lat: latitude - 0.01, Lon: longitude - 0.01}, {Lat: latitude, Lon: longitude}},
+ make([]time.Time, 2),
+ )
}
func TestMatchClimbFindsPassAtTop(t *testing.T) {
- climb := climbFromPoints([]ride.Point{
- {DistanceM: 0, ElevationM: 300, Coord: geodist.Coord{Lat: 43.61, Lon: 5.42}},
- {DistanceM: 1000, ElevationM: 447, Coord: geodist.Coord{Lat: 43.62, Lon: 5.43}},
- {DistanceM: 2000, ElevationM: 380, Coord: geodist.Coord{Lat: 43.63, Lon: 5.44}},
- })
+ climb := climbFromColumns(
+ []float64{0, 1000, 2000},
+ []float64{300, 447, 380},
+ []geodist.Coord{{Lat: 43.61, Lon: 5.42}, {Lat: 43.62, Lon: 5.43}, {Lat: 43.63, Lon: 5.44}},
+ )
pass := mountain_pass.MountainPass{
Name: "Pas de Magnan", Elevation: 440,
Coord: &geodist.Coord{Lat: 43.62, Lon: 5.43},
@@ -71,11 +73,11 @@ func TestMatchClimbFindsPassAtTop(t *testing.T) {
}
func TestMatchClimbRequiresElevationAgreement(t *testing.T) {
- climb := climbFromPoints([]ride.Point{
- {DistanceM: 0, ElevationM: 300, Coord: geodist.Coord{Lat: 43.61, Lon: 5.42}},
- {DistanceM: 1000, ElevationM: 447, Coord: geodist.Coord{Lat: 43.62, Lon: 5.43}},
- {DistanceM: 2000, ElevationM: 380, Coord: geodist.Coord{Lat: 43.63, Lon: 5.44}},
- })
+ climb := climbFromColumns(
+ []float64{0, 1000, 2000},
+ []float64{300, 447, 380},
+ []geodist.Coord{{Lat: 43.61, Lon: 5.42}, {Lat: 43.62, Lon: 5.43}, {Lat: 43.63, Lon: 5.44}},
+ )
pass := mountain_pass.MountainPass{
Name: "Pas de Magnan", Elevation: 900,
Coord: &geodist.Coord{Lat: 43.62, Lon: 5.43},
@@ -85,11 +87,11 @@ func TestMatchClimbRequiresElevationAgreement(t *testing.T) {
}
func TestMatchClimbNearestOfTwo(t *testing.T) {
- climb := climbFromPoints([]ride.Point{
- {DistanceM: 0, ElevationM: 300, Coord: geodist.Coord{Lat: 43.61, Lon: 5.42}},
- {DistanceM: 1000, ElevationM: 447, Coord: geodist.Coord{Lat: 43.62, Lon: 5.43}},
- {DistanceM: 2000, ElevationM: 380, Coord: geodist.Coord{Lat: 43.63, Lon: 5.44}},
- })
+ climb := climbFromColumns(
+ []float64{0, 1000, 2000},
+ []float64{300, 447, 380},
+ []geodist.Coord{{Lat: 43.61, Lon: 5.42}, {Lat: 43.62, Lon: 5.43}, {Lat: 43.63, Lon: 5.44}},
+ )
near := mountain_pass.MountainPass{
Name: "Pas de Magnan", Elevation: 440,
Coord: &geodist.Coord{Lat: 43.62, Lon: 5.43},
@@ -103,7 +105,7 @@ func TestMatchClimbNearestOfTwo(t *testing.T) {
assert.Equal(t, "Pas de Magnan", matched.Name)
}
-func climbFromPoints(points []ride.Point) ride.Climb {
- ride := ride.FromPoints(points)
+func climbFromColumns(distances, elevations []float64, coords []geodist.Coord) ride.Climb {
+ ride := ride.FromColumns(distances, elevations, coords, make([]time.Time, len(distances)))
return ride.ClimbFromDist(0, 2000)
}