128 lines
2.4 KiB
C#
128 lines
2.4 KiB
C#
using System;
|
|
using System.Globalization;
|
|
|
|
namespace _2DGAMELIB
|
|
{
|
|
[Serializable]
|
|
public struct Vector2D
|
|
{
|
|
public double X;
|
|
|
|
public double Y;
|
|
|
|
public double this[int index]
|
|
{
|
|
get
|
|
{
|
|
return index switch
|
|
{
|
|
0 => X,
|
|
1 => Y,
|
|
_ => throw new ArgumentOutOfRangeException("index", "Indices for Vector2D run from 0 to 1, inclusive."),
|
|
};
|
|
}
|
|
set
|
|
{
|
|
switch (index)
|
|
{
|
|
case 0:
|
|
X = value;
|
|
break;
|
|
case 1:
|
|
Y = value;
|
|
break;
|
|
default:
|
|
throw new ArgumentOutOfRangeException("index", "Indices for Vector2D run from 0 to 1, inclusive.");
|
|
}
|
|
}
|
|
}
|
|
|
|
public Vector2D(int value)
|
|
{
|
|
X = value;
|
|
Y = value;
|
|
}
|
|
|
|
public Vector2D(float value)
|
|
{
|
|
X = value;
|
|
Y = value;
|
|
}
|
|
|
|
public Vector2D(double value)
|
|
{
|
|
X = value;
|
|
Y = value;
|
|
}
|
|
|
|
public Vector2D(int x, int y)
|
|
{
|
|
X = x;
|
|
Y = y;
|
|
}
|
|
|
|
public Vector2D(float x, float y)
|
|
{
|
|
X = x;
|
|
Y = y;
|
|
}
|
|
|
|
public Vector2D(double x, double y)
|
|
{
|
|
X = x;
|
|
Y = y;
|
|
}
|
|
|
|
public double Length()
|
|
{
|
|
return System.Math.Sqrt(X * X + Y * Y);
|
|
}
|
|
|
|
public double LengthSquared()
|
|
{
|
|
return X * X + Y * Y;
|
|
}
|
|
|
|
public void Normalize()
|
|
{
|
|
double num = Length();
|
|
if (num != 0.0)
|
|
{
|
|
double num2 = 1.0 / num;
|
|
X *= num2;
|
|
Y *= num2;
|
|
}
|
|
}
|
|
|
|
public static Vector2D operator +(Vector2D left, Vector2D right)
|
|
{
|
|
return new Vector2D(left.X + right.X, left.Y + right.Y);
|
|
}
|
|
|
|
public static Vector2D operator -(Vector2D left, Vector2D right)
|
|
{
|
|
return new Vector2D(left.X - right.X, left.Y - right.Y);
|
|
}
|
|
|
|
public static Vector2D operator -(Vector2D value)
|
|
{
|
|
return new Vector2D(0.0 - value.X, 0.0 - value.Y);
|
|
}
|
|
|
|
public static Vector2D operator *(Vector2D value, double scale)
|
|
{
|
|
return new Vector2D(value.X * scale, value.Y * scale);
|
|
}
|
|
|
|
public static Vector2D operator *(double scale, Vector2D value)
|
|
{
|
|
return new Vector2D(value.X * scale, value.Y * scale);
|
|
}
|
|
|
|
public static Vector2D operator /(Vector2D value, double scale)
|
|
{
|
|
return new Vector2D(value.X / scale, value.Y / scale);
|
|
}
|
|
}
|
|
}
|