スポンサーリンク
描画した頂点の番号や座標値などを表示したいとき用。
#include <iostream> //VTK_MODULE_INITに必要 #include <vtkAutoInit.h> #include <Eigen/Dense> #include <vtkSmartPointer.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkActor.h> #include <vtkPolyDataMapper.h> #include <vtkPolyData.h> #include <vtkPoints.h> #include <vtkCellArray.h> #include <vtkUnsignedCharArray.h> #include <vtkProperty.h> #include <vtkPointData.h> //必須 VTK_MODULE_INIT(vtkRenderingOpenGL2); VTK_MODULE_INIT(vtkInteractionStyle);
// 座標群生製
std::vector<Eigen::Vector3d> make_cloud(int count) { std::vector<Eigen::Vector3d> cloud; for (size_t i = 0; i < count; i++) { double x = (double)rand() / (double)RAND_MAX; double y = (double)rand() / (double)RAND_MAX; double z = (double)rand() / (double)RAND_MAX; cloud.push_back(Eigen::Vector3d(x, y, z)); } return cloud; }
//////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// #include <vtkStringArray.h> #include <vtkLabeledDataMapper.h> #include <vtkActor2D.h> #include <vtkTextProperty.h>
// ラベルを表すPolyDataを作成 vtkSmartPointer<vtkPolyData> toLabel(const std::vector<Eigen::Vector3d>& data) { ////////////////////////// // auto points = vtkSmartPointer<vtkPoints>::New(); // インデックス文字列を作成 auto labels = vtkSmartPointer<vtkStringArray>::New(); labels->SetName("labels"); for (vtkIdType i = 0; i < data.size(); ++i) { std::string text = std::to_string(i); points->InsertNextPoint(data[i].data()); // 位置 labels->InsertNextValue(text.c_str()); // ラベル } auto polyData = vtkSmartPointer<vtkPolyData>::New(); polyData->SetPoints(points); polyData->GetPointData()->AddArray(labels); return polyData; }
// ラベル表示用のActorを作成 vtkSmartPointer<vtkActor2D> toLabelActor( vtkSmartPointer<vtkPolyData> poly, int fontSize = 20 ) { double color[3] = { 1.0, 1.0, 1.0 }; auto labelMapper = vtkSmartPointer<vtkLabeledDataMapper>::New(); labelMapper->SetInputData(poly); labelMapper->SetLabelModeToLabelFieldData(); labelMapper->SetFieldDataName("labels"); auto textProperty = labelMapper->GetLabelTextProperty(); textProperty->SetFontSize(fontSize); // フォントサイズ textProperty->SetColor(color); // 色 //textProperty->SetShadow(1); auto labelActor = vtkSmartPointer<vtkActor2D>::New(); labelActor->SetMapper(labelMapper); return labelActor; }
//////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// int main(int /*argc*/, char** /*argv*/) { auto renderer = vtkSmartPointer<vtkRenderer>::New(); auto cloud = make_cloud(10);// 座標群を作成 ////////////////////////////////////// // 座標にデータ番号を表示 auto textpoly = toLabel(cloud); vtkSmartPointer<vtkActor2D> textactor = toLabelActor(textpoly); renderer->AddActor(textactor);// ラベル表示 ////////////////////////////////////// renderer->ResetCamera(); auto interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); ////////////////////////////////////// auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); renderWindow->AddRenderer(renderer); renderWindow->SetInteractor(interactor); renderWindow->Render(); interactor->Start(); //イベントループへ入る return 0; }