Files
Lattice/Lattice.Core.Geometry/Rect.cs
2026-01-18 16:33:35 +03:00

153 lines
5.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
namespace Lattice.Core.Geometry;
/// <summary>
/// Представляет прямоугольник в двумерном пространстве с позицией и размерами.
/// Эта структура является платформонезависимой и может использоваться
/// во всех слоях системы Lattice.
/// </summary>
public struct Rect : IEquatable<Rect>
{
/// <summary>
/// Получает пустой прямоугольник (позиция (0, 0), размеры (0, 0)).
/// </summary>
public static readonly Rect Empty = new(0, 0, 0, 0);
/// <summary>
/// Координата X левого верхнего угла прямоугольника.
/// </summary>
public double X { get; set; }
/// <summary>
/// Координата Y левого верхнего угла прямоугольника.
/// </summary>
public double Y { get; set; }
/// <summary>
/// Ширина прямоугольника.
/// </summary>
public double Width { get; set; }
/// <summary>
/// Высота прямоугольника.
/// </summary>
public double Height { get; set; }
/// <summary>
/// Получает координату X правого края прямоугольника.
/// </summary>
public double Right => X + Width;
/// <summary>
/// Получает координату Y нижнего края прямоугольника.
/// </summary>
public double Bottom => Y + Height;
/// <summary>
/// Получает левый верхний угол прямоугольника.
/// </summary>
public Point TopLeft => new(X, Y);
/// <summary>
/// Получает правый нижний угол прямоугольника.
/// </summary>
public Point BottomRight => new(Right, Bottom);
/// <summary>
/// Получает центр прямоугольника.
/// </summary>
public Point Center => new(X + Width / 2, Y + Height / 2);
/// <summary>
/// Получает площадь прямоугольника.
/// </summary>
public double Area => Width * Height;
/// <summary>
/// Инициализирует новый прямоугольник с указанными параметрами.
/// </summary>
/// <param name="x">Координата X.</param>
/// <param name="y">Координата Y.</param>
/// <param name="width">Ширина.</param>
/// <param name="height">Высота.</param>
public Rect(double x, double y, double width, double height)
{
X = x;
Y = y;
Width = width;
Height = height;
}
/// <summary>
/// Инициализирует новый прямоугольник с указанной позицией и размером.
/// </summary>
/// <param name="location">Позиция прямоугольника.</param>
/// <param name="size">Размер прямоугольника.</param>
public Rect(Point location, Size size)
{
X = location.X;
Y = location.Y;
Width = size.Width;
Height = size.Height;
}
/// <summary>
/// Создает прямоугольник из System.Drawing.Rectangle.
/// </summary>
public static Rect FromDrawingRectangle(System.Drawing.Rectangle rect) =>
new(rect.X, rect.Y, rect.Width, rect.Height);
/// <summary>
/// Преобразует прямоугольник в System.Drawing.Rectangle.
/// </summary>
public System.Drawing.Rectangle ToDrawingRectangle() =>
new((int)X, (int)Y, (int)Width, (int)Height);
/// <summary>
/// Проверяет, содержит ли прямоугольник указанную точку.
/// </summary>
public bool Contains(Point point) =>
point.X >= X && point.X <= Right &&
point.Y >= Y && point.Y <= Bottom;
/// <summary>
/// Проверяет, пересекается ли этот прямоугольник с другим.
/// </summary>
public bool Intersects(Rect other) =>
X < other.Right && Right > other.X &&
Y < other.Bottom && Bottom > other.Y;
/// <summary>
/// Определяет, равен ли этот прямоугольник другому прямоугольнику.
/// </summary>
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;
/// <inheritdoc/>
public override bool Equals(object? obj) =>
obj is Rect rect && Equals(rect);
/// <inheritdoc/>
public override int GetHashCode() =>
HashCode.Combine(X, Y, Width, Height);
/// <summary>
/// Определяет, равны ли два прямоугольника.
/// </summary>
public static bool operator ==(Rect left, Rect right) =>
left.Equals(right);
/// <summary>
/// Определяет, не равны ли два прямоугольника.
/// </summary>
public static bool operator !=(Rect left, Rect right) =>
!left.Equals(right);
/// <summary>
/// Возвращает строковое представление прямоугольника.
/// </summary>
public override string ToString() =>
$"[X={X:F2}, Y={Y:F2}, Width={Width:F2}, Height={Height:F2}]";
}