标准化 2D/3D 矢量/坐标类

Standardize 2D/3D Vector / Coordinate Class

本文关键字:坐标 矢量 3D 2D 标准化      更新时间:2023-10-16

问题
这是困扰我一段时间的事情,但我找不到明确的答案:

  • 有没有人知道将标准 2D 和/或 3D 向量(具有 x、y 和 z 成员的结构)引入 STL 的建议?
  • 如果没有,有没有一种现实的方法可以让这样的类进入标准的下一个版本——而不是自己写一个完整且写得完美的提案?
  • 而且,是否有任何充分的理由(除了没有人有时间)为什么还没有这样做?

绝对愿意做出贡献,但我相信我缺乏经验来制作足够高质量的东西来被接受(我不是专业程序员)。

推理/背景
到目前为止,我已经看到了数十个库和框架(无论是图形,物理,数学,导航,传感器融合......),它们基本上都实现了自己的版本。

struct Vector2d {
    double x,y;
    //...
};
/* ...
 * operator overloads
 */

和/或其 3D 等效物 - 更不用说所有场合,在我花时间做一个适当的、可重用的版本之前,我自己实现了。
显然,这不是什么困难的事情,我也不担心次优实现,但是每次我想组合两个库或重用来自不同项目的代码时,我都必须注意将一个版本转换为另一个版本(通过强制转换或 - 如果可能 - 文本替换)。

现在委员会正在努力显着扩展 c++17 的标准库(尤其是使用 2D 图形框架),我真的很想从一开始就将一个通用的 2D 向量烘焙到所有接口中,所以我可以写例如:

drawLine(transformCoordinates(trackedObject1.estimatePos(),params), 
         transformCoordinates(trackedObject2.estimatePos(),params));

而不是

MyOwnVec2D t1{trackedObject1.estimatePosX(), trackedObject1.estPosY()};
MyOwnVec2D t2{trackedObject2.estimatePosX(), trackedObject2.estPosY()};
t1 = transformCoordinates(t1,params);
t2 = transformCoordinates(t2,params);
drawLine(t1.x,t1.y,t2.x,t2.y);

这个例子可能有点夸张,但我认为它表明了我的观点。

我知道 std::valarray ,它已经朝着正确的方向发展,因为它允许加法和乘法等标准操作,但如果只需要两个或三个坐标,它就会承担太多的重量。我认为具有固定大小且没有动态内存分配(例如基于 std::array)的 valarray 将是一个可接受的解决方案,特别是因为它将带有一个微不足道的迭代器实现,但我个人更喜欢具有 x、y(和 z)成员的类。

备注:如果这个话题已经讨论过了,我很抱歉(如果没有讨论过,我会感到惊讶),但是每次我搜索 2d 向量时,我都会得到关于std::vector<std::vector<T>>或如何实现某种转换之类的结果,但没有关于标准化主题的内容。

有什么充分的理由(除了没有人有时间)为什么还没有这样做?

基本上没有理由这样做。

形成包含两个或三个元素的类型是完全简单的,所有操作也可以简单定义。此外,C++标准库并不打算成为通用的数学工具套件:如果您认真对待数学类型和结构,超出可以在半小时内组合在一起的函数和运算符,那么使用专门的第三方库是有意义的。

而且我们不会标准化不需要标准化的东西。

如果C++要获得某种标准化的3D图形API,那么我可以看到这种情况会发生变化,但在此之前不会。希望C++永远不会获得任何类型的标准化3D图形API,因为这不是它的用途。

然而,如果你对此有强烈的感觉,你可以在所有专家(和一些肯定不是专家)居住的地方开始一场关于性病讨论的对话;有时这样的对话会导致提案的形成,最终写的不一定是你。

如果其他人对此感兴趣,我想指出 2014 年 7 月版的"向C++添加 2D 图形渲染和显示的提案"包括 2D 点类/结构(我的问题基于 2014 年 1 月的初稿)。所以也许在 c++1z 中至少会有一个简单的标准 2D 向量。