using MultiWheelC.TrajectoryPlanning.Utils;

namespace MultiWheelC.TrajectoryPlanning.Mapping;

/// <summary>边与世界 X/Y 轴平行的矩形障碍物，坐标单位为 mm。</summary>
public sealed class AxisAlignedRectangleObstacle : IMapObstacle
{
    /// <summary>
    /// 创建轴对齐矩形障碍物。
    ///
    /// 参数：xMin、xMax、yMin、yMax 分别为矩形世界坐标边界，单位 mm。
    /// 注意：构造不校验边界顺序，请通过 <see cref="IsValid"/> 判断后再使用。
    /// </summary>
    public AxisAlignedRectangleObstacle(float xMin, float xMax, float yMin, float yMax)
    {
        XMin = xMin; XMax = xMax; YMin = yMin; YMax = yMax;
    }
    /// <summary>矩形世界 X 下边界，单位 mm。</summary>
    public float XMin { get; }
    /// <summary>矩形世界 X 上边界，单位 mm。</summary>
    public float XMax { get; }
    /// <summary>矩形世界 Y 下边界，单位 mm。</summary>
    public float YMin { get; }
    /// <summary>矩形世界 Y 上边界，单位 mm。</summary>
    public float YMax { get; }
    /// <summary>四个边界均为有限数且 XMax≥XMin、YMax≥YMin 时为 true；否则为 false。</summary>
    public bool IsValid
    {
        get { return NumericGuard.IsFinite(XMin) && NumericGuard.IsFinite(XMax) && NumericGuard.IsFinite(YMin) && NumericGuard.IsFinite(YMax) && XMax >= XMin && YMax >= YMin; }
    }
}
