我试图用c#做一个小的图形用户界面库,但是在研究了一些矩阵变换之后,我发现我需要一个Matrix3x3来存储Vector2的旋转、缩放和平移。但是在C# System.Numerics中只有一个Matrix3x2或Matrix4x4?我可以用其中的一个来代替吗?如果是这样的话,我该怎么做呢?为什么在标准库中没有Matrix3x3呢?
我对Matrix和Vector编程非常陌生,所以如果这是一个愚蠢的问题,我很抱歉。
提前谢谢。
发布于 2019-09-13 20:20:53
您可以使用Matrix4x4。从单位矩阵开始,用你的矩阵填充左上角的3×3个元素。
例如,要求解一个3×3的方程组:
// 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时,科学家们可以实际使用双精度数值内部函数。
https://stackoverflow.com/questions/57921365
复制相似问题