namespace Lattice.Core.Geometry;
///
/// Представляет размеры в двумерном пространстве с шириной и высотой.
/// Эта структура является платформонезависимой и может использоваться
/// во всех слоях системы Lattice.
///
public struct Size : IEquatable
{
///
/// Получает размер с нулевой шириной и высотой.
///
public static readonly Size Zero = new(0, 0);
///
/// Ширина.
///
public double Width { get; set; }
///
/// Высота.
///
public double Height { get; set; }
///
/// Получает признак того, что размер является пустым (нулевая ширина или высота).
///
public bool IsEmpty => Width <= 0 || Height <= 0;
///
/// Инициализирует новый размер с указанными значениями.
///
/// Ширина.
/// Высота.
public Size(double width, double height)
{
Width = width;
Height = height;
}
///
/// Создает размер из System.Drawing.Size.
///
public static Size FromDrawingSize(System.Drawing.Size size) =>
new(size.Width, size.Height);
///
/// Преобразует размер в System.Drawing.Size.
///
public System.Drawing.Size ToDrawingSize() =>
new((int)Width, (int)Height);
///
/// Определяет, равен ли этот размер другому размеру.
///
public bool Equals(Size other) =>
Math.Abs(Width - other.Width) < double.Epsilon &&
Math.Abs(Height - other.Height) < double.Epsilon;
///
public override bool Equals(object? obj) =>
obj is Size size && Equals(size);
///
public override int GetHashCode() =>
HashCode.Combine(Width, Height);
///
/// Определяет, равны ли два размера.
///
public static bool operator ==(Size left, Size right) =>
left.Equals(right);
///
/// Определяет, не равны ли два размера.
///
public static bool operator !=(Size left, Size right) =>
!left.Equals(right);
///
/// Возвращает строковое представление размера.
///
public override string ToString() => $"{Width} × {Height}";
}