Esempio n. 1
0
        /// <summary>
        /// Transformを計算します。
        /// </summary>
        /// <param name="position">座標</param>
        /// <param name="angle">角度(弧度法)</param>
        /// <param name="scale">拡大率</param>
        /// <returns></returns>
        internal static Matrix44F CalcTransform(Vector2F position, float angle, Vector2F scale)
        {
            var matPosition = Matrix44F.GetTranslation2D(position);
            var matRotate   = Matrix44F.GetRotationZ(angle);
            var matScale    = Matrix44F.GetScale2D(scale);

            return(matPosition * matRotate * matScale);
            // NOTE: 一気に計算したほうがよさそう
        }
Esempio n. 2
0
        /// <summary>
        /// <see cref="Matrix44F"/>から2次元座標,拡大率,角度を算出します。
        /// </summary>
        /// <param name="transform">計算元となる4x4行列</param>
        /// <param name="absolutePosition">出力される座標</param>
        /// <param name="scale">出力される拡大率</param>
        /// <param name="angle">出力される角度(度数法)</param>
        public static void CalcFromTransform2D(Matrix44F transform, out Vector2F absolutePosition, out Vector2F scale, out float angle)
        {
            absolutePosition = new Vector2F(transform[0, 3], transform[1, 3]);
            var sx = new Vector3F(transform[0, 0], transform[1, 0], transform[2, 0]).Length;
            var sy = new Vector3F(transform[0, 1], transform[1, 1], transform[2, 1]).Length;

            scale      = new Vector2F(sx, sy);
            transform *= Matrix44F.GetScale2D(new Vector2F(sx == 0 ? 1f : (1f / sx), sy == 0 ? 1f : (1f / sy)));
            angle      = new Vector2F(transform[0, 0], transform[1, 0]).Degree;
        }