VTK学习笔记3:曲线与曲面源
文章目录
- 一、直线vtkLineSource
- 1.1 几何参数
- 1.2 示例代码
- 一条简单的直线
- 简单折线
- 二、复杂折线vtkPolyLineSource
- 2.1 功能说明
- 2.2 几何参数
- 2.3 示例代码
- 2.4 显示结果
- 3.1 功能说明
- 3.2 几何参数
- 3.3 示例代码
- 3.4 显示结果
- 四、圆弧曲线vtkArcSource
- 4.1 功能说明
- 4.2 几何参数
- 4.3 示例代码
- 4.4 显示结果:
- 五、椭圆弧vtkEllipseArcSource
- 5.1 功能说明
- 5.2 几何参数
- 5.3 示例代码
- 5.4 显示结果
- 六、正多边形vtkRegularPolygonSource
- 6.1 几何参数
- 6.2 代码实现
- 6.3 显示结果
- 七、参数曲线vtkProgrammableSource
- 7.1 功能说明
- vtkPolyLineSource - 专用多段线生成器
- vtkProgrammableSource - 通用可编程数据源
- 选择
- 性能考虑
- 7.2 示例代码
- 7.3 显示结果
一、直线vtkLineSource
1.1 几何参数
- SetPoint1(double x,double y,double z):起点坐标;
- SetPoint2(double x,double y,double z):终点坐标;
- SetResolution(int res):线段分段;
- SetPoints(vtkPoints points):折线折点集合;
1.2 示例代码
一条简单的直线
//1、数据源
vtkSmartPointer<vtkLineSource > line = vtkSmartPointer<vtkLineSource >::New();
line->SetPoint1(0, 0, 0); // 起点
line->SetPoint2(5, 5, 5); // 终点
line->SetResolution(10); // 线段分段数
line->Update();
显示结果:
简单折线
//1、数据源
vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
points->InsertNextPoint(1,1,0);
points->InsertNextPoint(2,0,1);
points->InsertNextPoint(3,1,1);
points->InsertNextPoint(1,5,1);
points->InsertNextPoint(1,1,3);
vtkSmartPointer<vtkLineSource > line = vtkSmartPointer<vtkLineSource >::New();
line->SetPoint1(0, 0, 0); // 起点
line->SetPoint2(5, 5, 5); // 终点
line->SetResolution(10); // 线段分段数
line->SetPoints(points); // 设置折线点
line->Update();
显示结果:
二、复杂折线vtkPolyLineSource
2.1 功能说明
- 类型:数据源类(Source)
- 功能:生成由多个点定义的折线(多线段)
- 输出:vtkPolyData 包含一个多线段单元(vtkPolyLine)
- 特点:
- 可创建包含任意数量点的连续折线
- 点之间按顺序连接
- 直接输出可渲染的几何数据
- VTK 9.0 及以上版本专用
- 简化了老版本 vtkPoints + vtkPolyLine + vtkCellArray + vtkPolyData 组合,这些改成了类内部实现
2.2 几何参数
- SetPoints(vtkPoints points):设置点坐标;
- SetClosed(bool b):设置多段线是否闭合(首尾相连);默认值为False;
2.3 示例代码
//1、创建多段线的点
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(1.0, 1.0, 5.0);
//2、创建多线段源
vtkSmartPointer<vtkPolyLineSource> polyLine = vtkSmartPointer<vtkPolyLineSource>::New();
polyLine->SetPoints(points);
polyLine->SetClosed(true);
2.4 显示结果
开口:
闭口:
三、圆盘vtkDiskSource
3.1 功能说明
生成一个代表圆盘(可以是实心圆,也可以是圆环)
3.2 几何参数
- SetInnerRadius():设置内圆半径;默认值0;
- SetOuterRadius():设置外圆半径;默认值为0;
- SetRadialResolution():径向分辨率;该值决定了从内径到外径之间有多少个同心圆;默认值为1;
- SetCircumferentialResolution():圆周分辨率;通俗来讲,设置是多少,圆就有多少条边,边越多,圆就越圆;默认值是6;
3.3 示例代码
vtkSmartPointer<vtkDiskSource> disk = vtkSmartPointer<vtkDiskSource>::New();
disk->SetInnerRadius(1.0); // 内半径
disk->SetOuterRadius(3.0); // 外半径
disk->SetRadialResolution(1); // 径向分段数
disk->SetCircumferentialResolution(4); // 圆周分段数
disk->Update();
3.4 显示结果
边数<=3时,是一个三角形:
边数是4时,是一个正方形:
边数是N,是N边形:
边数越大,圆就越圆:
四、圆弧曲线vtkArcSource
4.1 功能说明
根据用户提供的参数(如起点、终点、中心点、角度、分辨率等),计算并生成一系列的点(Points)和单元(Cells,通常是多义线 Polyline 或多边形 Polygon),从而在三维空间中构建出一段圆弧的几何形状。
4.2 几何参数
- SetPoint1(double x, double y, double z):起点;
- SetPoint2( 0.0, 1.0, 0.0): 终点;
- SetCenter( 0.0, 0.0, 0.0): 圆心;
- NegativeOn()/NegativeOff():优弧、劣弧;通俗来讲优弧就是画大半弧,劣弧就是画小半弧;默认是劣弧;
- SetResolution():分辨率;默认值是100;
4.3 示例代码
vtkSmartPointer<vtkArcSource> arcSource = vtkSmartPointer<vtkArcSource>::New();
arcSource->SetPoint1(-1.0, 0.0, 0.0); // 起点
arcSource->SetPoint2( 0.0, 1.0, 0.0); // 终点
arcSource->SetCenter( 0.0, 0.0, 0.0); // 圆心
arcSource->NegativeOn();
arcSource->SetResolution(50); // 分辨率
//arcSource->SetOutputPointsPrecision(0);//控制生成的点的坐标是单精度(SINGLE_PRECISION)还是双精度(DOUBLE_PRECISION)。对于高精度要求的场景非常有用。
arcSource->Update();
4.4 显示结果:
劣弧:
优弧:
五、椭圆弧vtkEllipseArcSource
5.1 功能说明
与上述圆弧类似,这个是椭圆的圆弧;
5.2 几何参数
5.3 示例代码
// 1. 创建椭圆弧源
vtkSmartPointer<vtkEllipseArcSource> arcSource = vtkSmartPointer<vtkEllipseArcSource>::New();// 2. 设置参数(根据头文件完全正确的API)
arcSource->SetCenter(0.0, 0.0, 0.0); // 中心在原点// 设置法向量(定义椭圆所在平面)
double normal[3] = {0.0, 0.0, 1.0};
arcSource->SetNormal(normal); // XY平面// 设置长轴向量(定义长轴方向和长度)
double majorRadiusVector[3] = {2.0, 0.0, 0.0};
arcSource->SetMajorRadiusVector(majorRadiusVector); // 长轴半径为2,沿X轴方向// 设置椭圆比例(短轴半径/长轴半径)
arcSource->SetRatio(0.5); // 短轴半径 = 0.5 * 2.0 = 1.0arcSource->SetStartAngle(45.0); // 起始角度 45°
arcSource->SetSegmentAngle(270.0); // 跨越 270° (逆时针)
arcSource->SetResolution(80); // 用 80 条线段来近似弧线// 可选:闭合弧线(连接起点和终点)
arcSource->SetClose(false); // 不闭合arcSource->Update();
5.4 显示结果
六、正多边形vtkRegularPolygonSource
6.1 几何参数
6.2 代码实现
// 1. 创建正多边形源
vtkSmartPointer<vtkRegularPolygonSource> polygonSource = vtkSmartPointer<vtkRegularPolygonSource>::New();// 2. 设置参数(根据头文件完全正确的API)
polygonSource->SetNumberOfSides(6); // 设置边数为6(六边形)
polygonSource->SetCenter(0.0, 0.0, 0.0); // 中心在原点// 设置法向量(定义多边形所在平面)
double normal[3] = {0.0, 0.0, 1.0};
polygonSource->SetNormal(normal); // XY平面polygonSource->SetRadius(1.0); // 半径为1// 设置生成选项
polygonSource->SetGeneratePolygon(true); // 生成填充面片
polygonSource->SetGeneratePolyline(true); // 生成轮廓线// 设置输出点精度(可选)
polygonSource->SetOutputPointsPrecision(vtkAlgorithm::DOUBLE_PRECISION);polygonSource->Update();
6.3 显示结果
不生成填充平面:
生成填充平面:
七、参数曲线vtkProgrammableSource
7.1 功能说明
与vtkPolyLineSource类似,区别如下:
vtkPolyLineSource - 专用多段线生成器
- 专用性:专门为创建多段线设计
- 简单API:提供 AddPoint(), SetPoints(), SetClosed() 等直观方法
- 内置优化:针对多段线创建进行了性能优化
- 局限性:只能创建多段线,无法生成其他类型的数据
vtkProgrammableSource - 通用可编程数据源
- 通用性:可以创建任何类型的 VTK 数据(PolyData、ImageData、StructuredGrid 等)
- 高度灵活:完全由用户代码控制数据生成过程
- 学习曲线:需要了解 VTK 数据模型和回调函数机制
- 功能强大:可以实现任何复杂的数据生成逻辑
选择
- 使用 vtkPolyLineSource 当:
- 只需要创建简单的多段线
- 希望代码简洁易读
- 不需要高度定制化的数据生成逻辑
- 追求最佳性能
- 使用 vtkProgrammableSource 当:
- 需要创建非标准或复杂几何体
- 需要生成多种类型的数据(不仅仅是多段线)
- 需要实现自定义的数据生成算法
- 需要动态生成基于参数的数据
- 现有的专用源无法满足需求
性能考虑
- vtkPolyLineSource:经过优化,性能更好
- vtkProgrammableSource:性能取决于用户实现的效率,可能需要进行优化
7.2 示例代码
回调函数:
void GenerateCustomLine(void* arguments) {vtkProgrammableSource* self = (vtkProgrammableSource*)arguments;vtkPolyData* output = self->GetPolyDataOutput();// 创建点和单元vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();// 添加点points->InsertNextPoint(0, 0, 0);points->InsertNextPoint(1, 1, 0);points->InsertNextPoint(2, 0, 0);points->InsertNextPoint(6, 2, 0);points->InsertNextPoint(0, 0, 7);// 创建线vtkSmartPointer<vtkPolyLine> polyLine = vtkSmartPointer<vtkPolyLine>::New();polyLine->GetPointIds()->SetNumberOfIds(5);for (int i = 0; i < 5; i++) {polyLine->GetPointIds()->SetId(i, i);}lines->InsertNextCell(polyLine);// 设置输出output->SetPoints(points);output->SetLines(lines);
}
调用:
// 使用自定义源
vtkSmartPointer<vtkProgrammableSource> customSource = vtkSmartPointer<vtkProgrammableSource>::New();
customSource->SetExecuteMethod(GenerateCustomLine, customSource);
customSource->Update();