スポンサーリンク

VTKで指定座標に文字列表示

描画した頂点の番号や座標値などを表示したいとき用。

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

コメントを残す

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

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


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