//創建圓柱
?? ??? ?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);