public static Matrix2x2d operator -(Matrix2x2d m1, Matrix2x2d m2) 
   	{
		Matrix2x2d kSum = new Matrix2x2d();
		for (int iRow = 0; iRow < 2; iRow++) {
			for (int iCol = 0; iCol < 2; iCol++) {
		    	kSum.m[iRow,iCol] = m1.m[iRow,iCol] - m2.m[iRow,iCol];
			}
		}
		return kSum;
   	}
	public static Matrix2x2d operator *(Matrix2x2d m1, Matrix2x2d m2) 
   	{
		Matrix2x2d kProd = new Matrix2x2d();
		for (int iRow = 0; iRow < 2; iRow++) {
			for (int iCol = 0; iCol < 2; iCol++) {
		    	kProd.m[iRow,iCol] = m1.m[iRow,0] * m2.m[0,iCol] + m1.m[iRow,1] * m2.m[1,iCol];
			}
		}
		return kProd;
   	}
	public static Matrix2x2d operator *(Matrix2x2d m, double s)
	{
		Matrix2x2d kProd = new Matrix2x2d();
		for (int iRow = 0; iRow < 2; iRow++) {
			for (int iCol = 0; iCol < 2; iCol++) {
		    	kProd.m[iRow,iCol] = m.m[iRow,iCol] * s;
			}
		}
		return kProd;
	}
Exemple #4
0
        protected override void UpdateNode()
        {
            var localToCamera    = (Matrix4x4d)GodManager.Instance.WorldToCamera * LocalToWorld;
            var localToScreen    = (Matrix4x4d)GodManager.Instance.CameraToScreen * localToCamera;
            var invLocalToCamera = localToCamera.Inverse();

            DeformedCameraPosition = invLocalToCamera * Vector3d.zero; // TODO : Really? zero?
            DeformedFrustumPlanes  = Frustum.GetFrustumPlanes(localToScreen);
            LocalCameraPosition    = Deformation.DeformedToLocal(DeformedCameraPosition);

            var m = Deformation.LocalToDeformedDifferential(LocalCameraPosition, true);

            var left  = DeformedFrustumPlanes[0].XYZ().Normalized();
            var right = DeformedFrustumPlanes[1].XYZ().Normalized();

            var fov = (float)MathUtility.Safe_Acos(-left.Dot(right));

            SplitDistance  = SplitFactor * Screen.width / 1024.0f * Mathf.Tan(40.0f * Mathf.Deg2Rad) / Mathf.Tan(fov / 2.0f);
            DistanceFactor = (float)Math.Max((new Vector3d(m.m[0, 0], m.m[1, 0], m.m[2, 0])).Magnitude(), (new Vector3d(m.m[0, 1], m.m[1, 1], m.m[2, 1])).Magnitude());

            if (SplitDistance < 1.1f || !MathUtility.IsFinite(SplitDistance))
            {
                SplitDistance = 1.1f;
            }

            // initializes data structures for horizon occlusion culling
            if (UseHorizonCulling && LocalCameraPosition.z <= TerrainQuadRoot.ZMax)
            {
                var deformedDirection = invLocalToCamera * Vector3d.forward;
                var localDirection    = (Deformation.DeformedToLocal(deformedDirection) - LocalCameraPosition).XY().Normalized();

                LocalCameraDirection = new Matrix2x2d(localDirection.y, -localDirection.x, -localDirection.x, -localDirection.y);

                for (int i = 0; i < HORIZON_SIZE; ++i)
                {
                    Horizon[i] = float.NegativeInfinity;
                }
            }

            TerrainQuadRoot.UpdateLOD();

            //Manager.GetSkyNode().SetUniforms(TerrainMaterial);
            //Manager.GetSunNode().SetUniforms(TerrainMaterial);
            Body.SetUniforms(TerrainMaterial);
            Deformation.SetUniforms(this, TerrainMaterial);

            //if (Manager.GetOceanNode() != null)
            //    Manager.GetOceanNode().SetUniforms(TerrainMaterial);
            //else
            TerrainMaterial.SetFloat("_Ocean_DrawBRDF", 0.0f);

            //if (Manager.GetPlantsNode() != null)
            //    Manager.GetPlantsNode().SetUniforms(TerrainMaterial);
        }
        public override double MahalanobisDistance(double x, double y)
        {
            Matrix2x2d C  = (new Matrix2x2d(Covariance)).Inverse;
            Vector2d   xm = new Vector2d(x - Mean[0], y - Mean[1]);

            Vector2d xmTC = new Vector2d();

            xmTC.x = xm.x * C.m00 + xm.y * C.m10;
            xmTC.y = xm.x * C.m01 + xm.y * C.m11;

            return(Math.Sqrt(Vector2d.Dot(xmTC, xm)));
        }
