首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么System.Numerics命名空间中没有Matrix3x3?c#

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

Stack Overflow用户
提问于 2019-09-13 17:55:31
回答 1查看 936关注 0票数 4

我试图用c#做一个小的图形用户界面库,但是在研究了一些矩阵变换之后,我发现我需要一个Matrix3x3来存储Vector2的旋转、缩放和平移。但是在C# System.Numerics中只有一个Matrix3x2或Matrix4x4?我可以用其中的一个来代替吗?如果是这样的话,我该怎么做呢?为什么在标准库中没有Matrix3x3呢?

我对Matrix和Vector编程非常陌生,所以如果这是一个愚蠢的问题,我很抱歉。

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-13 20:20:53

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

例如,要求解一个3×3的方程组:

代码语言:javascript
复制
// Find the barycentric coordinates
//
// Solve for (wA,wB,wC):
// | px |   | ax bx cx | | wA |
// | py | = | ay by cy | | wB |
// | pz |   | az bz cz | | wC |

var m = new Matrix4x4(
    A.X, B.X, C.X, 0,
    A.Y, B.Y, C.Y, 0,
    A.Z, B.Z, C.Z, 0,
    0, 0, 0, 1);

if (Matrix4x4.Invert(m, out Matrix4x4 u))
{
    var w = new Vector3(
        u.M11*P.X + u.M12*P.Y + u.M13*P.Z,
        u.M21*P.X + u.M22*P.Y + u.M23*P.Z,
        u.M31*P.X + u.M32*P.Y + u.M33*P.Z);

    // ...
}

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

此外,System.Numerics使用单精度float元素,这些元素几乎从未在科学计算中使用过,但由于其速度而普遍应用于计算机图形。希望有一天,当CLR支持AVX512时,科学家们可以实际使用双精度数值内部函数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57921365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档