Visualization Tool Kit(VTK)など

vtkのコンテナであるが妙に使いにくい。

  vtkActorCollection* pActorCollection = pvtkRenderer->GetActors();
  pActorCollection->InitTraversal(); //The data pointer is set at the beginning of the list. 
  while( ( vtkActor* pActor = pActorCollection ) != nullptr )
  {
    //Some
  }  

イテレータをつくるとfor_eachなどで回すことができるようになる。
  class SomeClass
  {
  public;
    class Iterator : std::iterator< std::forward_iterator_tag, vtkProp*>
    {
    public:
      Iterator() : mpCollection(nullptr), mpProp(nullptr) {};
      explicit Iterator( vtkProp3DCollection* pPropCollection ) : mpCollection( pPropCollection )
      {
        mpProp = mpCollection->GetNextProp();
      }
      Iterator(const Iterator& other) : mpCollection(other.mpCollection), mpProp(other.mpProp) {};
      Iterator& operator++() { Increment(); return *this; };
      Iterator& operator++(int) { Iterator old(*this); Increment(); return old; };
      bool operator==(const Iterator& other) { return Equal( other ); };
      bool operator!=(const Iterator& other) { return !Equal( other ); };
      vtkProp*  operator->() { return mpProp;};
      vtkProp*  operator*() { return mpProp;};

    protected:
      void Increment() { mpProp = mpCollection->GetNextProp(); };
      bool Equal( const Iterator& other ) { return mpProp == other.mpProp ? true : false; };
      vtkProp3DCollection* mpCollection;
      vtkProp3D* mpProp;
    };

    Iterator begin() { return Iterator(this); };
    Iterator end() { return Iterator(); };
  protected:
    vtkSmartPointer<vtkProp3DCollection> mpProps;
  };

//Sample
std::for_each( someClass.begin(), someClass.end(), [](vtkProp3D* prop) 
  {
    double* pos = prop->GetPosition();
    std::for_each( pos, pos+3, []( double p ) { std::cout << std::setw(15) << p; } );
    std::cout << std::endl;
  }
);


一度作ればvtkCollection独特の回し方に悩まなくてよい。
他にはoperator[]やsize()もつくっておけば、よりその後の効率はよくなるだろう。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu

メニュー

チュートリアル

アルゴリズム(数学)

並列計算

STL

#include<memory> #include<string> #include<sstream> #include<algorithm> #include<functional> #include<numeric>

Media Foundation

【メニュー編集】
Wiki記法ガイド

メンバーのみ編集できます