添加linespec时Matlab图形消失

添加linespec时Matlab图形消失,matlab,plot,simulation,Matlab,Plot,Simulation,所以我有一个行星模拟,我想画出行星的位置(一条沿着行星移动的不间断的线),并尝试使用许多不同的linespec变体。我相信问题可能是因为我首先使用了“set(h…)”函数,然后在循环中绘图,但我不确定 clc, close all, clear all %% Constants m_sun=1.9891*10^(30); % Sun mass KG m_earth=5.972*10^(24); G=1.4879*10^(-34); %Gravitational constant %AU^3/

所以我有一个行星模拟,我想画出行星的位置(一条沿着行星移动的不间断的线),并尝试使用许多不同的linespec变体。我相信问题可能是因为我首先使用了“set(h…)”函数,然后在循环中绘图,但我不确定

clc, close all, clear all

%% Constants
m_sun=1.9891*10^(30); % Sun mass KG
m_earth=5.972*10^(24); 
G=1.4879*10^(-34); %Gravitational constant %AU^3/(kg*day^2) %Because JPL Data..
n=36500; %1 year is 36.5 because 1 step is 10 days so this is 10 years.
dt=1; %Stepsize is by the DATA from JPL aut. set to 10 days (dt=1 aka 10 days)

%% Start pos. and velocity for Sun, Mercury, Venus, Earth and Moon
psol=[0 0 0];

%% Mercury
x_mercury=-1.433719457930228E-01; %AU
y_mercury=2.837093715285307E-01; %AU
z_mercury=3.633570612044031E-02; %AU

vx_mercury=-3.076848842366683E-02; %AU/Day
vy_mercury=-1.162353364156454E-02; %AU/Day
vz_mercury=1.872970822663991E-03;

v0_mercury=[vx_mercury vy_mercury vz_mercury];
p0_mercury=[x_mercury y_mercury z_mercury];
v_mercury=v0_mercury;
p_mercury=p0_mercury;

%% Venus
x_venus=4.673243997906552E-01; %AU
y_venus=5.508231287051383E-01; %AU
z_venus=-1.941467305848078E-02; %AU

vx_venus=-1.548526759260772E-02; %AU/Day
vy_venus=1.299852601837024E-02; %AU/Day
vz_venus=1.071832461568199E-03; %AU/Day

v0_venus=[vx_venus vy_venus vz_venus];
p0_venus=[x_venus y_venus z_venus];
v_venus=v0_venus;
p_venus=p0_venus;

%% Earth
x_jord=-1.796136519182077E-01; %AU
y_jord=9.667949205028737E-01; %AU
z_jord=-3.668730384613077E-05; %AU

vx_jord=-1.720038360546182E-02; %AU/Day
vy_jord=-3.211186215649903E-03; %AU/Day
vz_jord=7.927770738232715E-07; %AU/Day

v0_jord=[vx_jord vy_jord vz_jord];
p0_jord=[x_jord y_jord z_jord];
v_jord=v0_jord;
p_jord=p0_jord;

%% Moon 
x_moon=1.735515971173234E-03; %AU
y_moon=-1.954900859093033E-03; %AU
z_moon=9.023023109649464E-05; %AU

vx_moon=4.195999130374965E-04; %AU/Day
vy_moon=4.002519066694706E-04; %AU/Day
vz_moon=-4.849066257645466E-05; %AU/Day

v0_moon=[vx_moon vy_moon vz_moon];
p0_moon=[x_moon y_moon z_moon];
v_moon=v0_moon;
p_moon=p0_moon;


%% Calculations
hold on
h_sun = plot3(0,0,0,'y.','markersize',80);
h_mercury = plot3(1,1,1,'k.','markersize',35);
h_venus = plot3(2,2,2,'m.','markersize',45);
h_earth = plot3(3,3,3,'b.','markersize',55);
h_moon = plot3(4,4,4,'r.','markersize',25);

