2015-01-08 64 views
5

問題
這東西是纏着我有一段時間了,但我無法找到它一個明確的答案:標準化2D/3D矢量/協調課程

  • 是任何人都知道的向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,它已經朝着正確的方向發展,因爲它允許像加法和乘法這樣的標準操作,但是如果你所需要的只是兩個或三個座標,它將承受太多的重量。我認爲具有固定大小和沒有動態內存分配(例如基於std::array)的valarray將是一個可接受的解決方案,尤其是因爲它會帶來一個簡單的迭代器實現,但我個人更喜歡帶有x,y(和z )成員。

:我很抱歉,如果這個話題已經討論過了(如果它沒有我會感到很驚訝),但每次我在尋找2D矢量我得到的結果在談論類似std::vector<std::vector<T>>或者如何實現某種轉變,但對標準化的話題沒有任何規定。

+0

*有沒有一種現實的方法可以讓這樣的課程進入下一個版本的標準 - 我自己寫一個完整的,完全寫作的提案還不夠?* - 說服其他人這樣做。這就是C++的發展方向。 –

+0

@BartekBanachewicz:關於如何做到這一點或在哪裏尋求幫助來撰寫提案(如果您不是在一家軟件公司工作)的任何提示? – MikeMB

+1

我從閱讀現有的建議開始。 –

回答

4

有沒有什麼好的理由(除了沒有人有時間)爲什麼這還沒有完成?

基本上沒有理由。形成一個包含兩個或三個元素的類型是非常平凡的,所有的操作也可以被簡單地定義。此外,C++標準庫並不打算成爲一個通用的數學工具包:如果您認真考慮數學類型和超出函數和操作符的構造,則可以使用專門的第三方庫半小時。

而且我們不標準化不需要標準化的東西。

如果C++獲得某種標準的3D圖形API,那麼我可以看到這種變化,但直到那時才能看到。希望C++永遠不會獲得任何標準的3D圖形API,因爲這不是它的目的。

但是,如果您對此感到強烈,您可以開始所有專家(以及一些非專家)生活的對話std-discussion;有時候這樣的對話導致了提案的形成,並不一定是你最終寫出來的。

+0

如果C++要獲得某種標準化的3D圖形API,那麼它肯定會被推廣到使用您選擇的座標類型。 C++喜歡只爲您需要的付費,而不是在每個API邊界收費站「納稅」。 – sehe

+0

@sehe:也許我完全錯過了你的觀點,但是如何?一個實現使用純數據成員,另一個setter和getter方法。一個可能會命名座標x,y,z,另一個x1,x2,x3,第三個可能需要數組樣式訪問。 – MikeMB

+0

@MikeMB請參閱[** Boost Geometry **設計原理](http://www.boost.org/doc/libs/1_57_0/libs/geometry/doc/html/geometry/design.html)以及整個** [Boost Propertymap](http://www.boost.org/doc/libs/1_57_0/libs/property_map/doc/property_map.html)**庫..通用訪問是多功能C++ API中的一個關鍵工具設計 – sehe