为什么 System.Numerics 命名空间中没有 Matrix3x3?C#

Fut*_*ake 6 c# macos vector matrix

我正在尝试用 C# 制作一个小型 GUI 库,但是在对矩阵变换进行了一些研究之后,我发现我需要一个 Matrix3x3 来存储 Vector2 的旋转、缩放和平移。但在 C# System.Numerics 中只有 Matrix3x2 或 Matrix4x4?我可以使用其中之一吗?如果是这样我该怎么办?为什么标准库中没有Matrix3x3?

我对矩阵和向量编程非常陌生,如果这是一个愚蠢的问题,我很抱歉。

提前致谢。

ja7*_*a72 3

您可以使用Matrix4x4。从单位矩阵开始,用矩阵填充左上角的 3\xc3\x973 元素。

\n\n

例如求解 3\xc3\x973 方程组:

\n\n
// Find the barycentric coordinates\n//\n// Solve for (wA,wB,wC):\n// | px |   | ax bx cx | | wA |\n// | py | = | ay by cy | | wB |\n// | pz |   | az bz cz | | wC |\n\nvar m = new Matrix4x4(\n    A.X, B.X, C.X, 0,\n    A.Y, B.Y, C.Y, 0,\n    A.Z, B.Z, C.Z, 0,\n    0, 0, 0, 1);\n\nif (Matrix4x4.Invert(m, out Matrix4x4 u))\n{\n    var w = new Vector3(\n        u.M11*P.X + u.M12*P.Y + u.M13*P.Z,\n        u.M21*P.X + u.M22*P.Y + u.M23*P.Z,\n        u.M31*P.X + u.M32*P.Y + u.M33*P.Z);\n\n    // ...\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

至于原因, 的意图System.Numerics必须与计算机图形学有关,因为它使用齐次坐标,其中 3D 向量包含 4 个元素。三个常规坐标和一个标量权重因子。计算机图形学的齐次坐标数学得到了极大的简化。存在 a 的唯一原因Vector3是 aVector4应该被视为 3 个元素加一个标量的向量,因此Vector3应该用于齐次坐标的合成和分解。这意味着并非所有 4 个元素都可以被同等对待,有时您需要将向量(前三个元素)与标量值(第四个元素)分开处理。

\n\n

System.Numerics使用单精度float元素,这些元素几乎从未用于科学计算,但因其速度而普遍应用于计算机图形学。希望有一天,当得到CLR支持时AVX512,将出现科学家可以实际使用的双精度数字内在函数。

\n