for step=1:n
      %% Mercury
      r_vekt_mercury=-p_mercury;
      r_mercury=sqrt(x_mercury^2 + y_mercury^2 + z_mercury^2); %Radius in AU
      a_mercury=((G*m_sun)/((r_mercury)^3))*r_vekt_mercury;
      v_mercury=a_mercury*dt+v_mercury;
      p_mercury=v_mercury*dt+p_mercury;

      %% Venus
      r_vekt_venus=-p_venus;
      r_venus=sqrt(x_venus^2 + y_venus^2 + z_venus^2); %Radius in AU
      a_venus=((G*m_sun)/((r_venus)^3))*r_vekt_venus;
      v_venus=a_venus*dt+v_venus;
      p_venus=v_venus*dt+p_venus;

      %% Jord
      r_vekt_jord=-p_jord;
      r_jord=sqrt(x_jord^2 + y_jord^2 + z_jord); %Radius in AU
      a_jord=((G*m_sun)/((r_jord)^3))*r_vekt_jord;
      v_jord=a_jord*dt+v_jord;
      p_jord=v_jord*dt+p_jord;

%     %% Moon
      %r_vekt_moon=psol-p_moon;
      r_vekt_moon_earth=p_jord-p_moon;
      r_moon=sqrt(x_moon^2 + y_moon^2 + z_moon^2); %Radius in AU
      a_moon=((G*m_earth)/((r_moon)^3))*r_vekt_moon_earth;
      v_moon=a_moon*dt+v_moon;
      p_moon=v_moon*dt+p_moon;

      set(h_sun,'XData',psol(1),'YData',psol(2),'ZData',psol(3));    
      set(h_mercury,'XData',p_mercury(1),'YData',p_mercury(2),'ZData',p_mercury(3));
      set(h_venus,'XData',p_venus(1),'YData',p_venus(2),'ZData',p_venus(3));
      set(h_earth,'XData',p_jord(1),'YData',p_jord(2),'ZData',p_jord(3));
      set(h_moon,'XData',p_moon(1),'YData',p_moon(2),'ZData',p_moon(3));
      xlabel('AU');
      ylabel('AU');
      zlabel('AU');
      axis([-2 2 -2 2 -2 2]);
      drawnow;
      hold off
  end
因此,如果您在循环之前查看,您将看到我提到的“set(…)”函数,在循环的末尾是绘图。如果我将@h_mercury从“k”改为“k”,行星将完全消失。如果我把它改成“-”,它也会消失。我尝试了无数的变化,要么行星消失了,要么它给了我一个错误。我在matlabs网站上查看了2d plot、3d plot、linespec等的帮助部分,但仍然没有找到解决方案

我希望有人能尽快帮我解决这个问题


谢谢

