namespace Lattice.Core.Geometry;
///
/// Представляет точку в двумерном пространстве с координатами X и Y.
/// Эта структура является платформонезависимой и может использоваться
/// во всех слоях системы Lattice.
///
public struct Point : IEquatable
{
///
/// Получает точку с координатами (0, 0).
///
public static readonly Point Zero = new(0, 0);
///
/// Координата X (горизонтальная).
///
public double X { get; set; }
///
/// Координата Y (вертикальная).
///
public double Y { get; set; }
///
/// Инициализирует новую точку с указанными координатами.
///
/// Координата X.
/// Координата Y.
public Point(double x, double y)
{
X = x;
Y = y;
}
///
/// Создает точку из System.Drawing.Point.
///
public static Point FromDrawingPoint(System.Drawing.Point point) =>
new(point.X, point.Y);
///
/// Преобразует точку в System.Drawing.Point.
///
public System.Drawing.Point ToDrawingPoint() =>
new((int)X, (int)Y);
///
/// Определяет, равна ли эта точка другой точке.
///
public bool Equals(Point other) =>
Math.Abs(X - other.X) < double.Epsilon &&
Math.Abs(Y - other.Y) < double.Epsilon;
///
public override bool Equals(object? obj) =>
obj is Point point && Equals(point);
///
public override int GetHashCode() =>
HashCode.Combine(X, Y);
///
/// Определяет, равны ли две точки.
///
public static bool operator ==(Point left, Point right) =>
left.Equals(right);
///
/// Определяет, не равны ли две точки.
///
public static bool operator !=(Point left, Point right) =>
!left.Equals(right);
///
/// Возвращает строковое представление точки.
///
public override string ToString() => $"{X}, {Y}";
}