API设计,从变量基矢量创建矩阵

时间:2014-08-13 21:37:04

标签: c# linear-algebra

给定两个基矢量,计算矩阵。这不是问题,但我最终做了很多事情。

此类代码的示例:

var uvec = (currentPos - origin);
if (uvec.LengthSquared() <= float.Epsilon)
    uvec = Vector3.Up;
else
    uvec.Normalize();

var fvec = Forward; // Fixed value

var rvec = Vector3.Cross(fvec, uvec);
if (rvec.LengthSquared() <= float.Epsilon)
    rvec = Vector3.Right;
else
    rvec.Normalize();

fvec = Vector3.Cross(uvec, rvec);
fvec.Normalize();

var mat = Matrix.Identity;
mat.Forward = fvec;
mat.Right = rvec;
mat.Up = uvec;            
mat.Translation = currentPos;

我想要的是一种类似......的方法。

public static class MatrixEx
{
    public static Matrix CreateFromVectors(...);
}

但是有各种不同的情况......

  • 3个基础向量,只需要用它们初始化矩阵。
  • 2个基础向量,计算第三个。
  • 1个基矢量,1'近似'基矢量,计算第3个,重新计算第2个。

所以问题是,如何在不诉诸巨型嵌套if / else的情况下实现这样的方法来处理这些情况?

或者,如果不是这样的方法,那么“干净又高效”的api会是什么?例如,从客户的角度来看,这个api很难使用,不是因为这个设计违反了抽象代码设计原则'foo'。

0 个答案:

没有答案