我应该如何格式化.dat文件以便可以制作3D矢量图?

时间:2011-04-14 16:29:39

标签: c++ vector 3d field gnuplot

我正在为大学工作这个编程任务,我们必须编写一个c++程序来计算3D空间中某些线圈的磁场矢量。

我已经设法编写了这个程序,我想我已经很好地工作了。

我想添加一个特殊的薄片(这是我的试卷,所以它必须特别好!):我不想绘制矢量。

我习惯于从gnuplot(通过管道)呼叫c++,这就是我通常做的事情:

  1. 创建一个将数据写入.dat文件
  2. 的输出流
  3. 打开gnuplot管道
  4. 使gnuplot绘制.dat
  5. 的所有内容

    由于我的数据一直是2D,xy图,我在这里很丢失。我的问题是:

    1. 如何格式化.dat文件(例如,我是否使用大括号对矢量组件进行分组?)
    2. 绘制3D矢量场的实际gnuplot命令是什么?
    3. 如果我可以像这样格式化.dat文件那么容易:

      # Px    Py    Pz    Bx    By    Bz
        1     0     2     0.7   0.5   0.25 #<= example data line
        ... more data ...
      

      当点P=(1,0,2)中的磁场矢量等于矢量B=(0.7,0.5,0.25)时。这很容易编程,真正的问题是:这样做吗?以及如何在gnuplot中绘制它。 (哇,我猜了3次同样的问题)。


      管道到gnuplot

      好的,因为有人让我向gnuplot描述我管道(不知道这是否是正确的术语)。这是:

      1. 首先打开一个管道并将其称为pipe

        FILE *pipe = popen("gnuplot -persist 2>/dev/null", "w");
        
      2. 告诉gnuplot通过管道做什么:

        fprintf(pipe, "set term x11 enhanced \n");
        fprintf(pipe, "plot x^2 ti 'x^2' with lines\n");
        

        注意绝对必要的\n。它执行命令。

      3. 关闭管道:

        pclose(pipe);
        
      4. 我相信必要的库称为<fstream>

1 个答案:

答案 0 :(得分:6)

我做了这个简单的例子,向您展示如何绘制矢量场。输出将是这样的图片:

enter image description here

我用来绘制这个数据的例子是:

# Px    Py    Pz    Bx    By    Bz
  0     0     0     0.8   0.8   0.45
  0     0     1     0.5   0.7   0.35
  0     0     2     0.7   0.5   0.25
  0     1     0     0.65   0.65   0.50
  0     1     1     0.6   0.6   0.3
  0     1     2     0.45   0.45   0.20
  1     0     0     0.5   0.7   0.35
  1     0     1     0.75   0.75   0.4
  1     0     2     0.85   0.85   0.25
  1     1     0     0.90   0.85   0.23
  1     1     1     0.95   0.86   0.20
  1     1     2     0.98   0.88   0.13
  2     0     0     0.73   0.83   0.43
  2     0     1     0.53   0.73   0.33
  2     0     2     0.73   0.53   0.23
  2     1     0     0.68   0.68   0.52
  2     1     1     0.63   0.57   0.23
  2     1     2     0.48   0.42   0.22

绘制它的命令是:

gnuplot> splot "./data3d.dat" with vectors

现在您应该阅读official manual(此处为pdf)的第53页第44节。您可能会发现this site也非常有用。

编辑:

此命令不适合您的说明:映射from (x,y,z) to (t,u,v)。它实际上进行了这种映射:from (X,Y,Z) to (X+dX,Y+dY,Z+dZ)

干杯, 贝乔