213 lines
4.5 KiB
C#
213 lines
4.5 KiB
C#
using System;
|
|
using System.Globalization;
|
|
|
|
namespace _2DGAMELIB
|
|
{
|
|
[Serializable]
|
|
public struct Vector4D
|
|
{
|
|
public double X;
|
|
|
|
public double Y;
|
|
|
|
public double Z;
|
|
|
|
public double W;
|
|
|
|
public double this[int index]
|
|
{
|
|
get
|
|
{
|
|
return index switch
|
|
{
|
|
0 => X,
|
|
1 => Y,
|
|
2 => Z,
|
|
3 => W,
|
|
_ => throw new ArgumentOutOfRangeException("index", "Indices for Vector4D run from 0 to 3, inclusive."),
|
|
};
|
|
}
|
|
set
|
|
{
|
|
switch (index)
|
|
{
|
|
case 0:
|
|
X = value;
|
|
break;
|
|
case 1:
|
|
Y = value;
|
|
break;
|
|
case 2:
|
|
Z = value;
|
|
break;
|
|
case 3:
|
|
W = value;
|
|
break;
|
|
default:
|
|
throw new ArgumentOutOfRangeException("index", "Indices for Vector4D run from 0 to 3, inclusive.");
|
|
}
|
|
}
|
|
}
|
|
|
|
public Vector4D(double value)
|
|
{
|
|
X = value;
|
|
Y = value;
|
|
Z = value;
|
|
W = value;
|
|
}
|
|
|
|
public Vector4D(Vector2D value, double z, double w)
|
|
{
|
|
X = value.X;
|
|
Y = value.Y;
|
|
Z = z;
|
|
W = w;
|
|
}
|
|
|
|
public Vector4D(ref Vector2D value, double z, double w)
|
|
{
|
|
X = value.X;
|
|
Y = value.Y;
|
|
Z = z;
|
|
W = w;
|
|
}
|
|
|
|
public Vector4D(Vector3D value, double w)
|
|
{
|
|
X = value.X;
|
|
Y = value.Y;
|
|
Z = value.Z;
|
|
W = w;
|
|
}
|
|
|
|
public Vector4D(ref Vector3D value, double w)
|
|
{
|
|
X = value.X;
|
|
Y = value.Y;
|
|
Z = value.Z;
|
|
W = w;
|
|
}
|
|
|
|
public Vector4D(double x, double y, double z, double w)
|
|
{
|
|
X = x;
|
|
Y = y;
|
|
Z = z;
|
|
W = w;
|
|
}
|
|
|
|
public double Length()
|
|
{
|
|
return System.Math.Sqrt(X * X + Y * Y + Z * Z + W * W);
|
|
}
|
|
|
|
public double LengthSquared()
|
|
{
|
|
return X * X + Y * Y + Z * Z + W * W;
|
|
}
|
|
|
|
public void Normalize()
|
|
{
|
|
double num = Length();
|
|
if (num != 0.0)
|
|
{
|
|
double num2 = 1.0 / num;
|
|
X *= num2;
|
|
Y *= num2;
|
|
Z *= num2;
|
|
W *= num2;
|
|
}
|
|
}
|
|
|
|
public static Vector4D operator +(Vector4D left, Vector4D right)
|
|
{
|
|
return new Vector4D(left.X + right.X, left.Y + right.Y, left.Z + right.Z, left.W + right.W);
|
|
}
|
|
|
|
public static Vector4D operator -(Vector4D left, Vector4D right)
|
|
{
|
|
return new Vector4D(left.X - right.X, left.Y - right.Y, left.Z - right.Z, left.W - right.W);
|
|
}
|
|
|
|
public static Vector4D operator -(Vector4D value)
|
|
{
|
|
return new Vector4D(0.0 - value.X, 0.0 - value.Y, 0.0 - value.Z, 0.0 - value.W);
|
|
}
|
|
|
|
public static Vector4D operator *(Vector4D value, double scale)
|
|
{
|
|
return new Vector4D(value.X * scale, value.Y * scale, value.Z * scale, value.W * scale);
|
|
}
|
|
|
|
public static Vector4D operator *(double scale, Vector4D value)
|
|
{
|
|
return new Vector4D(value.X * scale, value.Y * scale, value.Z * scale, value.W * scale);
|
|
}
|
|
|
|
public static Vector4D operator /(Vector4D value, double scale)
|
|
{
|
|
return new Vector4D(value.X / scale, value.Y / scale, value.Z / scale, value.W / scale);
|
|
}
|
|
|
|
public static bool operator ==(Vector4D left, Vector4D right)
|
|
{
|
|
if (left.X == right.X && left.Y == right.Y && left.Z == right.Z)
|
|
{
|
|
return left.W == right.W;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public static bool operator !=(Vector4D left, Vector4D right)
|
|
{
|
|
if (left.X == right.X && left.Y == right.Y && left.Z == right.Z)
|
|
{
|
|
return left.W != right.W;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public override string ToString()
|
|
{
|
|
return string.Format(CultureInfo.CurrentCulture, "X:{0} Y:{1} Z:{2} W:{3}", X.ToString(CultureInfo.CurrentCulture), Y.ToString(CultureInfo.CurrentCulture), Z.ToString(CultureInfo.CurrentCulture), W.ToString(CultureInfo.CurrentCulture));
|
|
}
|
|
|
|
public override int GetHashCode()
|
|
{
|
|
return X.GetHashCode() + Y.GetHashCode() + Z.GetHashCode() + W.GetHashCode();
|
|
}
|
|
|
|
public override bool Equals(object value)
|
|
{
|
|
if (value == null)
|
|
{
|
|
return false;
|
|
}
|
|
if (value.GetType() != GetType())
|
|
{
|
|
return false;
|
|
}
|
|
return Equals((Vector4D)value);
|
|
}
|
|
|
|
public bool Equals(Vector4D value)
|
|
{
|
|
if (X == value.X && Y == value.Y && Z == value.Z)
|
|
{
|
|
return W == value.W;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public bool Equals(ref Vector4D value)
|
|
{
|
|
if (X == value.X && Y == value.Y && Z == value.Z)
|
|
{
|
|
return W == value.W;
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
}
|