我正在尝试在3d空间中绘制来自文件和由参数项制成的球体的曲线。
这个想法是绘制行星地球和卫星轨道的图。
在文件x y z中定义轨道,并且gnuplot命令很简单
splot 'file.txt' u 1:2:3 title 'Orbit element 1' with lines
轨道卫星:
我找到了一个绘制地球的脚本
#color definitions
set border lw 1.5
set style line 1 lc rgb '#000000' lt 1 lw 2
set style line 2 lc rgb '#c0c0c0' lt 2 lw 1
unset key; unset border
set tics scale 0
set lmargin screen 0
set bmargin screen 0
set rmargin screen 1
set tmargin screen 1
set format ''
set mapping spherical
set angles degrees
set xyplane at -1
set view 56,81
set parametric
set isosamples 25
set urange[0:360]
set vrange[-90:90]
r = 0.99
splot r*cos(v)*cos(u),r*cos(v)*sin(u),r*sin(v) with lines linestyle 2,'world.dat' with lines linestyle 1
unset parametric
不幸的是,我无法将带有数据文件的散点图和带有参数的散点图混合在一起。
任何建议都值得欢迎! 谢谢
答案 0 :(得分:1)
为了生成下面的图,我使用了此blog post中链接的数据。现在,如果要将多个数据源组合到一个绘图中,则需要将一个或另一个转换为公共坐标系。如果卫星数据是在笛卡尔x,y,z坐标中,那么最简单的解决方案就是将世界地图也转换为笛卡尔系统。
这可以如下所示进行。参数R
表示Gnuplot在其上绘制世界地图的表面上的球体的半径。它应该比r
稍大一些,以便hidden3d
有效。 world_110m.txt
文件中的列具有经度(第一列)和纬度(第二列)的含义,因此转换方式为(R*cos($1)*cos($2)):(R*sin($1)*cos($2)):(R*sin($2))
。在文件input.pnts.dat
中,我生成了a=1.6
和b=1.2
绕x轴旋转45度(逆时针)的椭圆上的点的坐标。对于真实的卫星数据,需要通过除以地球半径来重新缩放坐标,即使用($1/Re):($2/Re):($3/Re)
代替1:2:3
,其中Re
表示半径,以数据的任何单位是(可能是米,根据您问题中的第一个图判断)。
set terminal pngcairo
set output 'fig.png'
set xr [-2:2]
set yr [-2:2]
set zr [-2:2]
#color definitions
set border lw 1.5
set style line 1 lc rgb '#000000' lt 1 lw 2
set style line 2 lc rgb '#c0c0c0' lt 2 lw 1
unset key; unset border; set tics scale 0
set format ''
set angles degrees
set xyplane at -1
set view 56,81
set lmargin screen 0
set bmargin screen 0
set rmargin screen 1
set tmargin screen 1
set parametric
set isosamples 25
set urange[0:360]
set vrange[-90:90]
r = 0.99
R = 1.00
set hidden3d
#since we are using Cartesian coordinates, we don't want this
#set mapping spherical
splot \
r*cos(v)*cos(u),r*cos(v)*sin(u),r*sin(v) with lines linestyle 2, \
'world_110m.txt' u (R*cos($1)*cos($2)):(R*sin($1)*cos($2)):(R*sin($2)) w l lw 2 lc rgb 'black', \
'input.pnts.dat' u 1:2:3 w l lw 2 lc rgb 'red'