-
Notifications
You must be signed in to change notification settings - Fork 4
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
IComparable in Vector2 and unit tests for it #47
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -5,7 +5,7 @@ | |
namespace Hypercube.Math.Vectors; | ||
|
||
[StructLayout(LayoutKind.Sequential)] | ||
public readonly partial struct Vector2 : IEquatable<Vector2> | ||
public readonly partial struct Vector2 : IEquatable<Vector2>, IComparable<Vector2> | ||
{ | ||
public static readonly Vector2 NaN = new(float.NaN, float.NaN); | ||
public static readonly Vector2 Zero = new(0, 0); | ||
|
@@ -262,4 +262,32 @@ public static float Cross(Vector2 a, Vector2 b) | |
{ | ||
return a.X * b.Y - a.Y * b.X; | ||
} | ||
|
||
public int CompareTo(Vector2 other) | ||
{ | ||
return Length.CompareTo(other.Length); | ||
} | ||
|
||
[MethodImpl(MethodImplOptions.AggressiveInlining)] | ||
public int CompareTo(Vector2 other, ComparisonType comparisonType) | ||
{ | ||
switch (comparisonType) | ||
{ | ||
case ComparisonType.XComponent: | ||
return X.CompareTo(other.X); | ||
case ComparisonType.YComponent: | ||
return Y.CompareTo(other.Y); | ||
case ComparisonType.Angle: | ||
return Angle.CompareTo(other.Angle); | ||
default: | ||
throw new ArgumentOutOfRangeException(nameof(comparisonType), comparisonType, "Invalid ComparisonType"); | ||
} | ||
} | ||
|
||
public enum ComparisonType | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Думаю, это может использоваться для There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Я думаю, что можно оставить этот enum в коде, но переместить его в более подходящее место. У такого подхода есть свои плюсы:
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Мне все же кажется что лаконичнее вызывать There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Добавил реализацию, надеюсь верно Вас понял |
||
{ | ||
XComponent, | ||
YComponent, | ||
Angle | ||
} | ||
} |
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. На будущее, я пока не написал гайдлайны, если есть возможность лучше использовать |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,111 @@ | ||
using System; | ||
using System.Collections.Generic; | ||
using System.Linq; | ||
using Hypercube.Math.Vectors; | ||
using System.Text; | ||
using System.Threading.Tasks; | ||
using static Hypercube.Math.Vectors.Vector2; | ||
|
||
namespace Hypercube.UnitTests.Math; | ||
|
||
[TestFixture] | ||
public class CompareToTest | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Классы, которые мы не предполагаем, что будут наследованы (Когда либо). Мы помечаем как |
||
{ | ||
[Test] | ||
public void CompareTo_LengthComparison_ReturnsExpectedResult() | ||
{ | ||
// Arrange | ||
Vector2 vector1 = new Vector2(3, 4); // Length = 5 | ||
Vector2 vector2 = new Vector2(6, 8); // Length = 10 | ||
|
||
// Act | ||
int result = vector1.CompareTo(vector2); | ||
|
||
// Assert | ||
Assert.Less(result, 0); | ||
} | ||
|
||
[Test] | ||
public void CompareTo_XComponentComparison_ReturnsExpectedResult() | ||
{ | ||
// Arrange | ||
Vector2 vector1 = new Vector2(3, 4); | ||
Vector2 vector2 = new Vector2(6, 4); | ||
|
||
// Act | ||
int result = vector1.CompareTo(vector2, ComparisonType.XComponent); | ||
|
||
// Assert | ||
Assert.Less(result, 0); // Expecting vector1 to be "less than" vector2 based on X component | ||
} | ||
|
||
[Test] | ||
public void CompareTo_YComponentComparison_ReturnsExpectedResult() | ||
{ | ||
// Arrange | ||
Vector2 vector1 = new Vector2(3, 4); | ||
Vector2 vector2 = new Vector2(3, 2); | ||
|
||
// Act | ||
int result = vector1.CompareTo(vector2, ComparisonType.YComponent); | ||
|
||
// Assert | ||
Assert.Greater(result, 0); // Expecting vector1 to be "greater than" vector2 based on Y component | ||
} | ||
|
||
[Test] | ||
public void CompareTo_AngleComparison_ReturnsExpectedResult() | ||
{ | ||
// Arrange | ||
Vector2 vector1 = new Vector2(0, 1); // Angle = π/2 (90 degrees) | ||
Vector2 vector2 = new Vector2(1, 0); // Angle = 0 degrees | ||
|
||
// Act | ||
int result = vector1.CompareTo(vector2, ComparisonType.Angle); | ||
|
||
// Assert | ||
Assert.Greater(result, 0); // Expecting vector1 to be "greater than" vector2 based on Angle | ||
} | ||
|
||
[Test] | ||
public void CompareTo_SameVectors_ReturnsZero() | ||
{ | ||
// Arrange | ||
Vector2 vector1 = new Vector2(3, 4); | ||
Vector2 vector2 = new Vector2(3, 4); | ||
|
||
// Act & Assert | ||
Assert.AreEqual(0, vector1.CompareTo(vector2)); | ||
Check warning on line 78 in Hypercube.UnitTests/Math/CompareToTest.cs GitHub Actions / Windows Build
Check warning on line 78 in Hypercube.UnitTests/Math/CompareToTest.cs GitHub Actions / Windows Build
|
||
Assert.AreEqual(0, vector1.CompareTo(vector2, ComparisonType.XComponent)); | ||
Check warning on line 79 in Hypercube.UnitTests/Math/CompareToTest.cs GitHub Actions / Windows Build
Check warning on line 79 in Hypercube.UnitTests/Math/CompareToTest.cs GitHub Actions / Windows Build
|
||
Assert.AreEqual(0, vector1.CompareTo(vector2, ComparisonType.YComponent)); | ||
Check warning on line 80 in Hypercube.UnitTests/Math/CompareToTest.cs GitHub Actions / Windows Build
Check warning on line 80 in Hypercube.UnitTests/Math/CompareToTest.cs GitHub Actions / Windows Build
|
||
Assert.AreEqual(0, vector1.CompareTo(vector2, ComparisonType.Angle)); | ||
Check warning on line 81 in Hypercube.UnitTests/Math/CompareToTest.cs GitHub Actions / Windows Build
|
||
} | ||
|
||
[Test] | ||
public void CompareTo_DifferentComparisons_ReturnDifferentResults() | ||
{ | ||
// Arrange | ||
Vector2 vector1 = new Vector2(1, 2); | ||
Vector2 vector2 = new Vector2(2, 1); | ||
|
||
// Act | ||
int lengthComparison = vector1.CompareTo(vector2); | ||
int xComponentComparison = vector1.CompareTo(vector2, ComparisonType.XComponent); | ||
int yComponentComparison = vector1.CompareTo(vector2, ComparisonType.YComponent); | ||
|
||
// Assert | ||
Assert.AreNotEqual(lengthComparison, xComponentComparison); | ||
Check warning on line 97 in Hypercube.UnitTests/Math/CompareToTest.cs GitHub Actions / Windows Build
Check warning on line 97 in Hypercube.UnitTests/Math/CompareToTest.cs GitHub Actions / Windows Build
|
||
Assert.AreNotEqual(xComponentComparison, yComponentComparison); | ||
Check warning on line 98 in Hypercube.UnitTests/Math/CompareToTest.cs GitHub Actions / Windows Build
Check warning on line 98 in Hypercube.UnitTests/Math/CompareToTest.cs GitHub Actions / Windows Build
|
||
} | ||
|
||
[Test] | ||
public void CompareTo_InvalidComparisonType_ThrowsArgumentOutOfRangeException() | ||
{ | ||
// Arrange | ||
Vector2 vector1 = new Vector2(3, 4); | ||
Vector2 vector2 = new Vector2(3, 4); | ||
|
||
// Act & Assert | ||
Assert.Throws<ArgumentOutOfRangeException>(() => vector1.CompareTo(vector2, (ComparisonType)999)); | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Касаемо этого, я думал насчёт использование чистой длины, но как мне известно для большого количество итераций, взятие корня будет вызывать лаги (А мы ведь используем вектора в физике и отрисовке). Суть в том, что лучше будет использовать
LengthSqueared
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Действительно, взятие корня будет накладно по производительности. Исправлю на сравнение по квадратам площади