Exemple #6
0
    public static Matrix2x2d operator -(Matrix2x2d m1, Matrix2x2d m2)
    {
        Matrix2x2d kSum = new Matrix2x2d();

        for (int iRow = 0; iRow < 2; iRow++)
        {
            for (int iCol = 0; iCol < 2; iCol++)
            {
                kSum.m[iRow, iCol] = m1.m[iRow, iCol] - m2.m[iRow, iCol];
            }
        }
        return(kSum);
    }
Exemple #7
0
    public static Matrix2x2d operator *(Matrix2x2d m, double s)
    {
        Matrix2x2d kProd = new Matrix2x2d();

        for (int iRow = 0; iRow < 2; iRow++)
        {
            for (int iCol = 0; iCol < 2; iCol++)
            {
                kProd.m[iRow, iCol] = m.m[iRow, iCol] * s;
            }
        }
        return(kProd);
    }
Exemple #8
0
    public static Matrix2x2d operator *(Matrix2x2d m1, Matrix2x2d m2)
    {
        Matrix2x2d kProd = new Matrix2x2d();

        for (int iRow = 0; iRow < 2; iRow++)
        {
            for (int iCol = 0; iCol < 2; iCol++)
            {
                kProd.m[iRow, iCol] = m1.m[iRow, 0] * m2.m[0, iCol] + m1.m[iRow, 1] * m2.m[1, iCol];
            }
        }
        return(kProd);
    }
Exemple #9
0
    public Matrix2x2d Transpose()
    {
        Matrix2x2d kTranspose = new Matrix2x2d();

        for (int iRow = 0; iRow < 2; iRow++)
        {
            for (int iCol = 0; iCol < 2; iCol++)
            {
                kTranspose.m[iRow, iCol] = m[iCol, iRow];
            }
        }
        return(kTranspose);
    }
Exemple #10
0
        public static Matrix2x2d PolarDecomposition(Matrix2x2d m)
        {
            Matrix2x2d q = m + new Matrix2x2d(m.m11, -m.m10, -m.m01, m.m00);

            Vector2d c0 = q.GetColumn(0);
            Vector2d c1 = q.GetColumn(1);

            double s = c0.Magnitude;

            q.SetColumn(0, c0 / s);
            q.SetColumn(1, c1 / s);

            return(q);
        }
Exemple #11
0
        public void Transpose()
        {
            Matrix2x2d m = new Matrix2x2d();

            for (int i = 0; i < HALF_SIZE; i++)
            {
                for (int j = 0; j < HALF_SIZE; j++)
                {
                    m[j, i] = i + j * HALF_SIZE;
                }
            }

            Assert.AreEqual(Indexed2x2().Transpose, m);
        }
Exemple #12
0
        public void IndexAssignedTo()
        {
            Matrix2x2d m = new Matrix2x2d();

            for (int i = 0; i < SIZE; i++)
            {
                m[i] = i;
            }

            for (int i = 0; i < SIZE; i++)
            {
                Assert.AreEqual(i, m[i]);
            }
        }
Exemple #13
0
        public void CreatedFromArray2()
        {
            double[,] d = new double[, ] {
                { 0, 2 },
                { 1, 3 }
            };

            Matrix2x2d m = new Matrix2x2d(d);

            for (int i = 0; i < SIZE; i++)
            {
                Assert.AreEqual(i, m[i]);
            }
        }
Exemple #14
0
        Matrix2x2d Random2x2(int seed)
        {
            Random     rnd = new Random(seed);
            Matrix2x2d m   = new Matrix2x2d();

            for (int i = 0; i < HALF_SIZE; i++)
            {
                for (int j = 0; j < HALF_SIZE; j++)
                {
                    m[i, j] = rnd.NextDouble();
                }
            }

            return(m);
        }
