在Rust中声明2D,3D矢量类型的惯用方法?

ide*_*n42 0 types linear-algebra rust

我正在寻找一些在空间中使用2D和3D点或方向的小型库
(矢量/矩阵感中的矢量,而不是Rust的Vec).

Rust不会在这里施加规则,所以你可以创建一个浮点元组,或者一个struct带有x, y, z成员的新元组.或单个data: [f64; 3]成员.

我想定义一个类型,而不是在这里使用的原因[f64; 3],就是这样我就可以宣布方法,例如length,normalizedAdd,Sub运营商.

什么是宣布小型2D-3D固定大小数据类型的良好基础?


请注意,虽然有很好的现有库,但我想编写自己的库,因为它只需要一些基本操作,我想了解内部发生的事情.

Luk*_*odt 6

这个问题相当广泛,没有明确的最佳表达方式来表达你想要的东西.这很大程度上取决于你打算用它做什么.

与其他答案相比,我会提出一个稍微不同的解决方案:使用带有x, y, z组件的结构并在最大程度上使用强类型.


矢量可以用来表示很多东西(点,颜色......); 你在谈论太空中的2D和3D点.首先要注意的是点向和向量向量之间的差异.是math.stackexchange的一个很好的答案,它很好地解释了这个主题.

这种差异可以反映在类型系统中以捕获逻辑错误.这正是cgmath在做什么.所以我要说你实际上想要两种类型定义如下:

struct Point3 {
    pub x: f32,
    pub y: f32,
    pub z: f32,
}
Run Code Online (Sandbox Code Playgroud)
  • 为什么没有元组结构或数组?写作的语义v.xv.0或更清晰v[0].如果你有一个矢量类型来表示任意数据,后两种情况是合适的.但正如我所提到的,我认为强打字是一个很好的选择,我们应该相应选择好名字.
  • 为什么pub为什么不?如果你在谈论空间中的点或方向,则没有无效的向量(忽略NaN浮点值).因此,没有理由限制对字段的访问.
  • 为什么f32好问题......实际上你应该使用一个类型参数,但是你需要有某种特质限制......

......这让我得出你不喜欢的结论:我认为这样做是正确的,"惯用"需要在这种情况下做一些工作.这项工作由图书馆完成cgmath.这个cgmath库特别有一个非常好的API设计,IMO.大多数功能都是通过特征(如VectorSpace)来实现的,这些特征反映了它背后的一些数学.我也想为自己的项目自己编写矢量类型,但我最终确信使用经过良好测试,设计良好的库.


那么如何"正确"呢?它是如何cgmath做到的:

  • 强大的打字
  • 适当的命名
  • 在抽象特征中具有大多数功能