Skip to content

Commit

Permalink
Optimize algorithm to calculate grade.
Browse files Browse the repository at this point in the history
  • Loading branch information
Wolfgang Klenk committed Dec 29, 2024
1 parent 334742d commit ff3ef41
Showing 1 changed file with 34 additions and 12 deletions.
46 changes: 34 additions & 12 deletions src/app/services/grade-processor.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,25 +31,47 @@ export class GradeProcessorService implements DataProcessor {
}

private findGradeByDistance(distance: number): number {

if (!this.reducedWaypoints) {
return 0
throw Error()
}

const closestWaypointIndex = this.findWaypointIndexClosestToDistance(distance)
if (closestWaypointIndex === 0 || closestWaypointIndex === this.reducedWaypoints.length - 1) {
return 0; // Start or end of track
}

for (let i = 0; i < this.reducedWaypoints.length - 1; i++) {
const elevationData0 = this.reducedWaypoints[i]
const elevationData1 = this.reducedWaypoints[i + 1]
const elevationData0 = this.reducedWaypoints[closestWaypointIndex - 1]
const elevationData1 = this.reducedWaypoints[closestWaypointIndex + 1]

const distanceDiff = elevationData1.distance - elevationData0.distance
const elevationDiff = elevationData1.elevation - elevationData0.elevation

const horizontalDiff = Math.sqrt(distanceDiff ** 2 - elevationDiff ** 2)

return elevationDiff / horizontalDiff * 100 // in %
}

private findWaypointIndexClosestToDistance(distance: number): number {
if (!this.reducedWaypoints) {
throw Error()
}

if (distance >= elevationData0.distance && distance < elevationData1.distance) {
const distanceDiff = elevationData1.distance - elevationData0.distance
const elevationDiff = elevationData1.elevation - elevationData0.elevation
let left = 0;
let right = this.reducedWaypoints.length - 1;

const horizontalDiff = Math.sqrt(distanceDiff ** 2 - elevationDiff ** 2)
while (left <= right) {
const mid = Math.floor((left + right) / 2)
const midDistance = this.reducedWaypoints[mid].distance

return elevationDiff / horizontalDiff * 100 // in %
if (midDistance === distance) {
return mid
} else if (midDistance < distance) {
left = mid + 1
} else {
right = mid - 1
}
}

return 0
return left < this.reducedWaypoints.length ? left : this.reducedWaypoints.length - 1
}
}
}

0 comments on commit ff3ef41

Please sign in to comment.