Files
ParkingRobot/Shared/Validation/NumericGuard.cs
T
2026-08-14 13:55:19 +08:00

103 lines
3.0 KiB
C#

using System;
namespace MyParking.Shared
{
/// <summary>
/// 统一检查跨层数值和二维位姿是否由满足基本范围要求的有限值组成。
/// </summary>
public static class NumericGuard
{
/// <summary>
/// 判断指定浮点数是否既不是NaN也不是无穷大。
/// </summary>
public static bool IsFinite(double value)
{
return !double.IsNaN(value) &&
!double.IsInfinity(value);
}
/// <summary>
/// 确保指定浮点数不是NaN或无穷大。
/// </summary>
public static void EnsureFinite(
double value,
string parameterName)
{
if (!IsFinite(value))
{
throw new ArgumentOutOfRangeException(
parameterName,
"参数必须是有限值。");
}
}
/// <summary>
/// 确保指定浮点数是非负有限值。
/// </summary>
public static void EnsureFiniteNonNegative(
double value,
string parameterName)
{
EnsureFinite(value, parameterName);
if (value < 0.0)
{
throw new ArgumentOutOfRangeException(
parameterName,
"参数必须是非负有限值。");
}
}
/// <summary>
/// 确保指定浮点数是正有限值。
/// </summary>
public static void EnsureFinitePositive(
double value,
string parameterName)
{
EnsureFinite(value, parameterName);
if (value <= 0.0)
{
throw new ArgumentOutOfRangeException(
parameterName,
"参数必须是正有限值。");
}
}
/// <summary>
/// 确保二维位姿的位置和航向均为有限值。
/// </summary>
public static void EnsureFinite(
Pose2D pose,
string parameterName)
{
if (!IsFinite(pose.XMeters) ||
!IsFinite(pose.YMeters) ||
!IsFinite(pose.YawRadians))
{
throw new ArgumentOutOfRangeException(
parameterName,
"二维位姿必须由有限值组成。");
}
}
/// <summary>
/// 确保二维刚体速度的两个线速度分量和角速度均为有限值。
/// </summary>
public static void EnsureFinite(
Twist2D twist,
string parameterName)
{
if (!IsFinite(twist.VxMetersPerSecond) ||
!IsFinite(twist.VyMetersPerSecond) ||
!IsFinite(twist.OmegaRadiansPerSecond))
{
throw new ArgumentOutOfRangeException(
parameterName,
"二维刚体速度必须由有限值组成。");
}
}
}
}