public static Matrix3d GetMapMatrix(Coordinates center, double fieldWidth, double fieldHeight, double rotation)
        {
            double offsetX = 0;
            double offsetY = 0;

            offsetX = -(((center.Lng + 180 - (fieldWidth / 2)) / 360));
            offsetY = -((1 - ((center.Lat + 90 + (fieldHeight / 2)) / 180)));

            var mat = new Matrix2d();

            double scaleX = 0;
            double scaleY = 0;

            scaleX = 360 / fieldWidth;
            scaleY = 180 / fieldHeight;
            mat = mat * Matrix2d.Translation(offsetX, offsetY);
            mat = mat * Matrix2d.Scaling(scaleX, scaleY);
            if (rotation != 0)
            {
                mat = mat * Matrix2d.Translation(-.5, -.5);
                mat = mat * Matrix2d.Rotation(rotation);
                mat = mat * Matrix2d.Translation(.5, .5);
            }

            return FromMatrix2d(mat);
        }
        public static Matrix2d Translation(double x, double y)
        {
            var mat = new Matrix2d {M31 = x, M32 = y};

            return mat;
        }
        public static Matrix3d FromMatrix2d(Matrix2d mat)
        {
            var mat3d = CreateIdentity();

            mat3d.M11 = mat.M11;
            mat3d.M12 = mat.M12;
            mat3d.M13 = mat.M13;
            mat3d.M21 = mat.M21;
            mat3d.M22 = mat.M22;
            mat3d.M23 = mat.M23;
            mat3d.M31 = mat.M31;
            mat3d.M32 = mat.M32;
            mat3d.M33 = mat.M33;
            mat3d._isNotKnownToBeIdentity = true;

            return mat3d;
        }
 public static Matrix2d Scaling(double x, double y)
 {
     var mat = new Matrix2d {M11 = x, M22 = y};
     return mat;
 }
 public static Matrix2d Rotation(double angle)
 {
     var mat = new Matrix2d
     {
         M11 = Math.Cos(angle),
         M21 = -Math.Sin(angle),
         M12 = Math.Sin(angle),
         M22 = Math.Cos(angle)
     };
     return mat;
 }
        public static Matrix2d Translation(double x, double y)
        {
            Matrix2d mat = new Matrix2d();
            mat.M31 = x;
            mat.M32 = y;

            return mat;
        }
 public static Matrix2d Scaling(double x, double y)
 {
     Matrix2d mat = new Matrix2d();
     mat.M11 = x;
     mat.M22 = y;
     return mat;
 }
 public static Matrix2d Rotation(double angle)
 {
     Matrix2d mat = new Matrix2d();
     mat.M11 = Math.Cos(angle);
     mat.M21 = -Math.Sin(angle);
     mat.M12 = Math.Sin(angle);
     mat.M22 = Math.Cos(angle);
     return mat;
 }