using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using MultiWheelC.TrajectoryPlanning.PathSmoothing.Processing;
using MultiWheelC.TrajectoryPlanning.Utils;
namespace MultiWheelC.TrajectoryPlanning.PathSmoothing.LocalG2;
/// 一个尚未经过安全和质量评价的局部 G2 替换几何。
internal sealed class LocalG2CandidateGeometry
{
internal LocalG2CandidateGeometry(
int candidateIndex,
int segmentIndex,
double startArcLengthMeters,
double endArcLengthMeters,
double leftWindowLengthMeters,
double rightWindowLengthMeters,
IReadOnlyList regionPoints,
double startVehicleCurvaturePerMeter,
double endVehicleCurvaturePerMeter,
double startGeometricCurvaturePerMeter,
double endGeometricCurvaturePerMeter,
bool internalConnectionsAreG2)
{
if (candidateIndex < 0 || segmentIndex < 0 || !NumericGuard.IsFinite(startArcLengthMeters) ||
!NumericGuard.IsFinite(endArcLengthMeters) || startArcLengthMeters < 0d ||
endArcLengthMeters < startArcLengthMeters || !NumericGuard.IsFinite(leftWindowLengthMeters) ||
!NumericGuard.IsFinite(rightWindowLengthMeters) || leftWindowLengthMeters < 0d ||
rightWindowLengthMeters < 0d || regionPoints == null || regionPoints.Count < 2 ||
!NumericGuard.IsFinite(startVehicleCurvaturePerMeter) || !NumericGuard.IsFinite(endVehicleCurvaturePerMeter) ||
!NumericGuard.IsFinite(startGeometricCurvaturePerMeter) || !NumericGuard.IsFinite(endGeometricCurvaturePerMeter))
{
throw new ArgumentOutOfRangeException(nameof(regionPoints));
}
CandidateIndex = candidateIndex;
SegmentIndex = segmentIndex;
StartArcLengthMeters = startArcLengthMeters;
EndArcLengthMeters = endArcLengthMeters;
LeftWindowLengthMeters = leftWindowLengthMeters;
RightWindowLengthMeters = rightWindowLengthMeters;
RegionPoints = Copy(regionPoints);
StartVehicleCurvaturePerMeter = startVehicleCurvaturePerMeter;
EndVehicleCurvaturePerMeter = endVehicleCurvaturePerMeter;
StartGeometricCurvaturePerMeter = startGeometricCurvaturePerMeter;
EndGeometricCurvaturePerMeter = endGeometricCurvaturePerMeter;
InternalConnectionsAreG2 = internalConnectionsAreG2;
}
internal int CandidateIndex { get; }
internal int SegmentIndex { get; }
internal double StartArcLengthMeters { get; }
internal double EndArcLengthMeters { get; }
internal double LeftWindowLengthMeters { get; }
internal double RightWindowLengthMeters { get; }
internal IReadOnlyList RegionPoints { get; }
// 这些边界状态供候选评价和窄范围反射验证使用,不能替代统一几何分析器的最终统计。
internal double StartVehicleCurvaturePerMeter { get; }
internal double EndVehicleCurvaturePerMeter { get; }
internal double StartGeometricCurvaturePerMeter { get; }
internal double EndGeometricCurvaturePerMeter { get; }
internal bool InternalConnectionsAreG2 { get; }
private static IReadOnlyList Copy(IReadOnlyList source)
{
var copy = new List(source.Count);
for (int index = 0; index < source.Count; index++)
{
if (source[index] == null) throw new ArgumentOutOfRangeException(nameof(source));
copy.Add(source[index]);
}
return new ReadOnlyCollection(copy);
}
}