53 lines
2.1 KiB
C#
53 lines
2.1 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Collections.ObjectModel;
|
|
using MultiWheelC.TrajectoryPlanning.PathSmoothing.Processing;
|
|
|
|
namespace MultiWheelC.TrajectoryPlanning.PathSmoothing.Algorithms;
|
|
|
|
/// <summary>平滑方法产生的原始方向段候选,尚未经过统一几何或安全复核。</summary>
|
|
internal sealed class SmoothingCandidate
|
|
{
|
|
private SmoothingCandidate(bool succeeded, IReadOnlyList<PreparedDirectionSegment> segments, string reason)
|
|
{
|
|
Succeeded = succeeded;
|
|
Segments = CopyReadOnly(segments);
|
|
Reason = reason ?? string.Empty;
|
|
}
|
|
|
|
/// <summary>候选是否成功产生有限的原始几何。</summary>
|
|
internal bool Succeeded { get; }
|
|
|
|
/// <summary>候选方向段;失败候选始终为空。</summary>
|
|
internal IReadOnlyList<PreparedDirectionSegment> Segments { get; }
|
|
|
|
/// <summary>失败或退化时的稳定说明;成功时为空。</summary>
|
|
internal string Reason { get; }
|
|
|
|
/// <summary>创建待统一分析和验证的成功候选。</summary>
|
|
internal static SmoothingCandidate Success(IReadOnlyList<PreparedDirectionSegment> segments)
|
|
{
|
|
if (segments == null || segments.Count == 0)
|
|
throw new ArgumentException("A successful smoothing candidate requires direction segments.", nameof(segments));
|
|
return new SmoothingCandidate(true, segments, string.Empty);
|
|
}
|
|
|
|
/// <summary>创建不应重试的数值或构造失败候选。</summary>
|
|
internal static SmoothingCandidate Failed(string reason)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(reason))
|
|
throw new ArgumentException("A failed smoothing candidate requires a reason.", nameof(reason));
|
|
return new SmoothingCandidate(false, null, reason);
|
|
}
|
|
|
|
private static IReadOnlyList<T> CopyReadOnly<T>(IReadOnlyList<T> source)
|
|
{
|
|
var copy = new List<T>(source == null ? 0 : source.Count);
|
|
if (source != null)
|
|
{
|
|
for (int index = 0; index < source.Count; index++) copy.Add(source[index]);
|
|
}
|
|
return new ReadOnlyCollection<T>(copy);
|
|
}
|
|
}
|