添加linespec时,Matlab图形消失

时间:2017-01-13 08:03:46

标签: 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/(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(...)”函数,并且在循环结束时是绘图。如果我从'k'改变@ h_mercury。 'k'这个星球完全消失了。如果我将其更改为“ - ”。它也消失了。我尝试了无数的变化,无论是行星消失还是给我一个错误。我在2d图,3d图,linespec等内部查看了帮助部分@matlabs网站,但仍然没有找到解决方案!

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

由于

2 个答案:

答案 0 :(得分:0)

每个行星的图表都是单点(plot3(0,0,0,'k.',...))的线图。这意味着当您指定标记时,您的单个点将配备标记,这就是您的看法。目前,您正在使用点标记(' k。')。如果删除点,则没有标记,也没有线,因为没有两个点可以连接。

您的set(...)不是通过添加点来更新绘图,而是通过移动您最初绘制的单点来更新绘图。要查看发生了什么,请输入inspect(h_mercury),您会注意到其XDataYDataZData只包含一个点。

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

  • 在循环中添加plot3(p_mercury(1),p_mercury(2),p_mercury(3),'k.'))。这将在已经访问过的所有位置上添加额外的绘图点。虽然这很简单,但它不一定是最好的:没有连接点的实线,如果你做了很多步骤,这将增加很多点,从而使动画变慢。如果你想使用它,你还必须在循环结束时删除hold off命令,否则plot3将清除图。
  • 更好:记住阵列中的轨迹并有两个图,一个用于当前位置(点标记),一个用于轨迹(线)。这样的事情:

h_mercury = plot3(1,1,1,'k.','markersize',35);
h_mercury_trajectory = plot3(1,1,1,'k-');

p_mercury_trajectory = zeros(3,n);
for step = 1:n
    % your calculation of positions...
    p_mercury = ...
    p_mercury_trajectory(:,step) = p_mercury;

    % rest of the loop ...

    % update plots
    set(h_mercury,'XData',p_mercury(1),'YData',p_mercury(2),'ZData',p_mercury(3));
    set(h_mercury_trajectory,'XData',p_mercury_trajectory(1,1:step),'YData',p_mercury_trajectory(2,1:step),'ZData',p_mercury_trajectory(3,1:step));
end

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

Screenshot of orbit simulation

这是你的想法吗?

再一次编辑:由于我非常喜欢你的动画,我将太阳和行星转换为球体,光线来自中心(太阳)。我有点像效果。这就是它的样子:

Screenshot of modified orbit simulation

虽然月亮的轨道有点夸张,对吗?

无论如何,修改过的脚本在这里:https://nopaste.me/view/473add8f

答案 1 :(得分:0)

行格式

当您将样式从'k.'更改为'k'时,您的线条正在消失,您正在绘制单个点(格式为.中的点),所以如果你不这样做t绘制点标记,你没有可见的线!请参阅下面的代码,可用于绘制连续迹线或移动点。

建议代码

我完全省略了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