Exemple #15
0
        /// <summary>
        ///     Resuelve las ecuaciones:
        ///     u * uux + v * vvx = pox
        ///     u * uuy + v * vvy = poy
        ///     Ayuda a determinar las coordenadas del punto <c>po</c> segun el plano formado por <c>uu</c> y <c>vv</c>.
        /// </summary>
        internal static void Resolve(Vector2d uu, Vector2d vv, Vector2d po,
                                     out double u, out double v)
        {
            // Resuelve la ecuacion:
            //   u * uux + v * vvx = pox
            //   u * uuy + v * vvy = poy
            //
            // Se replantea como:
            //
            //  /         \   /   \   /     \
            //  | uux vvx |   | u |   | pox |
            //  |         | * |   | = |     |
            //  | uuy vvy |   | v |   | poy |
            //  \         /   \   /   \     /
            //
            // Si se toma el primera y segunda ecuacion, se multiplican
            // por uuy y uux respectivamente y se restan:
            //   (u * uux * uuy + v * vvx * uuy) - (u * uuy * uux + v * vvy * uux) = pox * uuy - poy * uux
            // Simplificando:
            //   v * vvx * uuy - v * vvy * uux = pox * uuy - poy * uux
            // despejando v:
            //   v = (pox * uuy - poy * uux) / (vvx * uuy - vvy * uux)
            // Y despejando u en cualquier ecuacion:
            //   u = (pox - v * vvx) / uux
            // Por estabilidad numerica se intenta que los divisores esten lo mas alejados
            // posible del 0.

            /*v = (po.X * uu.Y - po.Y * uu.X) / (vv.X * uu.Y - vv.Y * uu.X);
             *
             * if (Math.Abs(uu.X) > Math.Abs(uu.Y))
             * {
             *  u = (po.X - v * vv.X) / uu.X;
             * }
             * else
             * {
             *  u = (po.Y - v * vv.Y) / uu.Y;
             * }*/

            // Se resuelve como un cambio de coordenadas.
            Matrix2x2d m = new Matrix2x2d(uu, vv);

            m.Inv();
            Point2d ret = m * po;

            u = ret.X;
            v = ret.Y;
        }
Exemple #16
0
    //public bool Inverse(ref Matrix2x2d mInv, double tolerance = 1e-06)
    public bool Inverse(ref Matrix2x2d mInv, double tolerance)
    {
        double det = Determinant();

        if (System.Math.Abs(det) <= tolerance)
        {
            return(false);
        }

        double invDet = 1.0 / det;

        mInv.m[0, 0] = m[1, 1] * invDet;
        mInv.m[0, 1] = -m[0, 1] * invDet;
        mInv.m[1, 0] = -m[1, 0] * invDet;
        mInv.m[1, 1] = m[0, 0] * invDet;
        return(true);
    }
Exemple #17
0
        public void Index2AssignedTo()
        {
            Matrix2x2d m = new Matrix2x2d();

            for (int i = 0; i < HALF_SIZE; i++)
            {
                for (int j = 0; j < HALF_SIZE; j++)
                {
                    m[i, j] = i + j * HALF_SIZE;
                }
            }

            for (int i = 0; i < HALF_SIZE; i++)
            {
                for (int j = 0; j < HALF_SIZE; j++)
                {
                    Assert.AreEqual(i + j * HALF_SIZE, m[i, j]);
                }
            }
        }
Exemple #18
0
 public Matrix2x2d(Matrix2x2d m)
 {
     System.Array.Copy(m.m, this.m, 4);
 }
Exemple #19
0
	public Matrix2x2d Transpose()
	{
	    Matrix2x2d kTranspose = new Matrix2x2d();
	    for (int iRow = 0; iRow < 2; iRow++) {
	        for (int iCol = 0; iCol < 2; iCol++) {
	            kTranspose.m[iRow,iCol] = m[iCol,iRow];
	        }
	    }
	    return kTranspose;
	}
