#pragma once
#include <vtkCellArray.h>
#include <vtkPoints.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkDoubleArray.h>
#include <vtkSmartPointer.h>
#include <vtkPointData.h>
#include <vtkProperty.h>
#include <vtkLine.h>
#include "vtkFromO3dCommon.hpp"
#include <open3d/Open3D.h>
namespace vtko3d {
vtkSmartPointer<vtkPolyData> toLineSetPolyData(const open3d::geometry::LineSet& linesegments, USEVALUE usedata) {
// 頂点の作成
vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
// 色情報の配列
vtkSmartPointer<vtkDoubleArray> colors = vtkSmartPointer<vtkDoubleArray>::New();
colors->SetNumberOfComponents(3);
colors->SetName("Colors");
for (size_t i = 0; i < linesegments.points_.size(); i++) {
double x = linesegments.points_[i].x();
double y = linesegments.points_[i].y();
double z = linesegments.points_[i].z();
points->InsertNextPoint(x, y, z);
if (usedata & POINT_RGB) {
double r = linesegments.colors_[i].x();
double g = linesegments.colors_[i].y();
double b = linesegments.colors_[i].z();
colors->InsertNextTuple3(r, g, b); // 色情報追加
}
}
// 線分(Cell)を定義
vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();
for (size_t i = 0; i < linesegments.lines_.size(); i++) {
size_t v1 = linesegments.lines_[i].x();
size_t v2 = linesegments.lines_[i].y();
// 線分を作成
auto line = vtkSmartPointer<vtkLine>::New();
line->GetPointIds()->SetId(0, v1); // 始点
line->GetPointIds()->SetId(1, v2); // 終点
lines->InsertNextCell(line);
}
// PolyDataへ格納
vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();
polyData->SetPoints(points);
polyData->SetLines(lines);
polyData->GetPointData()->SetScalars(colors);
return polyData;
}
vtkSmartPointer<vtkActor> toLineSegmentsActor(vtkSmartPointer<vtkPolyDataMapper> mapper, std::optional< std::array<double, 3> > single_color = std::nullopt, int line_width = 1) {
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
if (single_color.has_value()) {
actor->GetProperty()->SetColor(single_color.value()[0], single_color.value()[1], single_color.value()[2]);
}
else {
actor->GetProperty()->SetColor(1.0, 1.0, 1.0); // デフォルトは白色
}
if (line_width > 0) {
actor->GetProperty()->SetLineWidth(line_width); // 線の太さ
}
return actor;
}
std::shared_ptr<open3d::geometry::LineSet> createSampleLineSegments() {
auto linesets = std::make_shared<open3d::geometry::LineSet>();
for (size_t i = 0; i < 1000; i++) {
for (size_t j = 0; j < 100; j++) {
double x1 = (double)rand() / (double)RAND_MAX;
double y1 = (double)rand() / (double)RAND_MAX;
double z1 = 0.0;// (double)rand() / (double)RAND_MAX;
double x2 = x1;
double y2 = y1;
double z2 = 1.0;// (double)rand() / (double)RAND_MAX;
linesets->points_.emplace_back(x1, y1, z1);
linesets->points_.emplace_back(x2, y2, z2);
linesets->colors_.emplace_back(x1, y1, z1); // 赤色のライン
linesets->colors_.emplace_back(x2, y2, z2); // 青色のライン
linesets->lines_.emplace_back(i * 2, i * 2 + 1); // ラインセグメントのインデックス
}
}
return linesets;
}
}
auto linesegments = vtko3d::createSampleLineSegments();
auto polyData = vtko3d::toLineSetPolyData(*linesegments, vtko3d::POINT_RGB);
auto mapper = vtko3d::toMapper(polyData);
auto actor = vtko3d::toLineSegmentsActor(mapper, std::nullopt, 2);