Гнуплот эллипсоидов с текстовым файловым центром - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть текстовый файл с 3 столбцами, определяющими 3D-точки.

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

set parametric

, потому что мне нужно перебрать мой текстовый файл.

Так что я думаю сделать что-то вроде этого:

gnuplot
reset
set xrange [-5:5]
set yrange [-5:5]
set zrange [-5:5]
Rx = 1
Ry = 1
Rz = 1
fx(u,v) = column(2) + Rx*cos(u)*cos(v)
fy(u,v) = column(1) + Ry*sin(u)*cos(v)
fz(u,v) = column(3) + Rz*sin(v)
iMax = 200
splot "file.txt" using ($2):($1):($3) title "Input  " with points ps 2 pt 7,\
for [i=0:iMax] "file.txt" u (fx(2*pi*i/iMax, pi*i/iMax)):(fy(2*pi*i/iMax, pi*i/iMax)):(fz(2*pi*i/iMax, pi*i/iMax)) notitle with points ps 2 pt 7

Но толькодумаю, что я могу понять, это странно и тяжело (я знаю, что в каждой строке много итераций, но, может быть, есть другой подход) pattern enter image description here

Любая помощь? Спасибо.

Что-то не так с математической точки зрения? Используя что-то подобное, я прекрасно умею строить сферы, но без разбора данных:

set parametric
R = 1
set urange [-pi/2:pi/2]
set vrange [0:2*pi]
splot R*cos(u)*cos(v),R*cos(u)*sin(v),R*sin(u) w l lc rgb "yellow"

1 Ответ

1 голос
/ 30 сентября 2019

Полагаю, вы хотите построить 2D-поверхности трехмерных эллипсоидов. Но у команды plot есть только цикл над i, который только 1D. Это не может дать 2D поверхность. Для реализации этого подхода может быть возможно вложить еще один одномерный цикл.

Я бы предложил кое-что еще. Перед построением вы можете сохранить координаты центра в массиве gnuplot. Затем вы зацикливаетесь на этом массиве и строите сферу / эллипсоид, используя параметрический режим.

Это может быть отправной точкой:

# This is the file with the center coordinates.
datafile = "ellipses.dat"

# The "stats" command stores the number of rows in the STATS_records variable.
stats datafile nooutput
num_rows = STATS_records

# Generate arrays which will contain the center coordinates of the ellipsoids.
array centers_x[num_rows]
array centers_y[num_rows]
array centers_z[num_rows]

# Read the center coordinates into the prepared arrays.
# I "misuse" the stats command. The "using" expression in parenthesis executes
# the respective commands and returns the value after the last comma: row + 1.
# This return value is not needed anywhere.
row = 1 
stats datafile using (centers_x[row]=$1, \ 
                      centers_y[row]=$2, \ 
                      centers_z[row]=$3, \ 
                      row = row + 1) nooutput

# Output into an image file.
set terminal pngcairo
set output "ellipsoids.png"

# Set parameters for ellipsoids.
Rx = 0.1
Ry = 0.1
Rz = 0.7

# Use parametric mode for plotting.
set parametric
set urange [-pi/2:pi/2]
set vrange [0:2*pi]

# Finally plot:
splot datafile using 1:2:3 title "Input  " with points ps 2 pt 7, \
      for [i=1:num_rows] centers_x[i] + Rx*cos(u)*cos(v), \ 
                         centers_y[i] + Ry*cos(u)*sin(v), \ 
                         centers_z[i] + Rz*sin(u)    notitle

Пожалуйста, перепроверьте x, y и z: я не былчто осторожноВот результат:

ellipsoids

Я использовал данные этого примера:

1 2 3
2 2 4
2 3 4
3 3 3
3 4 5

Доступны массивы, начиная с gnuplot 5.2. Для более старых версий, пожалуйста, ищите обходные пути в Интернете.

...