Exemple #20
0
        public override void UpdateNode()
        {
            TerrainMaterial.renderQueue = (int)ParentBody.RenderQueue + ParentBody.RenderQueueOffset;

            // NOTE : Body shape dependent...
            LocalToWorld = Matrix4x4d.ToMatrix4x4d(ParentBody.transform.localToWorldMatrix) * FaceToLocal;

            TangentFrameToWorld = new Matrix3x3d(LocalToWorld.m[0, 0], LocalToWorld.m[0, 1], LocalToWorld.m[0, 2],
                                                 LocalToWorld.m[1, 0], LocalToWorld.m[1, 1], LocalToWorld.m[1, 2],
                                                 LocalToWorld.m[2, 0], LocalToWorld.m[2, 1], LocalToWorld.m[2, 2]);

            LocalToCamera = GodManager.Instance.View.WorldToCameraMatrix * LocalToWorld;
            LocalToScreen = GodManager.Instance.View.CameraToScreenMatrix * LocalToCamera;

            var invLocalToCamera = LocalToCamera.Inverse();

            DeformedCameraPosition = invLocalToCamera * Vector3d.zero;
            DeformedFrustumPlanes  = Frustum3d.GetFrustumPlanes(LocalToScreen); // NOTE : Extract frustum planes from LocalToScreen matrix...

            LocalCameraPosition = Deformation.DeformedToLocal(DeformedCameraPosition);

            DeformedLocalToTangent = Deformation.DeformedToTangentFrame(GodManager.Instance.View.WorldCameraPosition) * LocalToWorld * Deformation.LocalToDeformedDifferential(LocalCameraPosition);

            var m = Deformation.LocalToDeformedDifferential(LocalCameraPosition, true);

            var left  = DeformedFrustumPlanes[0].xyz.Normalized();
            var right = DeformedFrustumPlanes[1].xyz.Normalized();

            var fov = (float)Functions.Safe_Acos(-left.Dot(right));

            SplitDistance  = SplitFactor * Screen.width / 1024.0f * Mathf.Tan(40.0f * Mathf.Deg2Rad) / Mathf.Tan(fov / 2.0f);
            DistanceFactor = (float)Math.Max(new Vector3d(m.m[0, 0], m.m[1, 0], m.m[2, 0]).Magnitude(), new Vector3d(m.m[0, 1], m.m[1, 1], m.m[2, 1]).Magnitude());

            if (SplitDistance < 1.1f || SplitDistance > 128.0f || !Functions.IsFinite(SplitDistance))
            {
                SplitDistance = 1.1f;
            }

            var splitDistanceBlending = SplitDistance + 1.0f;

            DistanceBlending = new Vector2(splitDistanceBlending, 2.0f * SplitDistance - splitDistanceBlending);

            // Initializes data structures for horizon occlusion culling
            if (UseHorizonCulling && LocalCameraPosition.z <= TerrainQuadRoot.ZMax)
            {
                var deformedDirection = invLocalToCamera * Vector3d.forward;
                var localDirection    = (Deformation.DeformedToLocal(deformedDirection) - LocalCameraPosition).Normalized();

                LocalCameraDirection = new Matrix2x2d(localDirection.y, -localDirection.x, -localDirection.x, -localDirection.y);

                for (var i = 0; i < HORIZON_SIZE; ++i)
                {
                    Horizon[i] = float.NegativeInfinity;
                }
            }

            if (ParentBody.UpdateLOD)
            {
                TerrainQuadRoot.UpdateLOD();
            }

            SetUniforms(TerrainMaterial);
        }
