using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using MultiWheelC.TrajectoryPlanning.PathSmoothing;
namespace MultiWheelC.TrajectoryPlanning.PathSmoothing.Processing;
/// 同一几何分析器产生的路径、方向段和未验证质量统计。
public sealed class PathGeometryAnalysis
{
/// 创建一次几何重算的只读结果快照。
/// 重算后的完整路径点集合。
/// 完整覆盖 的方向段集合。
/// 路径总弧长,单位 m。
/// 车辆曲率绝对值峰值,单位 1/m。
/// 车辆曲率导数绝对值峰值,单位 1/m²。
/// 车辆曲率均方根,单位 1/m。
/// 不跨换向点的累计绝对曲率变化,单位 1/m。
/// 不跨换向点的曲率变化代价。
/// 输入点携带的最小保守车体净空,单位 m。
internal PathGeometryAnalysis(
IReadOnlyList path,
IReadOnlyList segments,
double pathLengthMeters,
double maximumAbsoluteVehicleCurvaturePerMeter,
double maximumAbsoluteVehicleCurvatureDerivativePerSquareMeter,
double rootMeanSquareVehicleCurvaturePerMeter,
double totalAbsoluteCurvatureVariationPerMeter,
double curvatureVariationEnergy,
double minimumBodyClearanceMeters)
{
Path = CopyReadOnly(path);
Segments = CopyReadOnly(segments);
PathLengthMeters = pathLengthMeters;
MaximumAbsoluteVehicleCurvaturePerMeter = maximumAbsoluteVehicleCurvaturePerMeter;
MaximumAbsoluteVehicleCurvatureDerivativePerSquareMeter = maximumAbsoluteVehicleCurvatureDerivativePerSquareMeter;
RootMeanSquareVehicleCurvaturePerMeter = rootMeanSquareVehicleCurvaturePerMeter;
TotalAbsoluteCurvatureVariationPerMeter = totalAbsoluteCurvatureVariationPerMeter;
CurvatureVariationEnergy = curvatureVariationEnergy;
MinimumBodyClearanceMeters = minimumBodyClearanceMeters;
}
/// 完成几何重计算的不可变路径。
public IReadOnlyList Path { get; }
/// 完整覆盖 的不可变方向段。
public IReadOnlyList Segments { get; }
/// 路径总长度,单位 m。
public double PathLengthMeters { get; }
/// 车辆曲率绝对值峰值,单位 1/m。
public double MaximumAbsoluteVehicleCurvaturePerMeter { get; }
/// 车辆曲率导数绝对值峰值,单位 1/m²。
public double MaximumAbsoluteVehicleCurvatureDerivativePerSquareMeter { get; }
/// 车辆曲率均方根,单位 1/m。
public double RootMeanSquareVehicleCurvaturePerMeter { get; }
/// 不跨换向点累计的绝对曲率变化,单位 1/m。
public double TotalAbsoluteCurvatureVariationPerMeter { get; }
/// 不跨换向点累计的曲率变化代价。
public double CurvatureVariationEnergy { get; }
/// 曲率变化代价的面向用户名称;保留 以兼容既有调用方。
public double CurvatureVariationCost => CurvatureVariationEnergy;
/// 输入点携带的最小保守净空,单位 m。
public double MinimumBodyClearanceMeters { get; }
private static IReadOnlyList CopyReadOnly(IReadOnlyList source)
{
var copy = new List(source == null ? 0 : source.Count);
if (source != null)
{
for (int index = 0; index < source.Count; index++) copy.Add(source[index]);
}
return new ReadOnlyCollection(copy);
}
}