using System; namespace LibAC.Utilities { public class Vector3i { public static readonly Vector3i ZERO = new Vector3i(0, 0, 0); public int X { get; set; } public int Y { get; set; } public int Z { get; set; } public Vector3i(int X = 0, int Y = 0, int Z = 0) { this.X = X; this.Y = Y; this.Z = Z; } public override bool Equals(object other) { if (other is Vector3i) { Vector3i otherVector = (Vector3i)other; return X == otherVector.X && Y == otherVector.Y && Z == otherVector.Z; } return false; } public static Vector3i operator +(Vector3i v1, Vector3i v2) { Vector3i result = v1.Clone(); result.X += v2.X; result.Y += v2.Y; result.Z += v2.Z; return result; } public static Vector3i operator -(Vector3i v1, Vector3i v2) { Vector3i result = v1.Clone(); result.X -= v2.X; result.Y -= v2.Y; result.Z -= v2.Z; return result; } public static Vector3i operator *(Vector3i v1, Vector3i v2) { Vector3i result = v1.Clone(); result.X *= v2.X; result.Y *= v2.Y; result.Z *= v2.Z; return result; } public static Vector3i operator /(Vector3i v1, Vector3i v2) { Vector3i result = v1.Clone(); result.X = (int)Math.Round((double)result.X / v2.X); result.Y = (int)Math.Round((double)result.Y / v2.Y); result.Z = (int)Math.Round((double)result.Z / v2.Z); return result; } public static bool operator >(Vector3i v1, Vector3i v2) { return (v1.X > v2.X) || (v1.Y > v2.Y) || (v1.X > v2.Z); } public static bool operator <(Vector3i v1, Vector3i v2) { return (v1.X < v2.X) || (v1.Y < v2.Y) || (v1.X < v2.Z); } public Vector3i Clone() { return new Vector3i(X, Y, Z); } public override string ToString() { return $"<{X}, {Y}, {Z}>"; } public bool Inside(Vector3i min, Vector3i max) { return (min.X <= X && max.X >= X) && (min.Y <= Y && max.Y >= Y) && (min.Z <= Z && max.Z >= Z); } // Override GetHashCode if you override Equals public override int GetHashCode() { return HashCode.Combine(X, Y, Z); } } }