2

Boost 1.47で利用可能になった新しいジオメトリライブラリで遊んでいて、2D極系を定義できるかどうか知りたいと思っていました。ヘッダーファイルとドキュメントで極座標システムの定義を見つけましたが、以下のサンプルコードで使用しようとすると、コンパイルエラーが発生します。

using namespace boost;

typedef geometry::cs::polar<geometry::radian> geometry_type;  
typedef geometry::model::point<double, 2, geometry_type> point_type;

const double PI = math::constants::pi<double>();

point_type p1(0, 0);
point_type p2(1, PI/2);

double dist = geometry::distance(p1, p2); // COMPILATION FAILS HERE

VC2010では、上記の距離関数をコンパイルしようとすると、「エラーC2039:'type':は'boost :: geometry :: traits::cs_tag'のメンバーではありません」というメッセージが表示されます。

これは、ブーストヘッダーファイル(ブースト/ジオメトリ/コア/cs.hpp)から抽出された極座標系の定義です。

/*!
\brief Polar coordinate system
\details Defines the polar coordinate system "in which each point
    on a plane is determined by an angle and a distance"
\see http://en.wikipedia.org/wiki/Polar_coordinates
\ingroup cs
*/
template<typename DegreeOrRadian>
struct polar
{
    typedef DegreeOrRadian units;
};

しかし、「極性」は他のどこにも言及されていないので、定義は不完全だと思います。単純な2D極座標系のために、距離戦略やその他の必要な特性をすべて自分で定義することになっていますか?

4

2 に答える 2

3

さて、もう少し調査した後、私自身の質問に答えます(これで問題ないことを願っています):ジオメトリライブラリの意味での座標系について間違った考えを持っているようです。異なる座標系は、たとえば2点間の距離がデカルトの方法で計算されない、球の表面のような固有のジオメトリを指定しているように見えます。私が達成したかったこと(極座標系を使用)は、極座標を取得してX座標とY座標に変換する新しいポイントクラスを定義することで実行できます。新しいポイントクラスをBOOST_GEOMETRY_REGISTER_POINT_2Dマクロ(ブーストサンプルのように)に登録し、通常のデカルトシステムを使用すると、すべてのジオメトリアルゴリズムが期待どおりに機能します。

于 2011-07-25T15:25:58.990 に答える
1

タイプ特性の問題は、クライアントタイプごとに独自の特殊化を作成する必要があることです。

<traits>(これは、C ++ 0xの標準ライブラリには当てはまりません。)

于 2011-07-22T11:20:23.747 に答える