Visualization Tool Kit(VTK)など

vtkFloatArrayなどのクラスはvtkDataArrya<T>の派生クラスである.
これらはスカラー値やテクスチャー座標系などvtkPolyData::vtkPointDataやvtkPolyData::vtkCellDataで使われている.

double* vtkDataArray<T>::GetTuple(vtkIdType id)

は配列のポインタを返すが,使用方法に注意点がある.下記コードは正しい値を得られない.

  vtkDataArray* tcoords = input_poly_data->GetPointData()->GetTCoords(); 
  double *uv1 = tcoords->GetTuple(id);
  double *uv2 = tcoords->GetTuple(id+1);
  double *uv3 = tcoords->GetTuple(id+2);

連続して値を取得する場合は下記のように領域確保は外部で行う必要がある.

  vtkDataArray* tcoords = input_poly_data->GetPointData()->GetTCoords(); 
  double uv1[3], uv2[3], uv3[3];
  tcoords->GetTuple(id, uv1);
  tcoords->GetTuple(id+1, uv2);
  tcoords->GetTuple(id+2, uv3);


実装は下記のようになっており,double* Tupleが使いまわされているからである.

//vtkDataArrayTemplate.h
template <class T>
class vtkDataArrayTemplate: public vtkDataArray
{
  //略
protected:
  double* Tuple;
};

//vtkDataArrayTemplate.txx
template <class T>
double* vtkDataArrayTemplate<T>::GetTuple(vtkIdType i)
{
  // Allocate a larger tuple buffer if needed.
  if(this->TupleSize < this->NumberOfComponents)
    {
    this->TupleSize = this->NumberOfComponents;
    free(this->Tuple);
    size_t s=static_cast<size_t>(this->TupleSize);
    this->Tuple = static_cast<double *>(malloc(s*sizeof(double)));
    }

  // Make sure tuple allocation succeeded.
  if(!this->Tuple)
    {
    vtkErrorMacro("Unable to allocate " << this->TupleSize
                  << " elements of size " << sizeof(double)
                  << " bytes. ");
    throw vtkstd::bad_alloc();
    }

  // Copy the data into the tuple.
  T* t = this->Array + this->NumberOfComponents*i;
  for(int j=0; j < this->NumberOfComponents; ++j)
    {
    this->Tuple[j] = static_cast<double>(t[j]);
    }
  return this->Tuple;
}

コメントをかく


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

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

Menu

メニュー

チュートリアル

アルゴリズム(数学)

並列計算

STL

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

Media Foundation

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

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