using System;
namespace Quik
{
///
/// A 2 dimensional Vector.
///
public struct QuikVec2
{
public float X;
public float Y;
public float Length() => MathF.Sqrt(X * X + Y * Y);
public QuikVec2 Normalize() => this * (1.0f / this.Length());
public float Atan2() => MathF.Atan2(Y, X);
public static QuikVec2 operator +(QuikVec2 a, QuikVec2 b)
{
return new QuikVec2()
{
X = a.X + b.X,
Y = a.Y + b.Y
};
}
public static QuikVec2 operator -(QuikVec2 a)
{
return new QuikVec2()
{
X = -a.X,
Y = -a.Y
};
}
public static QuikVec2 operator -(QuikVec2 a, QuikVec2 b)
{
return new QuikVec2()
{
X = a.X - b.X,
Y = a.Y - b.Y
};
}
public static QuikVec2 operator *(float a, QuikVec2 b)
{
return new QuikVec2()
{
X = a * b.X,
Y = a * b.Y
};
}
public static QuikVec2 operator *(QuikVec2 a, float b) => b * a;
}
///
/// A RGBA color value.
///
public struct QuikColor
{
///
/// Red channel.
///
public byte R;
///
/// Green channel.
///
public byte G;
///
/// Blue channel.
///
public byte B;
///
/// Alpha channel.
///
public byte A;
public QuikColor(byte r, byte g, byte b, byte a)
{
R = r;
G = g;
B = b;
A = a;
}
public QuikColor(byte r, byte g, byte b) : this(r, g, b, 1) { }
public QuikColor(int hexCode)
{
R = (byte)((hexCode >> 24) & 0xFF);
G = (byte)((hexCode >> 16) & 0xFF);
B = (byte)((hexCode >> 8 ) & 0xFF);
A = (byte)((hexCode >> 0 ) & 0xFF);
}
}
///
/// A bezier curve segment.
///
public struct QuikBezier
{
///
/// Segment start point.
///
public QuikVec2 Start;
///
/// Start point control point.
///
public QuikVec2 ControlA;
///
/// End point control point.
///
public QuikVec2 ControlB;
///
/// Segment end point.
///
public QuikVec2 End;
///
/// Get a point in the curve segment.
///
/// Control parameter (between 0 and 1)
/// The point on the curve.
public QuikVec2 GetBezierPoint(float t)
{
return
(1 - t) * (1 - t) * (1 - t) * Start +
(1 - t) * (1 - t) * t * ControlA +
(1 - t) * t * t * ControlB +
t * t * t * End;
}
///
/// Get the tangent on the curve.
///
/// Control parameter (between 0 and 1)
/// The tangent curve.
public QuikVec2 GetBezierTangent(float t)
{
return
3 * (1 - t) * (1 - t) * (ControlA - Start) +
6 * (1 - t) * (ControlB - ControlA) +
3 * t * t * (End - ControlB);
}
}
///
/// A line segment.
///
public struct QuikLine
{
///
/// Start point.
///
public QuikVec2 Start;
///
/// End point.
///
public QuikVec2 End;
}
///
/// A rectangle.
///
public struct QuikRectangle
{
///
/// Rectangle minimum point.
///
public QuikVec2 Min;
///
/// Rectangle maximum point.
///
public QuikVec2 Max;
public QuikRectangle(float l, float t, float r, float b)
{
Min = new QuikVec2() {X = r, Y = b};
Max = new QuikVec2() {X = l, Y = t};
}
}
///
/// An ellipse.
///
/// It is undefined to have an ellipse with non-orthogonal axes.
public struct QuikEllipse
{
///
/// Ellipse center point.
///
public QuikVec2 Center;
///
/// First ellipse axis.
///
public QuikVec2 AxisA;
///
/// Second ellipse axis.
///
public QuikVec2 AxisB;
}
///
/// A triangle.
///
public struct QuikTriangle
{
///
/// First vertex.
///
public QuikVec2 A;
///
/// Second vertex.
///
public QuikVec2 B;
///
/// Third vertex.
///
public QuikVec2 C;
}
}