//创建圆柱
vtkSmartPointer<vtkCylinderSource> spCylinderSource = vtkSmartPointer<vtkCylinderSource>::New();
spCylinderSource->SetHeight(m_dCylinderHeight); // 设置圆柱的高度
spCylinderSource->SetRadius(m_dCylinderRadius); // 设置圆柱的半径
spCylinderSource->SetResolution(50); // 设置圆柱的分辨率(面的数量)
spCylinderSource->SetCenter(m_dCylinderCenter);
//做旋转90°
vtkSmartPointer<vtkTransform> spTransform = vtkSmartPointer<vtkTransform>::New();
spTransform->RotateX(90);
// 应用变换到圆柱几何数据
vtkSmartPointer<vtkTransformPolyDataFilter> spTransformFilter = vtkSmartPointer<vtkTransformPolyDataFilter>::New();
spTransformFilter->SetTransform(spTransform);
spTransformFilter->SetInputConnection(spCylinderSource->GetOutputPort());
spTransformFilter->Update();
// 创建映射器和显示节点
vtkSmartPointer<vtkPolyDataMapper> spCylinderMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
spCylinderMapper->SetInputConnection(spTransformFilter->GetOutputPort());
m_spCylinderActor = vtkSmartPointer<vtkActor>::New();
m_spCylinderActor->SetMapper(spCylinderMapper);
//创建螺旋线
vtkSmartPointer<vtkPoints> spSpiralLinePoints =vtkSmartPointer<vtkPoints>::New();
int nCountPoints = 5000; //值设置大一下比较圆滑
double dRadius = m_dCylinderRadius+0.1;
double dHeight = m_dCylinderHeight;
for (int nPoint = 0; nPoint < nCountPoints; ++nPoint)
{
double dAngle = (m_dCylinderHeight*5) * vtkMath::Pi() * nPoint / nCountPoints; //高度的3倍,螺旋线的圈数
double dX = dRadius * cos(dAngle); //x轴的位置
double dY = dRadius * sin(dAngle);
double dZ = dHeight * nPoint / nCountPoints;
spSpiralLinePoints->InsertNextPoint(dX, dY, dZ); //螺旋上的点
}
// 点创建不封闭线
vtkSmartPointer<vtkPolyLine> spSpiralLine =vtkSmartPointer<vtkPolyLine>::New();
spSpiralLine->GetPointIds()->SetNumberOfIds(nCountPoints);
for (int nPointIndex = 0; nPointIndex < nCountPoints; ++nPointIndex)
{
spSpiralLine->GetPointIds()->SetId(nPointIndex, nPointIndex);
}
// 给线段构造单元格
vtkSmartPointer<vtkCellArray> spSpiralLineCells =vtkSmartPointer<vtkCellArray>::New();
spSpiralLineCells->InsertNextCell(spSpiralLine);
// 构造line的参数
vtkSmartPointer<vtkPolyData> spSpiralLinePolyData = vtkSmartPointer<vtkPolyData>::New();
spSpiralLinePolyData->SetPoints(spSpiralLinePoints);
spSpiralLinePolyData->SetLines(spSpiralLineCells);
// 设置弹簧的大小
vtkSmartPointer<vtkTubeFilter> spSpiralLineTubeFilter =vtkSmartPointer<vtkTubeFilter>::New();
spSpiralLineTubeFilter->SetInputData(spSpiralLinePolyData);
spSpiralLineTubeFilter->SetRadius(0.04); //弹簧半径的大小
spSpiralLineTubeFilter->SetNumberOfSides(50);
spSpiralLineTubeFilter->Update();
//创建映射
vtkSmartPointer<vtkPolyDataMapper> spSpiralLineMapper =vtkSmartPointer<vtkPolyDataMapper>::New();
spSpiralLineMapper->SetInputConnection(spSpiralLineTubeFilter->GetOutputPort());
m_spSpiralLineActor =vtkSmartPointer<vtkActor>::New();
m_spSpiralLineActor->SetMapper(spSpiralLineMapper);