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;
}