#ifndef VTKHSWBOXGRIDWIDGET_H
#define VTKHSWBOXGRIDWIDGET_H
/*
* ModuleName: vtkHSWBoxGridWidget
* Description: 實現長方體(六面體)線框
* Author: hsw
* Date: 2020-03-22
*
*/
#include <vtkSmartPointer.h>
#include <vtkLine.h>
#include <vtkPoints.h>
#include <vtkCellArray.h>
#include <vtkPolyData.h>
#include <vtkDataSetMapper.h>
#include <vtkTransform.h>
#include <vtkTransformPolyDataFilter.h>
class vtkHSWBoxGridWidget
{
public:
vtkHSWBoxGridWidget();
~vtkHSWBoxGridWidget();
public:
// center: 線框中心
// size: 線框的長寬高
// rotate: 分別繞x/y/z旋轉角度, 單位: 度
vtkSmartPointer<vtkDataSetMapper> createBoxGrid(double* center, double* size, double* rotate);
private:
vtkSmartPointer<vtkPoints> _boxGridPoints;
vtkSmartPointer<vtkLine > _boxGridCell;
vtkSmartPointer<vtkCellArray> _boxGridCellArray;
vtkSmartPointer<vtkPolyData> _boxGridData;
vtkSmartPointer<vtkDataSetMapper> _boxGridMapper;
};
#endif // VTKHSWBOXGRIDWIDGET_H
#include "vtkhswboxgridwidget.h"
vtkHSWBoxGridWidget::vtkHSWBoxGridWidget()
{
}
vtkHSWBoxGridWidget::~vtkHSWBoxGridWidget()
{
// TODO...
}
vtkSmartPointer<vtkDataSetMapper> vtkHSWBoxGridWidget::createBoxGrid(double *center, double *size, double *rotate)
{
_boxGridPoints = vtkSmartPointer<vtkPoints>::New();
_boxGridPoints->SetNumberOfPoints(8);
// double minX = -size[0] / 2.0;
// double maxX = size[0] / 2.0;
// double minY = -size[1] / 2.0;
// double maxY = size[1] / 2.0;
// double minZ = -size[2] / 2.0;
// double maxZ = size[2] / 2.0;
double minX, minY, minZ;
double maxX, maxY, maxZ;
minX = minY = minZ = -0.5;
maxX = maxY = maxZ = 0.5;
_boxGridPoints->SetPoint(0, minX, maxY, minZ);
_boxGridPoints->SetPoint(1, maxX, maxY, minZ);
_boxGridPoints->SetPoint(2, maxX, minY, minZ);
_boxGridPoints->SetPoint(3, minX, minY, minZ);
_boxGridPoints->SetPoint(4, minX, maxY, maxZ);
_boxGridPoints->SetPoint(5, maxX, maxY, maxZ);
_boxGridPoints->SetPoint(6, maxX, minY, maxZ);
_boxGridPoints->SetPoint(7, minX, minY, maxZ);
_boxGridCellArray = vtkSmartPointer<vtkCellArray>::New();
for(int i = 0; i < 12; ++i)
{
_boxGridCell = vtkSmartPointer<vtkLine>::New();
if(i < 4)
{
_boxGridCell->GetPointIds()->SetId(0, i);
_boxGridCell->GetPointIds()->SetId(1, ((i + 1) % 4 != 0 ? (i + 1) : 0));
}
else if(i < 8)
{
_boxGridCell->GetPointIds()->SetId(0, i);
_boxGridCell->GetPointIds()->SetId(1, ((i + 1) % 8 != 0 ? (i + 1) : 4));
}
else
{
_boxGridCell->GetPointIds()->SetId(0, i % 4);
_boxGridCell->GetPointIds()->SetId(1, i % 4 + 4);
}
_boxGridCellArray->InsertNextCell(_boxGridCell);
}
_boxGridData = vtkSmartPointer<vtkPolyData>::New();
_boxGridData->SetPoints(_boxGridPoints);
_boxGridData->SetLines(_boxGridCellArray);
vtkSmartPointer<vtkTransform> transform = vtkSmartPointer<vtkTransform>::New();
transform->Identity();
transform->Translate(center);
transform->RotateX(rotate[0]);
transform->RotateY(rotate[1]);
transform->RotateZ(rotate[2]);
transform->Scale(size[0], size[1], size[2]);
// Transform the polydata
vtkSmartPointer<vtkTransformPolyDataFilter> transformPD = vtkSmartPointer<vtkTransformPolyDataFilter>::New();
transformPD->SetTransform(transform);
transformPD->SetInputData(_boxGridData);
_boxGridMapper = vtkSmartPointer<vtkDataSetMapper>::New();
_boxGridMapper->SetInputConnection(transformPD->GetOutputPort());
return _boxGridMapper;
}