namespace Lattice.Core.Geometry; /// /// Представляет прямоугольник в двумерном пространстве с позицией и размерами. /// Эта структура является платформонезависимой и может использоваться /// во всех слоях системы Lattice. /// public struct Rect : IEquatable { /// /// Получает пустой прямоугольник (позиция (0, 0), размеры (0, 0)). /// public static readonly Rect Empty = new(0, 0, 0, 0); /// /// Координата X левого верхнего угла прямоугольника. /// public double X { get; set; } /// /// Координата Y левого верхнего угла прямоугольника. /// public double Y { get; set; } /// /// Ширина прямоугольника. /// public double Width { get; set; } /// /// Высота прямоугольника. /// public double Height { get; set; } /// /// Получает координату X правого края прямоугольника. /// public double Right => X + Width; /// /// Получает координату Y нижнего края прямоугольника. /// public double Bottom => Y + Height; /// /// Получает левый верхний угол прямоугольника. /// public Point TopLeft => new(X, Y); /// /// Получает правый нижний угол прямоугольника. /// public Point BottomRight => new(Right, Bottom); /// /// Получает центр прямоугольника. /// public Point Center => new(X + Width / 2, Y + Height / 2); /// /// Получает площадь прямоугольника. /// public double Area => Width * Height; /// /// Инициализирует новый прямоугольник с указанными параметрами. /// /// Координата X. /// Координата Y. /// Ширина. /// Высота. public Rect(double x, double y, double width, double height) { X = x; Y = y; Width = width; Height = height; } /// /// Инициализирует новый прямоугольник с указанной позицией и размером. /// /// Позиция прямоугольника. /// Размер прямоугольника. public Rect(Point location, Size size) { X = location.X; Y = location.Y; Width = size.Width; Height = size.Height; } /// /// Создает прямоугольник из System.Drawing.Rectangle. /// public static Rect FromDrawingRectangle(System.Drawing.Rectangle rect) => new(rect.X, rect.Y, rect.Width, rect.Height); /// /// Преобразует прямоугольник в System.Drawing.Rectangle. /// public System.Drawing.Rectangle ToDrawingRectangle() => new((int)X, (int)Y, (int)Width, (int)Height); /// /// Проверяет, содержит ли прямоугольник указанную точку. /// public bool Contains(Point point) => point.X >= X && point.X <= Right && point.Y >= Y && point.Y <= Bottom; /// /// Проверяет, пересекается ли этот прямоугольник с другим. /// public bool Intersects(Rect other) => X < other.Right && Right > other.X && Y < other.Bottom && Bottom > other.Y; /// /// Определяет, равен ли этот прямоугольник другому прямоугольнику. /// public bool Equals(Rect other) => Math.Abs(X - other.X) < double.Epsilon && Math.Abs(Y - other.Y) < double.Epsilon && Math.Abs(Width - other.Width) < double.Epsilon && Math.Abs(Height - other.Height) < double.Epsilon; /// public override bool Equals(object? obj) => obj is Rect rect && Equals(rect); /// public override int GetHashCode() => HashCode.Combine(X, Y, Width, Height); /// /// Определяет, равны ли два прямоугольника. /// public static bool operator ==(Rect left, Rect right) => left.Equals(right); /// /// Определяет, не равны ли два прямоугольника. /// public static bool operator !=(Rect left, Rect right) => !left.Equals(right); /// /// Возвращает строковое представление прямоугольника. /// public override string ToString() => $"[X={X:F2}, Y={Y:F2}, Width={Width:F2}, Height={Height:F2}]"; }