Exemplo n.º 1
0
        /// <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;
        }
Exemplo n.º 2
0
 /// <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());
 }
Exemplo n.º 3
0
 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()));
 }
Exemplo n.º 4
0
 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()));
 }
Exemplo n.º 5
0
 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()));
 }
Exemplo n.º 6
0
 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()));
 }
Exemplo n.º 7
0
 public void InvertedTest2()
 {
     Transform2 t = new Transform2();
     t.Rotation = 123;
     Transform2 tInverted = t.Inverted();
     Assert.IsTrue(Matrix4Ext.AlmostEqual(t.GetMatrix(), tInverted.GetMatrix().Inverted()));
 }
Exemplo n.º 8
0
 public void InvertedTest1()
 {
     Transform2 t = new Transform2();
     t.SetScale(new Vector2(5, -5));
     Transform2 tInverted = t.Inverted();
     Assert.IsTrue(t.GetMatrix() == tInverted.GetMatrix().Inverted());
 }
Exemplo n.º 9
0
 public void InvertedTest0()
 {
     Transform2 t = new Transform2();
     Transform2 tInverted = t.Inverted();
     Assert.IsTrue(t.GetMatrix() == tInverted.GetMatrix().Inverted());
 }