DragAndDrop core

This commit is contained in:
FrigaT
2026-01-18 16:33:35 +03:00
parent 9ea82af329
commit 79bdd8bc62
229 changed files with 21214 additions and 2494 deletions

View File

@@ -0,0 +1,153 @@
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}]";
}