VTK example:显示unstructuredGrid,添加向量场颜色,及箭头
如下示例代码,使用GPT3.5生成。可以显示geometry及箭头,不能显示场颜色。
#include <vtkSmartPointer.h>
#include <vtkUnstructuredGrid.h>
#include <vtkPoints.h>
#include <vtkCellArray.h>
#include <vtkDoubleArray.h>
#include <vtkArrowSource.h>
#include <vtkGlyph3D.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkNamedColors.h>
#include <vtkGeometryFilter.h>
#include <vtkColorTransferFunction.h>
#include <vtkPointData.h>
#include <vtkScalarBarActor.h>
int main()
{
// Create an unstructured grid
vtkSmartPointer<vtkUnstructuredGrid> unstructuredGrid = vtkSmartPointer<vtkUnstructuredGrid>::New();
// Create points for the grid
vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
points->InsertNextPoint(0.0, 0.0, 0.0);
points->InsertNextPoint(1.0, 0.0, 0.0);
points->InsertNextPoint(1.0, 1.0, 0.0);
points->InsertNextPoint(0.0, 1.0, 0.0);
unstructuredGrid->SetPoints(points);
// Create a triangle
vtkSmartPointer<vtkTriangle> triangle = vtkSmartPointer<vtkTriangle>::New();
triangle->GetPointIds()->SetId(0, 0);
triangle->GetPointIds()->SetId(1, 1);
triangle->GetPointIds()->SetId(2, 2);
unstructuredGrid->InsertNextCell(triangle->GetCellType(), triangle->GetPointIds());
// Create a separate array for the vector field
vtkSmartPointer<vtkDoubleArray> vectorField = vtkSmartPointer<vtkDoubleArray>::New();
vectorField->SetName("VectorField");
vectorField->SetNumberOfComponents(3); // 3 components for x, y, z
double vector[3] = {1.0, 0.0, 0.0}; // Example vector value
vectorField->InsertNextTuple(vector);
unstructuredGrid->GetCellData()->SetVectors(vectorField);
// Compute the magnitude of the vector field
vtkSmartPointer<vtkDoubleArray> magnitudeArray = vtkSmartPointer<vtkDoubleArray>::New();
magnitudeArray->SetNumberOfComponents(1);
magnitudeArray->SetName("Magnitude");
for (vtkIdType i = 0; i < vectorField->GetNumberOfTuples(); ++i)
{
double* vector = vectorField->GetTuple3(i);
double magnitude = std::sqrt(vector[0] * vector[0] + vector[1] * vector[1] + vector[2] * vector[2]);
magnitudeArray->InsertNextValue(magnitude);
}
unstructuredGrid->GetPointData()->AddArray(magnitudeArray);
// Convert vtkUnstructuredGrid to vtkPolyData
vtkSmartPointer<vtkGeometryFilter> geometryFilter = vtkSmartPointer<vtkGeometryFilter>::New();
geometryFilter->SetInputData(unstructuredGrid);
geometryFilter->Update();
// Create arrows for visualizing the vector field
vtkSmartPointer<vtkArrowSource> arrowSource = vtkSmartPointer<vtkArrowSource>::New();
arrowSource->SetShaftResolution(10);
arrowSource->SetTipResolution(10);
// Scale the arrows based on the magnitude of the vector
vtkSmartPointer<vtkGlyph3D> glyph3D = vtkSmartPointer<vtkGlyph3D>::New();
glyph3D->SetInputConnection(geometryFilter->GetOutputPort());
glyph3D->SetSourceConnection(arrowSource->GetOutputPort());
glyph3D->SetScaleModeToScaleByVector();
glyph3D->SetScaleFactor(0.05); // Adjust the scaling factor to your liking
// Create a color transfer function for the scalar values
vtkSmartPointer<vtkColorTransferFunction> colorTransferFunction = vtkSmartPointer<vtkColorTransferFunction>::New();
colorTransferFunction->SetColorSpaceToRGB();
colorTransferFunction->AddRGBPoint(magnitudeArray->GetRange()[0], 0.0, 0.0, 1.0); // Blue for lower values
colorTransferFunction->AddRGBPoint(magnitudeArray->GetRange()[1], 1.0, 0.0, 0.0); // Red for higher values
vtkSmartPointer<vtkPolyDataMapper> vectorMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
vectorMapper->SetInputConnection(glyph3D->GetOutputPort());
vectorMapper->ScalarVisibilityOn();
vectorMapper->SetScalarModeToUsePointData();
vectorMapper->SelectColorArray("VectorField");
vectorMapper->SetColorModeToMapScalars();
vectorMapper->SetLookupTable(colorTransferFunction);
// Create an actor for the vector arrows
vtkSmartPointer<vtkActor> vectorActor = vtkSmartPointer<vtkActor>::New();
vectorActor->SetMapper(vectorMapper);
// Create a mapper for the unstructured grid
vtkSmartPointer<vtkPolyDataMapper> gridMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
gridMapper->SetInputConnection(geometryFilter->GetOutputPort());
gridMapper->SetScalarVisibility(true);
gridMapper->UseLookupTableScalarRangeOn();
gridMapper->SelectColorArray("Magnitude");
// gridMapper->ScalarVisibilityOff();
// Create an actor for the unstructured grid
vtkSmartPointer<vtkActor> gridActor = vtkSmartPointer<vtkActor>::New();
gridActor->SetMapper(gridMapper);
// Create a renderer, render window, and interactor
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
interactor->SetRenderWindow(renderWindow);
// Set the background color to white
vtkSmartPointer<vtkNamedColors> colors = vtkSmartPointer<vtkNamedColors>::New();
renderer->SetBackground(colors->GetColor3d("White").GetData());
// Add the actors to the renderer
renderer->AddActor(vectorActor);
renderer->AddActor(gridActor);
// Create a scalar bar for the color transfer function
vtkSmartPointer<vtkScalarBarActor> scalarBar = vtkSmartPointer<vtkScalarBarActor>::New();
scalarBar->SetLookupTable(colorTransferFunction);
scalarBar->SetTitle("Magnitude");
scalarBar->SetOrientationToHorizontal();
scalarBar->SetPosition(0.1, 0.1);
scalarBar->SetWidth(0.8);
scalarBar->SetHeight(0.15);
scalarBar->SetNumberOfLabels(5);
scalarBar->SetLabelFormat("%-#6.2g");
scalarBar->GetTitleTextProperty()->SetFontSize(14);
scalarBar->GetLabelTextProperty()->SetFontSize(12);
renderer->AddActor2D(scalarBar);
// Set camera position and focal point
renderer->GetActiveCamera()->SetPosition(0.0, -3.0, 0.0);
renderer->GetActiveCamera()->SetFocalPoint(0.5, 0.5, 0.0);
// Render the scene and start the interactor
renderWindow->Render();
interactor->Start();
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构