/// <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: 一気に計算したほうがよさそう }
/// <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; }