2013-08-26 85 views
2

我發現與本徵對象作爲參數繁瑣的功能設計。雖然Eigen Documentation中的信息很有幫助,但它爲模板參數提供了一種尷尬的方法。假設,我們想寫一個幾何例程,如線平面交點。一個簡單而透明的做法是:最佳實踐作爲參數

template<typename _Tp> 
bool planeLineIntersect(const Eigen::Matrix<_Tp, 3, 1>& planePoint, 
         const Eigen::Matrix<_Tp, 3, 1>& planeNormal, 
         const Eigen::Matrix<_Tp, 3, 1>& linePoint, 
         const Eigen::Matrix<_Tp, 3, 1>& lineDir, 
         Eigen::Matrix<_Tp, 3, 1>& intersectionPoint) 

這看起來比較悅目的人,看起來在這個可以學習,每個參數都必須是同一類型的3D矢量。但是,直接地,這不允許任何類型的Eigen表達式(我們必須爲每個表達式調用Eigen :: Matrix構造函數,我們使用它)。因此,如果使用表達式,我們需要創建不必要的臨時對象。

建議的解決方案是:

template<typename Derived1, typename Derived2, typename Derived3, typename Derived4, typename Derived5> 
bool planeLineIntersect(const Eigen::MatrixBase<Derived1>& planePoint, 
         const Eigen::MatrixBase<Derived2>& planeNormal, 
         const Eigen::MatrixBase<Derived3>& linePoint, 
         const Eigen::MatrixBase<Derived4>& lineDir, 
         const Eigen::MatrixBase<Derived5>& intersectionPoint) 

這並沒有透露任何關於預計的矩陣,也沒有哪個參數用於輸入和輸出,因爲我們有一個常量播的intersectionPoint允許輸出參數中的表達式。據我所知,這是允許所有功能參數中的Eigen表達式的唯一方法。儘管表達不夠支持,但第一部分仍然看起來更可愛。

我的問題:

  1. 你會考慮第二代碼片段在這個例子中的最佳解決方案?
  2. 你曾經使用的輸出參數的常量播解決方案或者你認爲這是不值得的透明度的損失?
  3. 您使用Eigen函數書寫的哪些準則/最佳實踐?

回答

1

對於這樣小的固定大小的物體,我不費心思,並與第一溶液去。

這是很少的一個好方法具有輸出功能參數。在你特定的情況下,一種方法是創建一個PlaneLineIntersection類,它的ctor將採用一個平面和一條線,存儲交集的結果,然後提供訪問器來查詢計算結果(沒有交集,它是一個點,一條線)。

順便說一句,你有沒有注意到的超平面和ParametrizedLine類徵/幾何模塊? ParametrizedLine類有一個帶HyperPlane的intersectionPoint成員(儘管它是有限的,因爲它假設交集確實存在,並且它是一個點)。

+0

爲什麼你認爲使用輸出參數不是一個好方法?我發現一個函數對象爲此目的有點臃腫。有或沒有表達式,這樣的對象將不得不爲結果分配內存。另外,我需要額外的代碼行來進行構建/初始化並讀取結果。我在代碼中不使用特徵類型,因爲我做了很多幾何計算,並且需要將歸一化的數量保持爲最小(儘管這個函數不是那麼好的例子)。 –