您对每个行星的绘图都是带有一个点的直线图(
plot3(0,0,0,'k.,…)
)。这意味着,当您指定标记时,您的单个点将配备标记,这就是您看到它的方式。目前,您正在使用点标记('k')。如果删除该点,则不会有更多标记,也不会有线,因为没有两个要连接的点

您的
集合(…)
不是通过向其添加点而是通过移动最初绘制的单个点来更新打印。要查看发生了什么,请键入
inspect(h_mercury)
,您将注意到其
XData
YData
ZData
仅包含一个点

如果要使用前面的点绘制直线,则需要将它们添加到绘图中。至少有两种方法:

  • 在循环中添加
    plot3(p_mercury(1)、p_mercury(2)、p_mercury(3),'k')
    。这将在已访问的所有位置放置额外的绘图点。虽然这很简单,但并不一定是最好的:不会有一条连接点的实线,如果你做了很多步骤,这将添加很多点,从而使动画变慢。如果要使用此命令,还必须删除循环结束时的
    暂停
    命令,否则
    plot3
    将清除打印
  • 更好:记住数组中的轨迹,并有两个图,一个用于当前位置(点标记),一个用于轨迹(线)。大概是这样的:

以下是开始后不久的情况:

这就是你的想法吗

再编辑一次:因为我真的很喜欢你的动画,所以我将太阳和行星转化为球体,光线来自中心(太阳)。我有点喜欢这种效果。这就是它看起来的样子:

不过月球的轨道有点夸张,对吧


无论如何,修改后的脚本在这里:

您对每个行星的绘图都是带有一个点的线图(
plot3(0,0,0,k.,…)
)。这意味着,当您指定标记时,您的单个点将配备标记,这就是您看到它的方式。目前,您正在使用点标记('k')。如果删除该点,则不会有更多标记,也不会有线,因为没有两个要连接的点

您的
集合(…)
不是通过向其添加点而是通过移动最初绘制的单个点来更新打印。要查看发生了什么,请键入
inspect(h_mercury)
,您将注意到其
XData
YData
ZData
仅包含一个点

如果要使用前面的点绘制直线,则需要将它们添加到绘图中。至少有两种方法:

  • 在循环中添加
    plot3(p_mercury(1)、p_mercury(2)、p_mercury(3),'k')
    。这将在已访问的所有位置放置额外的绘图点。虽然这很简单,但并不一定是最好的:不会有一条连接点的实线,如果你做了很多步骤,这将添加很多点,从而使动画变慢。如果要使用此命令,还必须删除循环结束时的
    暂停
    命令,否则
    plot3
    将清除打印
  • 更好:记住数组中的轨迹,并有两个图,一个用于当前位置(点标记),一个用于轨迹(线)。大概是这样的:

以下是开始后不久的情况:

这就是你的想法吗

再编辑一次:因为我真的很喜欢你的动画,所以我将太阳和行星转化为球体,光线来自中心(太阳)。我有点喜欢这种效果。这就是它看起来的样子:

不过月球的轨道有点夸张,对吧


无论如何,修改后的脚本在这里:

行格式

当您将样式从
'k.
更改为
'k'
时,直线正在消失,您正在打印一个点(格式为
中的点),因此如果您不打印点标记,则没有可见直线!有关可用于绘制连续轨迹或移动点的代码,请参见下文

建议代码

我完全省略了
Set
命令,只是简单地重新绘制了每个迭代,请参见下文

% Previous code omitted
% < ... >

%% Calculations

for step=1:n

    % < ... >
    % Code omitted for clarity, do calculations for each planet as in question
    % < ... >

    % Replace use of SET with continued use of PLOT3

    % Clear figure from previous plot and hold on
    figure(1)
    clf          % << Remove if you don't want the previous points to disappear
    hold on

    % Do all plotting
    h_sun = plot3(psol(1),psol(2),psol(3),'y.','markersize',80);
    h_mercury = plot3(p_mercury(1),p_mercury(2),p_mercury(3),'k.','markersize',35);
    h_venus = plot3(p_venus(1),p_venus(2),p_venus(3),'m.','markersize',45);
    h_earth = plot3(p_jord(1),p_jord(2),p_jord(3),'b.','markersize',55);
    h_moon = plot3(p_moon(1),p_moon(2),p_moon(3),'r.','markersize',25);

    % Format, hold off, draw
    xlabel('AU');
    ylabel('AU');
    zlabel('AU');       
    axis([-2 2 -2 2 -2 2]);     
    hold off        
    drawnow;

end
%省略了以前的代码
% < ... >
%%计算
对于步骤=1:n
% < ... >
%为了清楚起见,代码省略了,对每个行星进行计算
% < ... >
%将SET的使用替换为PLOT3的继续使用
%从上一个绘图中清除图形并保持不变
图(1)

clf%行格式

当您将样式从
'k.
更改为
'k'
时,直线正在消失,您正在打印一个点(格式为
中的点),因此如果不打印点标记,则没有可见直线
% Previous code omitted
% < ... >

%% Calculations

for step=1:n

    % < ... >
    % Code omitted for clarity, do calculations for each planet as in question
    % < ... >

    % Replace use of SET with continued use of PLOT3

    % Clear figure from previous plot and hold on
    figure(1)
    clf          % << Remove if you don't want the previous points to disappear
    hold on

    % Do all plotting
    h_sun = plot3(psol(1),psol(2),psol(3),'y.','markersize',80);
    h_mercury = plot3(p_mercury(1),p_mercury(2),p_mercury(3),'k.','markersize',35);
    h_venus = plot3(p_venus(1),p_venus(2),p_venus(3),'m.','markersize',45);
    h_earth = plot3(p_jord(1),p_jord(2),p_jord(3),'b.','markersize',55);
    h_moon = plot3(p_moon(1),p_moon(2),p_moon(3),'r.','markersize',25);

    % Format, hold off, draw
    xlabel('AU');
    ylabel('AU');
    zlabel('AU');       
    axis([-2 2 -2 2 -2 2]);     
    hold off        
    drawnow;

end