簡體   English   中英

標准化2D / 3D矢量/坐標類

[英]Standardize 2D/3D Vector / Coordinate Class


這有點困擾我一段時間了,但我找不到一個確定的答案:

  • 是否有人知道有關向STL引入標准2D和/或3D矢量(具有x,y和z成員的結構)的提議?
  • 如果沒有,是否有一種現實的方法可以將這樣的課程納入標准的下一版本 - 缺少自己編寫一份完整且完美的書面提案?
  • 並且,有什么好的理由(除了沒有人有時間)為什么還沒有這樣做?

我絕對願意做出貢獻,但我相信我缺乏足夠高質量的東西才能被接受(我不是專業程序員)。

推理/背景
到現在為止,我已經看到了幾十個庫和框架(無論是圖形,物理,數學,導航,傳感器融合等......)都基本實現了自己的版本

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 ,它已經朝着正確的方向前進,因為它允許標准操作,如加法和乘法,但如果你只需要兩個或三個坐標,它就會帶來太多的重量。 我認為一個具有固定大小且沒有動態內存分配的valarray(例如基於std::array )將是一個可接受的解決方案,特別是因為它會帶有一個簡單的迭代器實現,但我個人更喜歡帶有x,y的類(和z)成員。

備注 :如果這個話題已經討論過,我很抱歉(如果沒有,我會感到驚訝),但每次我搜索2d向量時,我都會得到類似std::vector<std::vector<T>>或如何實現某種轉換,但沒有關於標准化的話題。

有什么好的理由(除了沒有人有時間)為什么還沒有這樣做?

基本上沒有理由。

形成包含兩個或三個元素的類型是完全無關緊要的,並且所有操作也可以簡單地定義。 此外,C ++標准庫並不是一個通用的數學工具套件:如果您認真考慮數學類型和構造超出函數和運算符,那么使用專用的第三方庫是有意義的。半小時。

而且我們沒有標准化不需要標准化的事情。

如果C ++獲得某種標准化的3D圖形API,那么我可以看到這種變化,但直到那時。 並且希望C ++永遠不會獲得任何類型的標准化3D圖形API,因為它不是它的用途。

但是,如果你對此有強烈的興趣,你可以開始討論所有專家(以及一些肯定是非專家)生活的std討論 有時,這樣的對話會導致提案的形成,並且不一定是你最終寫出來的。

如果其他人對它感興趣,我想指出2014年7月版“將2D圖形渲染和顯示添加到C ++的建議”包括2D點類/結構(我的問題是基於初始草案從2014年1月起)。 所以也許在c ++ 1z中至少會有一個簡單的標准2D-Vector。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM