/
docNemo
/
clothes-graph
Обзор
Документация
Войти
/
docNemo
/
clothes-graph
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
src/ClothesGraph.Geometry/Point2.cs
94 строки
4 KB
docNemo
Запрос на слияние 'interface-to-spec' (
#1
) из interface-to-spec в main
09 авг 2026, 20:28
Верифицирован
09 авг 2026, 20:28
1bbc436
Код
Авторство
О чём код?
using System; namespace ClothesGraph.Geometry; /// <summary> /// Точка чертежа в целочисленных единицах хранения. /// </summary> /// <remarks> /// Ось Y направлена вверх, как на чертеже, а не вниз, как в экранных /// координатах. Перевод в экранные координаты — забота слоя вывода. /// </remarks> public readonly struct Point2 : IEquatable<Point2> { public Point2(Length x, Length y) { X = x; Y = y; } public Length X { get; } public Length Y { get; } public static readonly Point2 Origin = new(Length.Zero, Length.Zero); public static Point2 FromMillimetres(double x, double y) => new(Length.FromMillimetres(x), Length.FromMillimetres(y)); public static Point2 operator +(Point2 point, Offset2 offset) => new(point.X + offset.X, point.Y + offset.Y); public static Point2 operator -(Point2 point, Offset2 offset) => new(point.X - offset.X, point.Y - offset.Y); public static Offset2 operator -(Point2 end, Point2 start) => new(end.X - start.X, end.Y - start.Y); public Length DistanceTo(Point2 other) => (other - this).Magnitude; public bool Equals(Point2 other) => X == other.X && Y == other.Y; public override bool Equals(object? obj) => obj is Point2 other && Equals(other); public override int GetHashCode() => HashCode.Combine(X, Y); public override string ToString() => $"({X}; {Y})"; public static bool operator ==(Point2 left, Point2 right) => left.Equals(right); public static bool operator !=(Point2 left, Point2 right) => !left.Equals(right); } /// <summary> /// Смещение между точками чертежа. /// </summary> /// <remarks> /// Назван не «вектором», чтобы не сталкиваться с <c>System.Numerics.Vector2</c>: /// слой вывода работает с обоими типами одновременно. /// </remarks> public readonly struct Offset2 { public Offset2(Length x, Length y) { X = x; Y = y; } public Length X { get; } public Length Y { get; } /// <summary>Смещение на расстояние под углом в градусах, отсчитанным против часовой стрелки.</summary> public static Offset2 FromPolar(Length distance, double degrees) { var radians = degrees * Math.PI / 180.0; return new Offset2( Length.FromUnits((long)Math.Round(distance.Units * Math.Cos(radians), MidpointRounding.AwayFromZero)), Length.FromUnits((long)Math.Round(distance.Units * Math.Sin(radians), MidpointRounding.AwayFromZero))); } public Length Magnitude => Length.FromUnits((long)Math.Round( Math.Sqrt((double)X.Units * X.Units + (double)Y.Units * Y.Units), MidpointRounding.AwayFromZero)); /// <summary>Угол наклона в градусах против часовой стрелки; ноль — вправо.</summary> public double Degrees => Math.Atan2(Y.Units, X.Units) * 180.0 / Math.PI; /// <summary>Складывает смещения: два подряд равны одному суммарному.</summary> public static Offset2 operator +(Offset2 first, Offset2 second) => new(first.X + second.X, first.Y + second.Y); public static Offset2 operator *(Offset2 vector, double factor) => new(vector.X * factor, vector.Y * factor); public override string ToString() => $"[{X}; {Y}]"; }