/// <summary> /// Returns a polygon in world space representing the 2D FOV through the portal. /// Polygon is not guaranteed to be non-degenerate which can occur if the viewPoint is edge-on to the portal. /// </summary> public static Vector2[] GetFov(IPortal portal, Vector2 viewPoint, float distance, int detail, Transform2 transform) { Matrix4 a = transform.GetMatrix(); Vector2[] verts = new Vector2[detail + 2]; Vector2[] portalVerts = Portal.GetVerts(portal); for (int i = 0; i < portalVerts.Length; i++) { Vector4 b = Vector4.Transform(new Vector4(portalVerts[i].X, portalVerts[i].Y, 0, 1), a); verts[i] = new Vector2(b.X, b.Y); } //Minumum distance in order to prevent self intersections. const float errorMargin = 0.01f; float distanceMin = Math.Max((verts[0] - viewPoint).Length, (verts[1] - viewPoint).Length) + errorMargin; distance = Math.Max(distance, distanceMin); //get the leftmost and rightmost edges of the FOV verts[verts.Length - 1] = (verts[0] - viewPoint).Normalized() * distance + viewPoint; verts[2] = (verts[1] - viewPoint).Normalized() * distance + viewPoint; //find the angle between the edges of the FOV double angle0 = MathExt.AngleLine(verts[verts.Length - 1], viewPoint); double angle1 = MathExt.AngleLine(verts[2], viewPoint); double diff = MathExt.AngleDiff(angle0, angle1); Debug.Assert(diff <= Math.PI + double.Epsilon && diff >= -Math.PI); //handle case where lines overlap eachother /*const double angleDiffMin = 0.0001f; if (Math.Abs(diff) < angleDiffMin) { return new Vector2[0]; }*/ Matrix2 Rot = Matrix2.CreateRotation((float)diff / (detail - 1)); for (int i = 3; i < verts.Length - 1; i++) { verts[i] = Vector2Ext.Transform(verts[i - 1] - viewPoint, Rot) + viewPoint; } return verts; }
/// <summary> /// Get the portal's vertices in world coordinates. /// </summary> public static Vector2[] GetWorldVerts(IPortal portal, Transform2 worldTransform) { return Vector2Ext.Transform(GetVerts(portal), worldTransform.GetMatrix()); }
public void TransformTest1() { Transform2 t0 = new Transform2(new Vector2(1,1), -2, 3.21f); Transform2 t1 = new Transform2(new Vector2(-100, 2), 3, 123); Transform2 result = t0.Transform(t1); Assert.IsTrue(Matrix4Ext.AlmostEqual(result.GetMatrix(), t0.GetMatrix() * t1.GetMatrix())); }
public void TransformTest8() { Transform2 t0 = new Transform2(new Vector2(), 1, 2, true); Transform2 t1 = new Transform2(new Vector2(), 1, 3.4f, true); Transform2 result = t0.Transform(t1); Assert.IsTrue(Matrix4Ext.AlmostEqual(result.GetMatrix(), t0.GetMatrix() * t1.GetMatrix())); }
public void InvertedTest8() { Transform2 t = new Transform2(); t.Position = new Vector2(2, 1); t.SetScale(new Vector2(-5, 5)); t.Rotation = (float)(Math.PI / 3.4); Transform2 tInverted = t.Inverted(); Assert.IsTrue(Matrix4Ext.AlmostEqual(t.GetMatrix(), tInverted.GetMatrix().Inverted())); }
public void InvertedTest4() { Transform2 t = new Transform2(); t.SetScale(new Vector2(5, -5)); t.Rotation = (float)Math.PI / 3; Transform2 tInverted = t.Inverted(); Assert.IsTrue(Matrix4Ext.AlmostEqual(t.GetMatrix(), tInverted.GetMatrix().Inverted())); }
public void InvertedTest2() { Transform2 t = new Transform2(); t.Rotation = 123; Transform2 tInverted = t.Inverted(); Assert.IsTrue(Matrix4Ext.AlmostEqual(t.GetMatrix(), tInverted.GetMatrix().Inverted())); }
public void InvertedTest1() { Transform2 t = new Transform2(); t.SetScale(new Vector2(5, -5)); Transform2 tInverted = t.Inverted(); Assert.IsTrue(t.GetMatrix() == tInverted.GetMatrix().Inverted()); }
public void InvertedTest0() { Transform2 t = new Transform2(); Transform2 tInverted = t.Inverted(); Assert.IsTrue(t.GetMatrix() == tInverted.GetMatrix().Inverted()); }