Skip to content

向量场图 - QwtPlotVectorField

QwtPlotVectorField 用于绘制向量场(Vector Field),在二维平面上显示带有方向和大小信息的向量数据。常用于流体力学、电磁场分析、气象数据等领域。

主要功能特性

特性

  • 箭头符号显示:使用箭头表示向量方向和大小
  • 大小映射:向量大小可映射到箭头长度或颜色
  • 密度控制:支持调整显示密度避免过度拥挤
  • 样式自定义:可自定义箭头形状和样式

基本概念

向量场表示

向量场数据包含位置和向量两个部分:

1
2
3
4
5
6
7
8
9
      ↑     ↗
      │    /
      │   /
  ←───●───→───●───→
      │   \
      │    \
      ↓     ↙

每个点显示一个向量(方向+大小)

数据结构

使用 QwtVectorFieldSample 表示单个向量:

1
2
3
4
5
6
struct QwtVectorFieldSample {
    double x;       // X坐标
    double y;       // Y坐标
    double vx;      // X分量
    double vy;      // Y分量
};

使用方法

向量场的例子位于:playground/vectorfield,例子截图如下:

Vector Field

1. 基本向量场图

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <QwtPlot>
#include <QwtPlotVectorField>

QwtPlot* plot = new QwtPlot();
plot->setTitle("向量场示例");
plot->setCanvasBackground(Qt::white);

// 创建向量场
QwtPlotVectorField* vectorField = new QwtPlotVectorField();

// 准备数据
QVector<QwtVectorFieldSample> samples;
for (int x = 0; x < 10; x++) {
    for (int y = 0; y < 10; y++) {
        double vx = std::sin(y * 0.5);  // X分量
        double vy = std::cos(x * 0.5);  // Y分量
        samples << QwtVectorFieldSample(x, y, vx, vy);
    }
}
vectorField->setSamples(samples);

vectorField->attach(plot);
plot->replot();

2. 箭头样式配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#include <QwtVectorFieldSymbol>

// 创建箭头符号
QwtVectorFieldSymbol* symbol = new QwtVectorFieldSymbol();
symbol->setStyle(QwtVectorFieldSymbol::Arrow);  // 箭头样式

// 设置箭头颜色
symbol->setPen(QPen(Qt::blue, 1));

// 设置箭头长度比例
vectorField->setMagnitudeScaleFactor(0.5);  // 缩放因子

vectorField->setSymbol(symbol);

3. 向量大小映射

1
2
3
4
5
6
// 将向量大小映射到箭头长度
vectorField->setMagnitudeScaleFactor(1.0);  // 线性映射

// 设置固定箭头长度(忽略大小)
vectorField->setMagnitudeScaleFactor(0.0);
vectorField->setSymbolSize(10);  // 固定10像素

4. 显示密度控制

1
2
3
4
5
// 设置采样密度(避免过度拥挤)
vectorField->setSamplesPerInch(20);  // 每英寸20个向量

// 或设置固定跳过间隔
vectorField->setIndirectionCount(2);  // 每隔2个点显示一个

5. 颜色映射

1
2
3
4
5
6
#include <QwtColorMap>

// 根据向量大小设置颜色
QwtLinearColorMap* colorMap = new QwtLinearColorMap(Qt::blue, Qt::red);
vectorField->setColorMap(colorMap);
vectorField->setColorMagnitude(true);  // 启用颜色映射

核心方法总结

方法 说明
setSamples() 设置向量数据
setSymbol() 设置箭头符号
setMagnitudeScaleFactor() 设置大小缩放因子
setSamplesPerInch() 设置显示密度
setColorMap() 设置颜色映射
setColorMagnitude() 启用颜色大小映射

应用场景

  • 流体力学:流速场可视化
  • 电磁学:电场/磁场分布
  • 气象学:风向场显示
  • 数学分析:向量函数可视化

相关示例

  • 向量场演示:playground/vectorfield