2017-01-13 2 views
1

, поэтому у меня есть эта симуляция планеты, в которой я хотел бы построить положение планет (так что непрерывная линия, которая следует за планетами при движении) и попыталась использовать так много разных вариаций of linepec. Я считаю, что проблема может заключаться в том, что я сначала использую функцию «set (h ..)», а затем рисую в цикле, но я не уверен.График Matlab исчезает при добавлении linepec

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 

Так что, если вы посмотрите перед циклом вы увидите «набор (...)» функцию я упоминал, и в конце цикла является построение. Если я изменю i.e. @ h_mercury из 'k.' к 'k' планета полностью исчезает. Если я изменю его на '-.' он также исчезает. Я пробовал бесчисленные вариации, и планета исчезает, или это дает мне ошибку. Я просмотрел раздел помощи @matlabs в пределах 2-го участка, 3d-графика, линии и т. Д. И до сих пор не нашел решения!

Я надеюсь, что кто-то может помочь мне понять это как можно быстрее!

Благодаря

ответ

0

Ваши участки для каждой планеты линии участков с одной точки (plot3(0,0,0,'k.',...)). Это означает, что когда вы укажете маркер, ваша единственная точка будет оснащена маркером, и именно так вы ее видите. В настоящее время вы используете маркер точки ('k.'). Если вы удалите точку, больше нет маркера, а также нет линии, так как нет двух точек для подключения.

Ваш set(...) обновляет сюжет не путем добавления точек к нему, а путем перемещения единственной точки, которую вы построили изначально. Чтобы узнать, что произойдет, введите inspect(h_mercury), вы увидите, что его XData, YData, ZData содержит только одну точку.

Если вы хотите нарисовать линии с предыдущими точками, вам нужно добавить их к сюжету. Существует не менее двух способов:

  • Добавить 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

+0

Так что я попытался код, который вы написали, но он только добавил линия от солнца до планеты (я только пытался с Меркурием посмотреть, как она будет выглядеть), которая следит за планетой вокруг чего-то вроде моста от планеты до солнца. Что является причиной этого? А что касается другого решения, которое вы написали, я бы затем добавил plot3 (...) после набора (...) aka непосредственно перед концом цикла? – Rida

+0

Я сделал небольшую ошибку. Мои извинения. Я отредактировал свое решение и протестировал его здесь, теперь он должен работать. – Florian

+0

Точно! Я попытаюсь скопировать то, что вы создали, и добавить его ко всем моим планетам! Если вы хотите объяснить немного дальше, я бы хотел попытаться понять, что делает ваш код, а не просто скопировать его! – Rida

0

линия Форматирование

Сидела линия исчезает, когда вы изменить стиль от '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 
+0

Итак, я переместил PLOT3, который был вне моей петли, внутри моей петли сразу после моих вычислений. и заменил SET на PLOT3. Это устранило проблему, но она просто добавляет (предыдущие) точки и как таковой маркер вместо добавления строки за движущимся маркером. – Rida

+0

Не удалось отредактировать мой комментарий, но я только заметил, что он также превратил мою 3D-симуляцию в 2d-моделирование. – Rida

+0

Итак, у вас есть: отображение, которое обновляется в соответствии с симуляцией. Вы хотите: то же самое, но с линией ранее рассчитанных значений тоже? Кроме того, это не изменяет вашу симуляцию вообще, поэтому я не уверен, что вы имеете в виду, говоря, что теперь это 2D? – Wolfie

Смежные вопросы