2010-05-03 4 views
2

Я написал этот код, который создает анимацию из 2 эллипсоидов.

Параметр k1 этих эллипсоидов должен зависеть от времени (поэтому они будут двигаться асинхронно), но мне нужно оживить их на одном рисунке. Могу ли я использовать цикл для него или лучше использовать таймер & какие-то функции обратного вызова?

Вторая проблема - мне нужно перемещать внутренний эллипсоид, чтобы у них была одна общая сторона. Как я могу это сделать?Как оживить 2 поверхности в Matlab?

ответ

1

Вы должны использовать петлю. Большая часть вашего времени будет потрачена на графику и с командой «getFrame». Вы можете использовать

 profile
, чтобы проверить это. Цикл не добавит значительные накладные расходы и проще всего кода и понять


Что касается вашего второго вопроса, я не знаю точно, что вы просите, но если вы хотите сохранить точку в Обычная, вы должны параметризовать свою поверхность с точки зрения радиусов, угла наклона и т. д. и общей точки, а затем просто перемещать точку вокруг. Возможно, вам захочется рассмотреть функцию «drawEllipsoid», которая упростит и уточнит ваш код.

0

Петля кажется прекрасной для этой работы. Также будет работать таймер.

Я не уверен, что вы имеете в виду, когда говорите «есть одна общая сторона». Похоже, вы близки с добавлением 5 к X2, но вам нужен термин масштабирования, поскольку они не имеют одинаковой формы. Не могли бы вы уточнить?

Одно предложение. Я думаю, что вы будете намного счастливее, если вы двигаетесь создание объекта из петли, как это:

a=5; 
b=a; 
c=10; 
u = (0:0.05*pi:2*pi)'; %' 
v = [0:0.05*pi:2*pi]; 
X = a*sin(u)*cos(v); 
Y = a*sin(u)*sin(v); 
Z = c*cos(u)*ones(size(v)); 
Z(Z>0)=0; % cut upper 
V1=4/3*pi*a*b*c; 
d=1/2; 
e=2^d; 
a2=a/e; 
b2=a/e; 
c2=c; 
V2=4/3*pi*a2*b2*c2; 
X2 = a2*sin(u)*cos(v);%-2.5; 
Y2 = b2*sin(u)*sin(v); 
Z2 = c2*cos(u)*ones(size(v));%+0.25; 
Z2(Z2>0)=0; % cut 
h=1/3; 

hS1=surf(X,Y,Z); 
alpha(.11) 
hold on 
hS2=surf(X2,Y2,Z2); 
hold off 
axis([-20 20 -20 20 -20 20]); 

for j = 1:20 
    k1=(sin(pi*j/20)+0.5)^h; 
    a=a*k1; 
    c=c*k1; 
    X = a*sin(u)*cos(v); 
    Y = a*sin(u)*sin(v); 
    Z = c*cos(u)*ones(size(v)); 
    Z(Z>0)=0; 
    a2=a2*k1; 
    b2=a2*k1; 
    c2=c2*k1; 
    X2 = a2*sin(u)*cos(v)+5;%-2.5; 
    Y2 = b2*sin(u)*sin(v); 
    Z2 = c2*cos(u)*ones(size(v));%+0.25; 
    Z2(Z2>0)=0; 

    set(hS1,'XData',X,'YData',Y,'ZData',Z); 
    set(hS2,'XData',X2,'YData',Y2,'ZData',Z2); 
    drawnow; 
    F(j) = getframe; 
end 
movie(F,4) 

drawnow не является строго необходимым, поскольку здесь GetFrame содержит один, но это хорошо, чтобы вставить один так что вы можете увидеть, что происходит, если вы удалите getframe.

+0

«Одна общая сторона» - я имею в виду, что если вы представляете их как 2 стакана, то ставьте один в другой не в центр, а перемещаетесь в сторону (так, чтобы внутренняя сторона нарушала внешнюю сторону). Smth нравится :) – Kate

+0

Вы имеете в виду изменение +5 в расчете X2 на + (max (a2 (:)) - max (a (:)))? Это заставит их прикоснуться к + X стороне верхнего края. – MPG

+0

Да) Как я могу обрезать часть внутреннего эллипсоида, которая стоит вне внешней? – Kate

0

OK, вот ярлык для создания обрезанной поверхности, о которой я упоминал в своем предыдущем комментарии. То, что вы собираетесь сделать, - это ввести NaNs в координаты везде, где поверхность находится за пределами домена. Тогда на поверхностном объекте будут выпадать любые квадратики, которые касаются этих координат. Это не дает вам хороший чистый край, но это очень легко.

a=5; 
b=a; 
c=10; 
u = (0:0.05*pi:pi)'; %' 
v = [0:0.05*pi:2*pi]; 
X = a*sin(u)*cos(v); 
Y = a*sin(u)*sin(v); 
Z = c*cos(u)*ones(size(v)); 
Z(Z>0)=0; % cut upper 
V1=4/3*pi*a*b*c; 
d=1/2; 
e=2^d; 
a2=a/e; 
b2=a/e; 
c2=c; 
V2=4/3*pi*a2*b2*c2; 
X2 = a2*sin(u)*cos(v);%-2.5; 
Y2 = b2*sin(u)*sin(v); 
Z2 = c2*cos(u)*ones(size(v));%+0.25; 
Z2(Z2>0)=0; % cut 
h=1/3; 

hS1=surf(X,Y,Z); 
alpha(.11) 
hold on 
hS2=surf(X2,Y2,Z2); 
hold off 
axis([-20 20 -20 20 -20 20]); 

for j = 1:20 
    k1=(sin(pi*j/20)+0.5)^h; 
    a=a*k1; 
    c=c*k1; 
    X = a*sin(u)*cos(v); 
    Y = a*sin(u)*sin(v); 
    Z = c*cos(u)*ones(size(v)); 
    Z(Z>0)=0; 
    a2=a2*k1; 
    b2=a2*k1; 
    c2=c2*k1; 
    X2 = a2*sin(u)*cos(v)+5;%-2.5; 
    Y2 = b2*sin(u)*sin(v); 
    Z2 = c2*cos(u)*ones(size(v));%+0.25; 
    Z2(Z2>0)=0; 

    set(hS1,'XData',X,'YData',Y,'ZData',Z); 

    % substitute into implicit form of 1st ellipsoid 
    d = (X2.^2)/a^2 + (Y2.^2)/a^2 + (Z2.^2)/c^2; 
    % and zap any that are outside [0 1] 
    X2(d>1) = nan; 
    Y2(d>1) = nan; 
    Z2(d>1) = nan; 
    set(hS2,'XData',X2,'YData',Y2,'ZData',Z2); 
    drawnow; 
    F(j) = getframe; 
end 
movie(F,4) 

Обратите внимание, что я также изменил диапазон u. Это потому, что вы на самом деле рисуете 2 копии поверхности. Это вызывало некоторые проблемы с тем, как была прозрачна прозрачность.

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