public static Vector3 ToPointZisW(MyMatrix4x1 m)
        {
            float x = m.points[0, 0];
            float y = m.points[1, 0];
            float z = m.points[2, 0];

            return(new Vector3(x, y, z / m.points[3, 0]));
        }
        public static MyMatrix4x1 FromPoint4x1(Vector3 vector)
        {
            MyMatrix4x1 temp = new MyMatrix4x1();

            temp.points[0, 0] = vector.X;
            temp.points[1, 0] = vector.Y;
            temp.points[2, 0] = vector.Z;
            return(temp);
        }
        public static MyMatrix4x1 operator *(MyMatrix4x4 A, MyMatrix4x1 B)
        {
            MyMatrix4x1 C = new MyMatrix4x1();

            for (var i = 0; i < 4; i++)
            {
                C.points[i, 0] = 0;

                for (var k = 0; k < 4; k++)
                {
                    C.points[i, 0] += A.points[i, k] * B.points[k, 0];
                }
            }

            return(C);
        }
        public static Vector3 ToPoint(MyMatrix4x1 m, float A, float B, float C, float D, float E, int width, int height)
        {
            float x = m.points[0, 0];
            float y = m.points[1, 0];
            float z = m.points[2, 0];
            float w = m.points[3, 0];

            //x = (A * x) / (D * z);
            //y = (B * y) / (D * z);


            //x = (x) * width;
            //y = (y) * height;


            //z = (C * z + E * w * E) / (D * z);
            //z = MathF.Log2(MathF.Max(1e-6f, 1.0f + w)) * 2.0f / MathF.Log2(100f + 1.0f) - 1.0f;
            //z = MathF.Log2(1 * z + 1) / MathF.Log2(1 * 100f + 1) * w;
            //Debug.WriteLine(z);

            return(new Vector3(x, y, z));
        }