Exemple #21
0
        protected override void UpdateNode()
        {
            TerrainMaterial.renderQueue = (int)ParentBody.RenderQueue + ParentBody.RenderQueueOffset;

            if (ParentBody.GetBodyDeformationType() == BodyDeformationType.Spherical)
            {
                LocalToWorld = Matrix4x4d.ToMatrix4x4d(ParentBody.transform.localToWorldMatrix) * FaceToLocal;
            }
            else
            {
                LocalToWorld = FaceToLocal;
            }

            TangentFrameToWorld = new Matrix3x3d(LocalToWorld.m[0, 0], LocalToWorld.m[0, 1], LocalToWorld.m[0, 2],
                                                 LocalToWorld.m[1, 0], LocalToWorld.m[1, 1], LocalToWorld.m[1, 2],
                                                 LocalToWorld.m[2, 0], LocalToWorld.m[2, 1], LocalToWorld.m[2, 2]);

            var localToCamera    = GodManager.Instance.WorldToCamera * LocalToWorld;
            var invLocalToCamera = localToCamera.Inverse();

            DeformedCameraPosition = invLocalToCamera * Vector3d.zero;
            DeformedFrustumPlanes  = Frustum.GetFrustumPlanes(GodManager.Instance.CameraToScreen * localToCamera); // NOTE : Extract frustum planes from LocalToScreen matrix...
            LocalCameraPosition    = Deformation.DeformedToLocal(DeformedCameraPosition);

            var m = Deformation.LocalToDeformedDifferential(LocalCameraPosition, true);

            var left  = DeformedFrustumPlanes[0].XYZ().Normalized();
            var right = DeformedFrustumPlanes[1].XYZ().Normalized();

            var fov = (float)MathUtility.Safe_Acos(-left.Dot(right));

            SplitDistance  = SplitFactor * Screen.width / 1024.0f * Mathf.Tan(40.0f * Mathf.Deg2Rad) / Mathf.Tan(fov / 2.0f);
            DistanceFactor = (float)Math.Max((new Vector3d(m.m[0, 0], m.m[1, 0], m.m[2, 0])).Magnitude(), (new Vector3d(m.m[0, 1], m.m[1, 1], m.m[2, 1])).Magnitude());

            if (SplitDistance < 1.1f || !MathUtility.IsFinite(SplitDistance))
            {
                SplitDistance = 1.1f;
            }

            // initializes data structures for horizon occlusion culling
            if (UseHorizonCulling && LocalCameraPosition.z <= TerrainQuadRoot.ZMax)
            {
                var deformedDirection = invLocalToCamera * Vector3d.forward;
                var localDirection    = (Deformation.DeformedToLocal(deformedDirection) - LocalCameraPosition).xy.Normalized();

                LocalCameraDirection = new Matrix2x2d(localDirection.y, -localDirection.x, -localDirection.x, -localDirection.y);

                for (byte i = 0; i < HORIZON_SIZE; ++i)
                {
                    Horizon[i] = float.NegativeInfinity;
                }
            }

            TerrainQuadRoot.UpdateLOD();

            SetUniforms(TerrainMaterial);

            if (ParentBody.AtmosphereEnabled)
            {
                if (ParentBody.Atmosphere != null)
                {
                    ParentBody.Atmosphere.SetUniforms(TerrainMaterial);
                }
            }

            if (ParentBody.OceanEnabled)
            {
                if (ParentBody.Ocean != null)
                {
                    ParentBody.Ocean.SetUniforms(TerrainMaterial);
                }
                else
                {
                    TerrainMaterial.SetFloat("_Ocean_DrawBRDF", 0.0f);
                }
            }
            else
            {
                TerrainMaterial.SetFloat("_Ocean_DrawBRDF", 0.0f);
            }

            Deformation.SetUniforms(this, TerrainMaterial);

            //if (Manager.GetPlantsNode() != null)
            //    Manager.GetPlantsNode().SetUniforms(TerrainMaterial);
        }
Exemple #22
0
	public Matrix2x2d(Matrix2x2d m)
	{
		System.Array.Copy(m.m, this.m, 4);
	}
Exemple #23
0
	//public Matrix2x2d Inverse(double tolerance = 1e-06)
	public Matrix2x2d Inverse(double tolerance)
	{
	    Matrix2x2d kInverse = new Matrix2x2d();
	    Inverse(ref kInverse, tolerance);
	    return kInverse;
	}
Exemple #24
0
	//public bool Inverse(ref Matrix2x2d mInv, double tolerance = 1e-06)
	public bool Inverse(ref Matrix2x2d mInv, double tolerance)
	{
	    double det = Determinant();
	
	    if (System.Math.Abs(det) <= tolerance) {
	        return false;
	    }
	
	    double invDet = 1.0 / det;
	
	    mInv.m[0,0] = m[1,1] * invDet;
	    mInv.m[0,1] = -m[0,1] * invDet;
	    mInv.m[1,0] = -m[1,0] * invDet;
	    mInv.m[1,1] = m[0,0] * invDet;
	    return true;
	}
Exemple #25
0
 public bool Equals(Matrix2x2d other)
 {
     return(this == other);
 }