Как мне отформатировать мой файл .dat, чтобы можно было построить трехмерный векторный график? - PullRequest
7 голосов
/ 14 апреля 2011

Я работаю над этой задачей по программированию для колледжа, где мы должны написать программу c++, которая вычисляет вектор магнитного поля для определенных катушек в трехмерном пространстве.

Мне удалось написать эту программу, и я думаю, что она работает довольно хорошо.

Хотелось бы добавить еще одну особенность (это моя экзаменационная работа, так что она должна быть очень хорошей!): Я не хочу выводить векторы.

Я привык звонить gnuplot из c++ (по трубопроводу), и это то, что я обычно делаю:

  1. создать поток вывода, который записывает данные в .dat файл
  2. открыть трубку гнуплота
  3. заставляет gnuplot распечатывать все содержимое .dat

Поскольку мои данные всегда были двухмерными, x и y участками, я совершенно потерян. Мой вопрос:

  1. Как отформатировать файл .dat (например, использовать ли фигурные скобки для группировки векторных компонентов?)
  2. Какова команда gnuplot для построения трехмерного векторного поля?

Было бы легко, если бы я мог отформатировать файл .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). Это было бы легко запрограммировать, реальный вопрос: это подойдет? и как мне построить это в гнуплоте. (вау, я задавал один и тот же вопрос 3 раза, наверное).


Трубопровод к гнуплоту

Хорошо, так как кто-то попросил меня описать, как я труба (не знаю, если это правильный термин) подумал о 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);
    

Необходимая библиотека называется <fstream> Полагаю.

1 Ответ

6 голосов
/ 14 апреля 2011

Я сделал этот простой пример, чтобы показать вам, как рисовать векторное поле.Вывод будет выглядеть примерно так:

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

Теперь вы должны прочитать раздел 44, стр. 53 официального руководства *1013* (а здесь pdf ).Вы можете найти этот сайт также очень полезным.

Отредактировано:

Эта команда не вписывается в ваше описание: mapping from (x,y,z) to (t,u,v).Это фактически делает это отображение: from (X,Y,Z) to (X+dX,Y+dY,Z+dZ).

Cheers, Beco

...