スポンサーリンク

vtkLookupTableで頂点に設定したスカラー値を元にサーモグラフィー着色

#include <iostream>

//VTK_MODULE_INITに必要
#include <vtkAutoInit.h>


#include <vtkSmartPointer.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>

//円筒とその表示に必要
#include <vtkPointData.h>
#include <vtkCellData.h>
#include <vtkPolyData.h>
#include <vtkActor.h>
#include <vtkPolyDataMapper.h>

#include <vtkLookupTable.h>
#include <vtkFloatArray.h>


#pragma comment(lib,"opengl32.lib")
#pragma comment(lib,"psapi.lib")
#pragma comment(lib,"dbghelp.lib")
#pragma comment(lib,"ws2_32.lib")

#include <vtkCellArray.h>
#include <vtkTriangle.h>

//必須
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);

//! @brief サーモグラフィー風のカラールックアップテーブルを生成する
//! @param [in] scalar_min スカラー値の最小値
//! @param [in] scalar_max スカラー値の最大値
//! @param [in] division スカラー値の範囲を何分割するか
//! @return カラールックアップテーブル
vtkSmartPointer<vtkLookupTable> ThermographyColorTable(const double scalar_min, const double scalar_max, const int division) {

  vtkSmartPointer<vtkLookupTable> lut = vtkSmartPointer<vtkLookupTable>::New();
  lut->SetNumberOfTableValues(division); // テーブルの要素数を設定
  lut->SetTableRange(scalar_min, scalar_max); // スカラー値の範囲を設定
  lut->Build();

  // テーブルの i 番目の要素に対応する色を設定
  for (int i = 0; i < division; i++)
  {
    double t = static_cast<double>(i) / float(division - 1);
    double r, g, b;
    if (t < 0.33)
    {
      // 青から緑への補間
      double factor = t / 0.33;
      r = 0.0;
      g = factor;
      b = 1.0 - factor;
    }
    else if (t < 0.66)
    {
      // 緑から黄への補間
      double factor = (t - 0.33) / 0.33;
      r = factor;
      g = 1.0;
      b = 0.0;
    }
    else
    {
      // 黄から赤への補間
      double factor = (t - 0.66) / 0.34;
      r = 1.0;
      g = 1.0 - factor;
      b = 0.0;
    }

    // テーブルの i 番目の要素に色を設定
    lut->SetTableValue(
      i  // テーブルの要素番号
      ,r,g,b,1.0
    );
  }
  return lut;
}

int
main(int, char* []) { ///////////////////////////// // 三頂点を定義 vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New(); points->InsertNextPoint(0.0, 0.0, 0.0); points->InsertNextPoint(1.0, 0.0, 0.0); points->InsertNextPoint(0.0, 1.0, 0.0); // 三角形を定義 vtkSmartPointer<vtkCellArray> triangles = vtkSmartPointer<vtkCellArray>::New(); vtkIdType pts[3] = { 0, 1, 2 }; triangles->InsertNextCell(3, pts); // ポリゴンデータを作成 vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New(); polyData->SetPoints(points); polyData->SetPolys(triangles); ///////////////////////////// // 各頂点にスカラー値を設定 vtkSmartPointer<vtkFloatArray> scalars = vtkSmartPointer<vtkFloatArray>::New(); scalars->SetName("MyScalarValues"); scalars->InsertNextValue(0.0); // 頂点0 に 0.0 を設定 scalars->InsertNextValue(50.0); // 頂点1 に 50.0 を設定 scalars->InsertNextValue(100.0); // 頂点2 に 100.0 を設定 polyData->GetPointData()->SetScalars(scalars); vtkSmartPointer<vtkFloatArray> scalars2 = vtkSmartPointer<vtkFloatArray>::New(); scalars2->SetName("MyScalarValues2"); scalars2->InsertNextValue(0.0); // 頂点0 に 0.0 を設定 scalars2->InsertNextValue(90.0); // 頂点1 に 50.0 を設定 scalars2->InsertNextValue(0.0); // 頂点2 に 100.0 を設定 polyData->GetPointData()->AddArray(scalars2); polyData->GetPointData()->SetActiveScalars("MyScalarValues"); ///////////////////////////// // ルックアップテーブルの設定 // scalar_min から scalar_max までのスカラー値を 100 段階に分け、それぞれの範囲に対応する色を設定 float scalar_min = 0.0; float scalar_max = 100.0; // スカラー値の最小値と最大値 int division = 200; // スカラー値の範囲を何分割するか vtkSmartPointer<vtkLookupTable> thermocolor = ThermographyColorTable(scalar_min, scalar_max,division); ///////////////////////////// // マッパーとアクターの設定 vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); mapper->SetInputData(polyData); mapper->SetLookupTable(thermocolor); mapper->SetScalarRange(scalar_min, scalar_max); // スカラー値の補間を先に行い、その後ルックアップテーブルで色を決定 mapper->SetInterpolateScalarsBeforeMapping(true); vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); actor->SetMapper(mapper); ///////////////////////////// // レンダラー等の設定 vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); renderer->AddActor(actor); renderer->SetBackground(0.1, 0.1, 0.1); vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); renderWindow->AddRenderer(renderer); renderWindow->SetSize(800, 600); vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); interactor->SetRenderWindow(renderWindow); renderWindow->Render(); interactor->Start(); return EXIT_SUCCESS; }
division=100
division=4

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: