DragAndDrop core
This commit is contained in:
9
Lattice.Core.Geometry/Lattice.Core.Geometry.csproj
Normal file
9
Lattice.Core.Geometry/Lattice.Core.Geometry.csproj
Normal file
@@ -0,0 +1,9 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net8.0;net9.0;net10.0</TargetFrameworks>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
||||
79
Lattice.Core.Geometry/Point.cs
Normal file
79
Lattice.Core.Geometry/Point.cs
Normal file
@@ -0,0 +1,79 @@
|
||||
namespace Lattice.Core.Geometry;
|
||||
|
||||
/// <summary>
|
||||
/// Представляет точку в двумерном пространстве с координатами X и Y.
|
||||
/// Эта структура является платформонезависимой и может использоваться
|
||||
/// во всех слоях системы Lattice.
|
||||
/// </summary>
|
||||
public struct Point : IEquatable<Point>
|
||||
{
|
||||
/// <summary>
|
||||
/// Получает точку с координатами (0, 0).
|
||||
/// </summary>
|
||||
public static readonly Point Zero = new(0, 0);
|
||||
|
||||
/// <summary>
|
||||
/// Координата X (горизонтальная).
|
||||
/// </summary>
|
||||
public double X { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Координата Y (вертикальная).
|
||||
/// </summary>
|
||||
public double Y { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Инициализирует новую точку с указанными координатами.
|
||||
/// </summary>
|
||||
/// <param name="x">Координата X.</param>
|
||||
/// <param name="y">Координата Y.</param>
|
||||
public Point(double x, double y)
|
||||
{
|
||||
X = x;
|
||||
Y = y;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Создает точку из System.Drawing.Point.
|
||||
/// </summary>
|
||||
public static Point FromDrawingPoint(System.Drawing.Point point) =>
|
||||
new(point.X, point.Y);
|
||||
|
||||
/// <summary>
|
||||
/// Преобразует точку в System.Drawing.Point.
|
||||
/// </summary>
|
||||
public System.Drawing.Point ToDrawingPoint() =>
|
||||
new((int)X, (int)Y);
|
||||
|
||||
/// <summary>
|
||||
/// Определяет, равна ли эта точка другой точке.
|
||||
/// </summary>
|
||||
public bool Equals(Point other) =>
|
||||
Math.Abs(X - other.X) < double.Epsilon &&
|
||||
Math.Abs(Y - other.Y) < double.Epsilon;
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override bool Equals(object? obj) =>
|
||||
obj is Point point && Equals(point);
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override int GetHashCode() =>
|
||||
HashCode.Combine(X, Y);
|
||||
|
||||
/// <summary>
|
||||
/// Определяет, равны ли две точки.
|
||||
/// </summary>
|
||||
public static bool operator ==(Point left, Point right) =>
|
||||
left.Equals(right);
|
||||
|
||||
/// <summary>
|
||||
/// Определяет, не равны ли две точки.
|
||||
/// </summary>
|
||||
public static bool operator !=(Point left, Point right) =>
|
||||
!left.Equals(right);
|
||||
|
||||
/// <summary>
|
||||
/// Возвращает строковое представление точки.
|
||||
/// </summary>
|
||||
public override string ToString() => $"{X}, {Y}";
|
||||
}
|
||||
153
Lattice.Core.Geometry/Rect.cs
Normal file
153
Lattice.Core.Geometry/Rect.cs
Normal 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}]";
|
||||
}
|
||||
84
Lattice.Core.Geometry/Size.cs
Normal file
84
Lattice.Core.Geometry/Size.cs
Normal file
@@ -0,0 +1,84 @@
|
||||
namespace Lattice.Core.Geometry;
|
||||
|
||||
/// <summary>
|
||||
/// Представляет размеры в двумерном пространстве с шириной и высотой.
|
||||
/// Эта структура является платформонезависимой и может использоваться
|
||||
/// во всех слоях системы Lattice.
|
||||
/// </summary>
|
||||
public struct Size : IEquatable<Size>
|
||||
{
|
||||
/// <summary>
|
||||
/// Получает размер с нулевой шириной и высотой.
|
||||
/// </summary>
|
||||
public static readonly Size Zero = new(0, 0);
|
||||
|
||||
/// <summary>
|
||||
/// Ширина.
|
||||
/// </summary>
|
||||
public double Width { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Высота.
|
||||
/// </summary>
|
||||
public double Height { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Получает признак того, что размер является пустым (нулевая ширина или высота).
|
||||
/// </summary>
|
||||
public bool IsEmpty => Width <= 0 || Height <= 0;
|
||||
|
||||
/// <summary>
|
||||
/// Инициализирует новый размер с указанными значениями.
|
||||
/// </summary>
|
||||
/// <param name="width">Ширина.</param>
|
||||
/// <param name="height">Высота.</param>
|
||||
public Size(double width, double height)
|
||||
{
|
||||
Width = width;
|
||||
Height = height;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Создает размер из System.Drawing.Size.
|
||||
/// </summary>
|
||||
public static Size FromDrawingSize(System.Drawing.Size size) =>
|
||||
new(size.Width, size.Height);
|
||||
|
||||
/// <summary>
|
||||
/// Преобразует размер в System.Drawing.Size.
|
||||
/// </summary>
|
||||
public System.Drawing.Size ToDrawingSize() =>
|
||||
new((int)Width, (int)Height);
|
||||
|
||||
/// <summary>
|
||||
/// Определяет, равен ли этот размер другому размеру.
|
||||
/// </summary>
|
||||
public bool Equals(Size other) =>
|
||||
Math.Abs(Width - other.Width) < double.Epsilon &&
|
||||
Math.Abs(Height - other.Height) < double.Epsilon;
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override bool Equals(object? obj) =>
|
||||
obj is Size size && Equals(size);
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override int GetHashCode() =>
|
||||
HashCode.Combine(Width, Height);
|
||||
|
||||
/// <summary>
|
||||
/// Определяет, равны ли два размера.
|
||||
/// </summary>
|
||||
public static bool operator ==(Size left, Size right) =>
|
||||
left.Equals(right);
|
||||
|
||||
/// <summary>
|
||||
/// Определяет, не равны ли два размера.
|
||||
/// </summary>
|
||||
public static bool operator !=(Size left, Size right) =>
|
||||
!left.Equals(right);
|
||||
|
||||
/// <summary>
|
||||
/// Возвращает строковое представление размера.
|
||||
/// </summary>
|
||||
public override string ToString() => $"{Width} × {Height}";
|
||||
}
|
||||
Reference in New Issue
Block a user