/
EugenyCh7
/
Puppet2D.Net
Обзор
Документация
Войти
/
EugenyCh7
/
Puppet2D.Net
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Puppet2D.System/Vector3.cs
143 строки
5 KB
EugenyCh7
comments fix
24 июл 2025, 22:54
24 июл 2025, 22:54
421ed1f
Код
Авторство
О чём код?
using System; using System.Runtime.InteropServices; namespace Puppet2D.System { /// <summary> /// Vector3 is an utility class for manipulating 3 dimensional /// vectors with float components /// </summary> [StructLayout(LayoutKind.Sequential)] public struct Vector3 : IEquatable<Vector3> { /// <summary> /// Construct the vector from its coordinates /// </summary> /// <param name="x">X coordinate</param> /// <param name="y">Y coordinate</param> /// <param name="z">Z coordinate</param> public Vector3(float x, float y, float z) { X = x; Y = y; Z = z; } /// <summary> /// Deconstructs a Vector3 into a tuple of floats /// </summary> /// <param name="x">X coordinate</param> /// <param name="y">Y coordinate</param> /// <param name="z">Z coordinate</param> public void Deconstruct(out float x, out float y, out float z) { x = X; y = Y; z = Z; } /// <summary> /// Operator - overload ; returns the opposite of a vector /// </summary> /// <param name="v">Vector to negate</param> /// <returns>-v</returns> public static Vector3 operator -(Vector3 v) => new Vector3(-v.X, -v.Y, -v.Z); /// <summary> /// Operator - overload ; subtracts two vectors /// </summary> /// <param name="v1">First vector</param> /// <param name="v2">Second vector</param> /// <returns>v1 - v2</returns> public static Vector3 operator -(Vector3 v1, Vector3 v2) => new Vector3(v1.X - v2.X, v1.Y - v2.Y, v1.Z - v2.Z); /// <summary> /// Operator + overload ; add two vectors /// </summary> /// <param name="v1">First vector</param> /// <param name="v2">Second vector</param> /// <returns>v1 + v2</returns> public static Vector3 operator +(Vector3 v1, Vector3 v2) => new Vector3(v1.X + v2.X, v1.Y + v2.Y, v1.Z + v2.Z); /// <summary> /// Operator * overload ; multiply a vector by a scalar value /// </summary> /// <param name="v">Vector</param> /// <param name="x">Scalar value</param> /// <returns>v * x</returns> public static Vector3 operator *(Vector3 v, float x) => new Vector3(v.X * x, v.Y * x, v.Z * x); /// <summary> /// Operator * overload ; multiply a scalar value by a vector /// </summary> /// <param name="x">Scalar value</param> /// <param name="v">Vector</param> /// <returns>x * v</returns> public static Vector3 operator *(float x, Vector3 v) => new Vector3(v.X * x, v.Y * x, v.Z * x); /// <summary> /// Operator / overload ; divide a vector by a scalar value /// </summary> /// <param name="v">Vector</param> /// <param name="x">Scalar value</param> /// <returns>v / x</returns> public static Vector3 operator /(Vector3 v, float x) => new Vector3(v.X / x, v.Y / x, v.Z / x); /// <summary> /// Operator == overload ; check vector equality /// </summary> /// <param name="v1">First vector</param> /// <param name="v2">Second vector</param> /// <returns>v1 == v2</returns> public static bool operator ==(Vector3 v1, Vector3 v2) => v1.Equals(v2); /// <summary> /// Operator != overload ; check vector inequality /// </summary> /// <param name="v1">First vector</param> /// <param name="v2">Second vector</param> /// <returns>v1 != v2</returns> public static bool operator !=(Vector3 v1, Vector3 v2) => !v1.Equals(v2); /// <summary> /// Provide a string describing the object /// </summary> /// <returns>String description of the object</returns> public override string ToString() => $"[Vector3] X({X}) Y({Y}) Z({Z})"; /// <summary> /// Compare vector and object and checks if they are equal /// </summary> /// <param name="obj">Object to check</param> /// <returns>Object and vector are equal</returns> public override bool Equals(object obj) => ( obj is Vector3 ) && Equals((Vector3)obj); /// <summary> /// Compare two vectors and checks if they are equal /// </summary> /// <param name="other">Vector to check</param> /// <returns>Vectors are equal</returns> public bool Equals(Vector3 other) => ( X == other.X ) && ( Y == other.Y ) && ( Z == other.Z ); /// <summary> /// Provide a integer describing the object /// </summary> /// <returns>Integer description of the object</returns> public override int GetHashCode() => X.GetHashCode() ^ Y.GetHashCode() ^ Z.GetHashCode(); /// <summary> /// Converts a tuple of floats to a Vector3 /// </summary> /// <param name="tuple">The tuple to convert</param> public static implicit operator Vector3((float X, float Y, float Z) tuple) => new Vector3(tuple.X, tuple.Y, tuple.Z); /// <summary>X (horizontal) component of the vector</summary> public float X; /// <summary>Y (vertical) component of the vector</summary> public float Y; /// <summary>Z (depth) component of the vector</summary> public float Z; } }