본문 바로가기
programming language/MATLAB

MATLAB movie() 함수를 이용하여 움직이는 그래프를 만들어보자

by 남성 2010. 1. 19.

움직이는 그래프를 만들어 보자

매트랩에서 그래프를 동영상으로 만드는 방법은 매우 간단하다.

변수에 따라 for 문을 이용하여 그래프를 그리고 각 프레임을 저장을 한다. 그리고 movie() 함수를 이용하여 실행한다.

아래 코드는 사인 함수의 계수값을 증가시키면 어떻게 되는지를 보여주는 코드이다.  


axx = 0:0.01:2*pi;  

for k=1:16
plot(axx, k*sin(axx));

grid on

axis([0 2*pi -16 16])

M(k)=getframe;

end

movie(M,1)  


avifile() 함수를 이용하여 avi object 를 만들어서 avi 파일로 저장도 가능하다.

아래 결과는 좀더 좁은 간격의 k 값에 대하여 실행한 결과이다. 
 



댓글12

  • ㅠㅠ 2012.03.20 01:32

    동영상처럼 나오게 하려고 했는데
    for k=0.1:0.1:16으로 하니 Subscript indices must either be real positive integers or logicals. 에러뜨네요 ㅠㅠ 방법좀 알려주시면 감사하겠습니다!
    답글

    • 남성 2012.03.20 02:26 신고

      for k=0.1:0.1:16 로 하면 k 값은 0.1, 0.2, 0.3 ... 16 까지 가는거죠.

      그렇다면 아래 부분의 코드를 보면 M(k)=getframe; 부분에서

      M(0.1), M(0.2), .... M(16) 이렇게 들어가게 되겠죠. 벡터 또는 매트릭스의 인덱스는 양의 정수나 logical 값만 들어가야되니깐 에러가 나게 되는거죠.

      좋은 방법은 아니지만 아래와 같이 코딩할 수도 있습니다.


      axx = 0:0.01:2*pi;

      for k=0.1:0.1:16
      plot(axx, k*sin(axx));

      grid on

      axis([0 2*pi -16 16])

      M(round(k*10))=getframe;

      end

      movie(M,1)


      더 좋은 방법은 k를 1:160 으로 하고

      plot(axx, k./10 .*sin(axx)); 이렇게 바꿔주는게 개인적으로는 더 추천 하는 방식입니다.

  • 2012.03.20 22:24

    비밀댓글입니다
    답글

    • 남성 2012.03.20 22:54 신고

      죄송하지만, k가 커졌다 작아졌다 한다는게 정확히 무슨 말씀인지 모르겠네요. 좀더 구체적으로 말씀해 주시는게 좋을듯 합니다.

      k 값이 1에서 부터 16 까지 갔다가 다시 1로 줄어들게 되는걸 말슴하시는건가요? 아님 계속 k 값이 랜덤 하게 들쭉 날쭉 하게 되게 한다는건가요?

    • 2012.03.21 00:52

      비밀댓글입니다

    • 남성 2012.03.21 01:01 신고

      이렇게 하면 됩니다.


      axx = 0:0.01:2*pi;

      temp_k=[1:16 15:-1:1];

      for k=1:length(temp_k)
      plot(axx, temp_k(k)*sin(axx));

      grid on

      axis([0 2*pi -16 16])

      M(k)=getframe;

      end

      movie(M,1)

  • 2015.07.30 14:52

    비밀댓글입니다
    답글

    • 남성 2015.07.30 23:52 신고

      위 코드에서는 M 의 인덱스가 잘못된것 같네요.

      다음과 같이 해 보세요.

      아래 코드가 방문자님이 의도한게 맞나 모르겟네요.

      wt = 0:pi/50:10*pi;

      x = cos(wt + (pi/180));
      y = wt-wt;
      x1 = wt-wt;
      y1 = cos(wt);

      for c = 0:1:10
      figure
      plot3(x-c, y, wt, x1, y1-c, wt)

      axis tight
      grid on
      M(c+1)=getframe;
      end

      movie(M,1)

    • 2015.07.31 11:08

      비밀댓글입니다

    • 남성 2015.07.31 12:15 신고

      다음과 같이 해보세요.

      wt = 0:pi/50:10*pi;

      x = cos(wt + (pi/180));
      y = wt-wt;
      x1 = wt-wt;
      y1 = cos(wt);

      h=figure(1);
      set(h,'visible','off')

      for c = 0:1:10
      plot3(gca, x-c, y, wt)
      axis([-10 10 -10 10 0 32])
      grid on
      M(c+1)=getframe;
      end

      set(h,'visible','on')
      movie(M,1)

    • 2015.08.01 12:45

      비밀댓글입니다

    • 남성 2015.08.01 13:41 신고

      도움되었다니 다행이네요. 방문해 주셔서 감사합니다. ^^