Я написал этот код, который создает анимацию из 2 эллипсоидов.
Параметр k1 этих эллипсоидов должен зависеть от времени (поэтому они будут двигаться асинхронно), но мне нужно оживить их на одном рисунке. Могу ли я использовать цикл для него или лучше использовать таймер & какие-то функции обратного вызова?
Вторая проблема - мне нужно перемещать внутренний эллипсоид, чтобы у них была одна общая сторона. Как я могу это сделать?Как оживить 2 поверхности в Matlab?
ответ
Вы должны использовать петлю. Большая часть вашего времени будет потрачена на графику и с командой «getFrame». Вы можете использовать
profile, чтобы проверить это. Цикл не добавит значительные накладные расходы и проще всего кода и понять
Что касается вашего второго вопроса, я не знаю точно, что вы просите, но если вы хотите сохранить точку в Обычная, вы должны параметризовать свою поверхность с точки зрения радиусов, угла наклона и т. д. и общей точки, а затем просто перемещать точку вокруг. Возможно, вам захочется рассмотреть функцию «drawEllipsoid», которая упростит и уточнит ваш код.
Петля кажется прекрасной для этой работы. Также будет работать таймер.
Я не уверен, что вы имеете в виду, когда говорите «есть одна общая сторона». Похоже, вы близки с добавлением 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.
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 копии поверхности. Это вызывало некоторые проблемы с тем, как была прозрачна прозрачность.
- 1. Входы поверхности поверхности MATLAB
- 2. Анимация поверхности в Matlab
- 3. Разделение 3D-поверхности в MATLAB
- 4. Как оживить этот 3D-график в Matlab?
- 5. Matlab - Периодическая черепица поверхности
- 6. MATLAB участок часть поверхности
- 7. Как оживить точки на изображении в MATLAB?
- 8. MATLAB - 3D-график поверхности
- 9. Сглаживание 3D-поверхности в Matlab
- 10. Как построить график пользовательской поверхности в Matlab?
- 11. Визуальное тороидальной поверхности в Matlab
- 12. Генерация поверхности сетки в MATLAB
- 13. MATLAB cftool матрица поверхности
- 14. Как очертить область на поверхности в Matlab
- 15. Matlab вычисляет неправильные нормали поверхности?
- 16. использование бар Цвет в MatLab изображения поверхности
- 17. Земельный участок 3d поверхности в Matlab/freemat
- 18. проблема с поверхности с MATLAB
- 19. Дополнительная ось на 3D поверхности в MATLAB
- 20. изменение поверхности графика цвета в MATLAB
- 21. экспорт svg изображение из участка поверхности MATLAB
- 22. Рисование поверхности конуса в общем уравнении в Matlab
- 23. Как построить график поверхности
- 24. Как текстурировать карту на повернутой поверхности в Matlab?
- 25. Как я могу рассчитать объем поверхности фитинга в matlab?
- 26. MATLAB: Как найти площадь произвольной поверхности в 2d закрытые формы
- 27. Нанесение глобальных температур морской поверхности на MATLAB
- 28. визуализация рассеянных данных по поверхности сферы MATLAB
- 29. MATLAB 3d график поверхности от данных scatter3
- 30. Есть ли контроль поверхности в Surface 2?
«Одна общая сторона» - я имею в виду, что если вы представляете их как 2 стакана, то ставьте один в другой не в центр, а перемещаетесь в сторону (так, чтобы внутренняя сторона нарушала внешнюю сторону). Smth нравится :) – Kate
Вы имеете в виду изменение +5 в расчете X2 на + (max (a2 (:)) - max (a (:)))? Это заставит их прикоснуться к + X стороне верхнего края. – MPG
Да) Как я могу обрезать часть внутреннего эллипсоида, которая стоит вне внешней? – Kate