Get Distance at Location Along Spline

All above answers assume spline segments are straight lines which can lead to meters of error on curved splines. I suggest a binary search instead where any precision can be achieved depending on the number of iterations.



float SplineUtils::GetApproxDistanceClosestToWorldLocation(FVector Pos_WS, const USplineComponent& Spline)
{
    const auto TargetInputKey = Spline.FindInputKeyClosestToWorldLocation(Pos_WS);
    const auto PointIdx       = static_cast<int32>(TargetInputKey);

    auto LowDistBound_cm       = Spline.GetDistanceAlongSplineAtSplinePoint(PointIdx);
    auto HighDistBound_cm      = Spline.GetDistanceAlongSplineAtSplinePoint(PointIdx + 1);
    auto MiddleDistEstimate_cm = (LowDistBound_cm + HighDistBound_cm) * 0.5f;

    const auto& DistanceToInputMapping = Spline.SplineCurves.ReparamTable;

    for (auto IterCount = 0; IterCount < 10; ++IterCount)
    {
        const auto MiddleInputKey = DistanceToInputMapping.Eval(MiddleDistEstimate_cm);

        if (TargetInputKey < MiddleInputKey) {
            HighDistBound_cm = MiddleDistEstimate_cm;
        } else {
            LowDistBound_cm = MiddleDistEstimate_cm;
        }

        MiddleDistEstimate_cm = (LowDistBound_cm + HighDistBound_cm) * 0.5f;
    }

    return MiddleDistEstimate_cm;
}

1 Like