2010-05-03 10 views
2

2 개의 타원체 애니메이션을 만드는이 코드를 작성했습니다.

이러한 타원체의 매개 변수 k1은 시간에 의존해야하므로 (비동기식으로 움직일 수 있음) 하나의 그림으로 애니메이션을 만들어야합니다. 루프를 사용할 수 있습니까? 아니면 타이머 & 일종의 콜백 함수를 사용하는 것이 더 좋습니까?

두 번째 문제 - 내부 타원체를 움직여 하나의 공통점을 갖도록해야합니다. 어떻게해야합니까?Matlab에서 2 개의 서페이스를 애니메이트하는 방법은 무엇입니까?

답변

1

루프를 사용해야합니다. 대부분의 시간은 "getFrame"명령을 사용하여 플로팅하는 데 소비됩니다. 이것을 확인하기 위해

 profile
을 사용할 수 있습니다. 루프에 대한 상당한 오버 헤드를 추가하고 코드에 가장 쉬운이고, 두 번째 질문에 대해서는


을 이해하지 않을 것이다, 당신이 요구하는지 정확히 모르겠지만, 당신은에 지점을 유지하려는 경우 일반적으로 반경, 경사 각도 등의 점과 공통점으로 표면을 매개 변수화해야합니다. 그런 다음 점을 주변으로 이동하십시오. 코드를 단순화하고 명확하게하는 "drawEllipsoid"함수를 작성하는 것이 좋습니다.

0

루프가이 작업에 적합합니다. 타이머도 작동합니다.

"공통점이 하나"라고 할 때 나는 무엇을 의미하는지 확신 할 수 없습니다. 마치 X2에 5를 더하는 것처럼 보이지만 같은 모양이 아니기 때문에 스케일링 용어가 필요합니다. 당신은 정교 할 수 있습니까?

하나의 제안. 나는이 같은 루프에서 객체 생성을 이동하는 경우가 많은 행복 할 거라고 생각 :

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) 

을 getframe이 하나 포함되어 있기 때문에 drawnow 여기에 반드시 필요한 것은 아니지만 하나를 삽입하는 것이 좋다 getframe을 제거하면 어떤 일이 일어나는지 알 수 있습니다.

+0

"하나의 공통점"- 두 개의 유리로 상상한다면, 하나가 아닌 가운데에 넣으십시오.하지만 옆으로 이동하십시오 (즉, 안쪽이 바깥 쪽을 가릴 것입니다). Smth that like :) – Kate

+0

X2 계산에서 +5를 + (max (a2 (:)) - max (a (:))로 변경한다는 것을 의미합니까? 그러면 맨 위 가장자리의 + X쪽에 손을 대게됩니다. – MPG

+0

예) 외부 타원체의 바깥쪽에있는 내부 타원체의 일부를 자르는 방법은 무엇입니까? – Kate

0

좋아, 여기 내 이전 설명에서 언급 한 트림 된 표면을 수행하는 지름길이 있습니다. 여러분이 할 일은 표면이 도메인 밖에있는 모든 좌표에 NaN을 놓는 것입니다. 그런 다음 곡면 개체는 해당 좌표를 터치하는 모든 쿼드를 삭제합니다. 그건 당신에게 좋은 깨끗한면을주지는 않지만 정말 쉽습니다.

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의 범위가 변경되었습니다. 왜냐하면 실제로 표면의 복사본 두 개를 그리기 때문입니다. 투명성이 렌더링 된 방식에 문제가 발생했습니다.

관련 문제