public void CreateRotation2() { float angle = (float)MathHelper.ToRadians(30); Matrix22F m = Matrix22F.CreateRotation(angle); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F((float)Math.Cos(angle), (float)Math.Sin(angle)), m * Vector2F.UnitX)); }
public void Transform2D() { // Transform forward and inverse and compare with initial values. var random = new Random(1234567); var s = new Vector2F[16, 8]; var t = new Vector2F[16, 8]; for (int i = 0; i < s.GetLength(0); i++) { for (int j = 0; j < s.GetLength(1); j++) { s[i, j] = random.NextVector2F(-10, 10); t[i, j] = s[i, j]; } } var fft = new FastFourierTransformF(16); fft.Transform2D(t, true); Assert.IsFalse(Vector2F.AreNumericallyEqual(s[0, 0], t[0, 0])); fft.Transform2D(t, false); for (int i = 0; i < s.GetLength(0); i++) { for (int j = 0; j < s.GetLength(1); j++) { Assert.IsTrue(Vector2F.AreNumericallyEqual(s[i, j], t[i, j])); } } }
public void CreateRotation() { Matrix22F m = Matrix22F.CreateRotation(0.0f); Assert.AreEqual(Matrix22F.Identity, m); m = Matrix22F.CreateRotation((float)Math.PI / 2); Assert.IsTrue(Vector2F.AreNumericallyEqual(Vector2F.UnitY, m * Vector2F.UnitX)); }
public void InterpolationTest() { var traits = Vector2Traits.Instance; var value0 = new Vector2(2, 3); var value1 = new Vector2(5, -6); Assert.IsTrue(Vector2F.AreNumericallyEqual((Vector2F)value0, (Vector2F)traits.Interpolate(value0, value1, 0.0f))); Assert.IsTrue(Vector2F.AreNumericallyEqual((Vector2F)value1, (Vector2F)traits.Interpolate(value0, value1, 1.0f))); Assert.IsTrue(Vector2F.AreNumericallyEqual((Vector2F)(0.25f * value0 + 0.75f * value1), (Vector2F)traits.Interpolate(value0, value1, 0.75f))); }
public void InverseWithNearSingularMatrix() { Matrix22F m = new Matrix22F(0.0001f, 0, 0, 0.0001f); Vector2F v = Vector2F.One; Vector2F w = m * v; Assert.IsTrue(Vector2F.AreNumericallyEqual(v, m.Inverse * w)); Assert.IsTrue(Matrix22F.AreNumericallyEqual(Matrix22F.Identity, m * m.Inverse)); }
public void AreEqualWithEpsilon() { float epsilon = 0.001f; Vector2F u = new Vector2F(1.0f, 2.0f); Vector2F v = new Vector2F(1.002f, 2.002f); Vector2F w = new Vector2F(1.0001f, 2.0001f); Assert.IsTrue(Vector2F.AreNumericallyEqual(u, u, epsilon)); Assert.IsFalse(Vector2F.AreNumericallyEqual(u, v, epsilon)); Assert.IsTrue(Vector2F.AreNumericallyEqual(u, w, epsilon)); }
public void Inverse() { Assert.AreEqual(Matrix22F.Identity, Matrix22F.Identity.Inverse); Matrix22F m = new Matrix22F(1, 2, 3, 4); Vector2F v = Vector2F.One; Vector2F w = m * v; Assert.IsTrue(Vector2F.AreNumericallyEqual(v, m.Inverse * w)); Assert.IsTrue(Matrix22F.AreNumericallyEqual(Matrix22F.Identity, m * m.Inverse)); }
public void GetPoint() { var a = new ArcSegment2F { Point1 = new Vector2F(1, 2), Point2 = new Vector2F(10, -3), }; Assert.IsTrue(Vector2F.AreNumericallyEqual(a.Point1, a.GetPoint(0), 0.001f)); Assert.IsTrue(Vector2F.AreNumericallyEqual(a.Point2, a.GetPoint(1), 0.001f)); }
public void GetTangent() { var s = new LineSegment2F { Point1 = new Vector2F(1, 2), Point2 = new Vector2F(-1, 9), }; Assert.IsTrue(Vector2F.AreNumericallyEqual(s.Point2 - s.Point1, s.GetTangent(0))); Assert.IsTrue(Vector2F.AreNumericallyEqual(s.Point2 - s.Point1, s.GetTangent(0.3f))); Assert.IsTrue(Vector2F.AreNumericallyEqual(s.Point2 - s.Point1, s.GetTangent(1))); }
public void MultiplyTest() { var traits = Vector2Traits.Instance; var value = new Vector2(-1, 2); Assert.IsTrue(Vector2F.AreNumericallyEqual((Vector2F)Vector2.Zero, (Vector2F)traits.Multiply(value, 0))); Assert.IsTrue(Vector2F.AreNumericallyEqual((Vector2F)value, (Vector2F)traits.Multiply(value, 1))); Assert.IsTrue(Vector2F.AreNumericallyEqual((Vector2F)(value + value), (Vector2F)traits.Multiply(value, 2))); Assert.IsTrue(Vector2F.AreNumericallyEqual((Vector2F)(value + value + value), (Vector2F)traits.Multiply(value, 3))); Assert.IsTrue(Vector2F.AreNumericallyEqual((Vector2F)(-value), (Vector2F)traits.Multiply(value, -1))); Assert.IsTrue(Vector2F.AreNumericallyEqual((Vector2F)(-value - value), (Vector2F)traits.Multiply(value, -2))); Assert.IsTrue(Vector2F.AreNumericallyEqual((Vector2F)(-value - value - value), (Vector2F)traits.Multiply(value, -3))); }
public void GetTangent() { BezierSegment2F b = new BezierSegment2F { Point1 = new Vector2F(1, 2), ControlPoint1 = new Vector2F(10, 3), ControlPoint2 = new Vector2F(7, 8), Point2 = new Vector2F(10, 2), }; Assert.IsTrue(Vector2F.AreNumericallyEqual(3 * (b.ControlPoint1 - b.Point1), b.GetTangent(0))); Assert.IsTrue(Vector2F.AreNumericallyEqual(3 * (b.Point2 - b.ControlPoint2), b.GetTangent(1))); }
public void MultiplyVector() { Vector2F v = new Vector2F(2.34f, 3.45f); Assert.AreEqual(v, Matrix22F.Multiply(Matrix22F.Identity, v)); Assert.AreEqual(Vector2F.Zero, Matrix22F.Multiply(Matrix22F.Zero, v)); Matrix22F m = new Matrix22F(12, 23, 45, 67); Assert.IsTrue(Vector2F.AreNumericallyEqual(v, Matrix22F.Multiply(m * m.Inverse, v))); for (int i = 0; i < 2; i++) { Assert.AreEqual(Vector2F.Dot(m.GetRow(i), v), Matrix22F.Multiply(m, v)[i]); } }
public void FromByTest() { // IAnimationValueTraits<T> is used in a from-by animation to a add a relative offset to // the start value. var traits = Vector2Traits.Instance; var from = new Vector2(-1, -2); var by = new Vector2(4, -5); var to = traits.Add(from, by); Assert.IsTrue(Vector2F.AreNumericallyEqual((Vector2F)(by + from), (Vector2F)to)); Assert.IsTrue(Vector2F.AreNumericallyEqual((Vector2F)from, (Vector2F)traits.Add(to, traits.Inverse(by)))); Assert.IsTrue(Vector2F.AreNumericallyEqual((Vector2F)by, (Vector2F)traits.Add(traits.Inverse(from), to))); }
public void AreEqual() { float originalEpsilon = Numeric.EpsilonF; Numeric.EpsilonF = 1e-8f; Vector2F u = new Vector2F(1.0f, 2.0f); Vector2F v = new Vector2F(1.000001f, 2.000001f); Vector2F w = new Vector2F(1.00000001f, 2.00000001f); Assert.IsTrue(Vector2F.AreNumericallyEqual(u, u)); Assert.IsFalse(Vector2F.AreNumericallyEqual(u, v)); Assert.IsTrue(Vector2F.AreNumericallyEqual(u, w)); Numeric.EpsilonF = originalEpsilon; }
public void Flatten() { var s = new ArcSegment2F { Point1 = new Vector2F(1, 2), Point2 = new Vector2F(10, -3), }; var points = new List <Vector2F>(); var tolerance = 1f; s.Flatten(points, 10, tolerance); Assert.IsTrue(Vector2F.AreNumericallyEqual(points[0], s.Point1)); Assert.IsTrue(Vector2F.AreNumericallyEqual(points.Last(), s.Point2)); var curveLength = s.GetLength(0, 1, 10, tolerance); Assert.IsTrue(CurveHelper.GetLength(points) >= curveLength - tolerance * points.Count / 2); Assert.IsTrue(CurveHelper.GetLength(points) <= curveLength); }
public void CycleOffsetTest() { // IAnimationValueTraits<T> is used in a cyclic animation to a add the cycle offset in // each iteration. var traits = Vector2Traits.Instance; var first = new Vector2(1, 2); // Animation value of first key frame. var last = new Vector2(-4, 5); // Animation value of last key frame. var cycleOffset = traits.Add(traits.Inverse(first), last); // Cycle offset should be the difference between last and first key frame. Assert.IsTrue(Vector2F.AreNumericallyEqual((Vector2F)last, (Vector2F)traits.Add(first, cycleOffset))); Assert.IsTrue(Vector2F.AreNumericallyEqual((Vector2F)last, (Vector2F)(cycleOffset + first))); // Check multiple cycles (post-loop). Assert.IsTrue(Vector2F.AreNumericallyEqual((Vector2F)last, (Vector2F)traits.Add(first, traits.Multiply(cycleOffset, 1)))); Assert.IsTrue(Vector2F.AreNumericallyEqual((Vector2F)(cycleOffset + cycleOffset + last), (Vector2F)traits.Add(first, traits.Multiply(cycleOffset, 3)))); // Check multiple cycles (pre-loop). Assert.IsTrue(Vector2F.AreNumericallyEqual((Vector2F)first, (Vector2F)traits.Add(last, traits.Multiply(cycleOffset, -1)))); Assert.IsTrue(Vector2F.AreNumericallyEqual((Vector2F)(first - cycleOffset - cycleOffset), (Vector2F)traits.Add(last, traits.Multiply(cycleOffset, -3)))); }
public void Transform1DComparedWithDft() { // Transform forward and inverse and compare with initial values. var random = new Random(1234567); var s = new Vector2F[16]; var t = new Vector2F[16]; for (int i = 0; i < s.Length; i++) { s[i] = random.NextVector2F(-10, 10); t[i] = s[i]; } FastFourierTransformF.DFT(s, true); FastFourierTransformF.Transform1D(t, true); for (int i = 0; i < s.Length; i++) { Assert.IsTrue(Vector2F.AreNumericallyEqual(s[i], t[i])); } }
public void GetTangent() { CatmullRomSegment2F c = new CatmullRomSegment2F { Point1 = new Vector2F(1, 2), Point2 = new Vector2F(10, 3), Point3 = new Vector2F(7, 8), Point4 = new Vector2F(10, 2), }; HermiteSegment2F h = new HermiteSegment2F { Point1 = c.Point2, Tangent1 = (c.Point3 - c.Point1) * 0.5f, Tangent2 = (c.Point4 - c.Point2) * 0.5f, Point2 = c.Point3, }; Assert.IsTrue(Vector2F.AreNumericallyEqual(h.Tangent1, c.GetTangent(0))); Assert.IsTrue(Vector2F.AreNumericallyEqual(h.Tangent2, c.GetTangent(1))); Assert.IsTrue(Vector2F.AreNumericallyEqual(h.GetTangent(0.7f), c.GetTangent(0.7f))); }
public void GetTangent() { HermiteSegment2F s = new HermiteSegment2F { Point1 = new Vector2F(1, 2), Tangent1 = (new Vector2F(10, 3) - new Vector2F(1, 2)) * 3, Tangent2 = (new Vector2F(10, 2) - new Vector2F(7, 8)) * 3, Point2 = new Vector2F(10, 2), }; BezierSegment2F b = new BezierSegment2F { Point1 = new Vector2F(1, 2), ControlPoint1 = new Vector2F(10, 3), ControlPoint2 = new Vector2F(7, 8), Point2 = new Vector2F(10, 2), }; Assert.IsTrue(Vector2F.AreNumericallyEqual(s.Tangent1, s.GetTangent(0))); Assert.IsTrue(Vector2F.AreNumericallyEqual(s.Tangent2, s.GetTangent(1))); Assert.IsTrue(Vector2F.AreNumericallyEqual(b.GetTangent(0.7f), s.GetTangent(0.7f))); }
public void GetPoint() { CardinalSegment2F c = new CardinalSegment2F { Point1 = new Vector2F(1, 2), Point2 = new Vector2F(10, 3), Point3 = new Vector2F(7, 8), Point4 = new Vector2F(10, 2), Tension = 0.3f }; HermiteSegment2F h = new HermiteSegment2F { Point1 = c.Point2, Tangent1 = (1 - c.Tension) * (c.Point3 - c.Point1) * 0.5f, Tangent2 = (1 - c.Tension) * (c.Point4 - c.Point2) * 0.5f, Point2 = c.Point3, }; Assert.IsTrue(Vector2F.AreNumericallyEqual(c.Point2, c.GetPoint(0))); Assert.IsTrue(Vector2F.AreNumericallyEqual(c.Point3, c.GetPoint(1))); Assert.IsTrue(Vector2F.AreNumericallyEqual(h.GetPoint(0.33f), c.GetPoint(0.33f))); }