VTK顯示六面體線框

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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章