본문으로 바로가기

오랜만에 MATLAB 업데이트인데요... 뭐 크게 익힐 건 없지만^^... 이번에 정리할 내용은 간단히 애니메이션을 구현해보는 것입니다. 여러가지 접근법이 있지만, 특별히 그림이 복잡하지 않다면 간단히 fill명령으로 가능합니다.

fill 명령 !

MATLAB에서 그림을 그리는 명령어중 fill이라는 명령이 있습니다. 간단한 예제를 하나 보면

위에 보이는 코드에 x, y가 보이시지요?^^ 아래 결과 그래프와 같이 보시면, (-1,-1)->(-1,1)->(1,1)->(1,-1) 순서로 점을 잡고 fill명령을 사용하면 그 둘레로 만들어진 다각형이 만들어집니다. 색상코드 'r'을 사용했으니 빨간색으로 칠해지구요. 그 그림을 box라는 변수에 개체화해서 저장합니다.

간단히 fill명령을 보았으니 간단히 저 사각형을 돌려보죠.

저 코드에서는 box의 속성 중 EraseMode를 Normal로 설정한 것이 보일겁니다. 저것이 배경은 놔두고 저 속정을 가지 개체만 다시그리라는 뜻입니다. 간단히 2차원 평면의 회전행렬 Rot을 정의해서 45도 회전시켜 보는 겁니다. 그리고 set 명령이 보이는데요. 개체화된 box를 set명령으로 새로운 좌표를 인식시키는 겁니다.

위와 같이 만들어 지는 것이지요

간단한 예제 !

AniTest = figure('name','Animation Test','numbertitle','off');
x = [-3 -3.5  -4 -4 -3];
y = [1 1.5 1 -1 -1];
 
box = fill(x,y, 'r','EraseMode','normal');
grid on
hold on
axis([-5 5 -5 5]);
 
t = 0:0.01:2*pi;
plot(3*cos(t), 3*sin(t))
plot(17^0.5*cos(t), 17^0.5*sin(t))
plot((3.5^2+1.5^2)^0.5*cos(t), (3.5^2+1.5^2)^0.5*sin(t), 'c')
 
for t = 0:0.01:2*pi
    updatedX = [10^0.5*cos(-(t+pi+atan(1/3))) (3.5^2+1.5^2)^0.5*cos(-(t+pi+atan(3/7))) 17^0.5*cos(-(t+pi+atan(1/4))) 17^0.5*cos(-(t+pi-atan(1/4))) 10^0.5*cos(-(t+pi-atan(1/3)))];
    updatedY = [10^0.5*sin(-(t+pi+atan(1/3))) (3.5^2+1.5^2)^0.5*sin(-(t+pi+atan(3/7))) 17^0.5*sin(-(t+pi+atan(1/4))) 17^0.5*sin(-(t+pi-atan(1/4))) 10^0.5*sin(-(t+pi-atan(1/3)))];
    set(box, 'Xdata', updatedX,'Ydata', updatedY);
    drawnow;
    
    for i=1:5000000
        temp = i;
    end
end

음 대충 오각형처럼 생긴 것을 원둘레로 빙빙 회전시키는 코드입니다. 위 예제에서는 for문을 이용해서 원둘레를 돌도록 설정했는데요. for문안에 다시 만들어진 for문은 컴퓨터의 속도가 원체 빨라서 좀 천천히 그리라는 의미로 넣어둔것입니다. 그리고 drawnow; 라는 명령이 보이는데요. 만약 이 명령어를 넣지 않고서 그냥 전체 실행을 하면 실행된 결과만 한참있다가 보시게 됩니다. for문 내부 실행을 완료한 다음 그래프가 나타나거든요. 그래서 매 for문마다 그림을 업데이트 시켜줘야만 합니다.


댓글을 달아 주세요

  1. BlogIcon boramina 2009.10.10 09:47 신고

    이건...어느 나라 말인가요?ㅎㅎ

  2. BlogIcon 검도쉐프 2009.10.12 01:05 신고

    pinkwink님 대단하세요~
    이런 블로그를 보면, 정말 자신만의 분야를 만들어가는 전문블로거같아서 부럽습니다. ^^

    • BlogIcon PinkWink 2009.10.12 05:41 신고

      너무 '자신만'의 블로그를 만들다보니...
      협소한 인맥을 가지게 된다는...ㅎㅎㅎ
      뭐 그러나...
      블로그를 시작하던 최초의 마음은 엷은 지식을 자랑하는 것이 아니라 더 엷어지기전에 정리하겠다는 마음이었거든요....^^
      하여간 칭찬에 또 몸둘바를 모르겠습니다...^^

  3. 영웅전쟁 2009.10.14 20:24 신고

    이젠 하나도 모르겠군요...
    세월의 무상함이란....

  4. BlogIcon 라라윈 2009.12.07 01:59 신고

    MATLAB도 일일이 명령어를 다 입력해야 되는 프로그램인가봐요....

  5. 정인 2010.10.22 23:50 신고

    rotational matix에서 cos(t+pi+atan(1/4)) 같은 수식을 이해못하겠습니다. 왜 그런지 설명해 주실수 있으세요?

    • BlogIcon PinkWink 2010.10.23 00:56 신고

      화살표 모양이라고 해야하나.. 아무튼 5각형 모양인데요.
      다섯개의 점의 원점에서 표현한건데..
      그게 원둘레를 따라 돌아가기를 바란것이죠.
      종이에.. 위 코드를 실행하는 나타나는 원들을 그리시고
      반지름과 각도를 이용해서 선을 그어서 좌표를 표현해보시길 권장합니다. 댓글로 설명드리긴 좀 기니까요,
      원위의 자표가 (r*cos(theta), r*sin(theta))라는 것을 아시면,
      제가 의도한 것을 아실 수 있으리라 생각됩니다.

  6. 정인 2010.10.23 04:24 신고

    예. 이해가되었습니다. 저는 위의 코드를 변형해서 가로로 누운 삼각형(예를들어, (0,-1) (-5,-0.5) (-5,0.5) (0,1))에대해서 회전모양을 만들어보았는데요. 원점에대해서 회전을하는 동안 면적이 겹치는 부분을 추출해보고 싶은데요. 방법이 있을까요??

  7. 궁금한점이요 2010.12.04 23:49 신고

    이그림에서 만약에 (0,2)정도에 점을 하나 잡고 그 점에서 빛을 내리면 밑에 그림자가 생기자나요~~ 또 사각형을 회전시킨그림에서도 같은 점에서 빛을 쏘면 그림자가 생기고여 그림자의 길이는 다르겠죠? 이걸 표현하려면 어케 하나요?>????

    • BlogIcon PinkWink 2010.12.04 23:53 신고

      MATLAB에서 기본으로 제공되는 것으로 그림자(광원에 대비한)를 구현하는 기능이 있는지를 잘 모르겠습니다. 그런 기능이 있는지 잘 모르는 제 입장에서 말씀드리겠습니다. 그렇다면.. 광원의 위치와 그로부터 정사영될 평면을 잡고... 계산을 통해 그림자의 좌표를 모두 찾은 다음 직접 그리는 것입니다. 어차피 물체의 각 지점마다의 좌표를 안다면, 광원(실제로는 빛의 각도만 필요하겠죠...)을 고려한 정사영된 좌표를 계산할 수 있을테니까요.

  8. eblue 2011.02.09 23:42 신고

    fill 또는 patch 와 관련해서 질문이 있어요^^; fill(x,y,'color') 선언하면, 주어진 x,y 좌표에 대해서 근사화된 polygon이 그려지잖아요. (patch() 를 써도 그렇구요.) 그래서 figure(); 이용해서 이미지를 그릴수는 있겠는데요. 문제는 그 근사화된 polygon 자취와 내부의 점들을 저장하고 싶거든요. 그걸 가능케 하는 함수가 매트랩에서 제공되는지 궁금하네요.

    요컨대, 주어진 x,y 좌표(불규칙한 모양)을 다각형(polygon)으로 근사화 해서 근사화된 좌표를 저장하게 하는 함수가 있나요? 아니면 patch 등의 함수로 변환된 이미지를 좌표료 저장하게 하는 tool 이 있나요?

    갑작스럽게 찾아와 질문드려서 죄송해요. 질문이 조금은 어렵죠? 구글링 해보고 했는데, 이건 고수들한테 질문해야 할것 같아서요. 답변 주시면 감사하겠습니다.

    • BlogIcon PinkWink 2011.02.10 08:56 신고

      사실.. 저는 함수의 종류를 많이 알진 못한답니다. 필요하다 싶으면 만들어 쓰는 스타일이거든요. 만약 의도하신 함수를 찾고 싶으시다면 matlabcentral에서 찾아보시는것이 좋을것 같습니다. 직접 만드는 것도 생각보단 재미있답니다.

  9. noah 2011.05.16 01:52 신고

    이걸 응용해서 sin 그래프 같은것을 x축 방향 일자로 움직이려고 합니다. ㅠ
    올려주신 GUI 에서 구현을 하려고 하는데 잘 안되네요. ㅠ
    어떠한 방향으로 구현을 해야 하나요 ?? ㅠ ?

    • BlogIcon PinkWink 2011.05.16 08:01 신고

      설명은 이동이라는 글자를 선택했지만...
      사실..
      지우고 다시 그리는 겁니다.
      이 포스팅대로 하시는 거라면
      적절한 시간간격마다
      이동시키면서 다시 그리시면 됩니다.

  10. cherry 2015.04.15 00:40 신고

    Draw a unit cube with four vertices, (0,0), (1,0), (1,1), (0,1) in a plane. Write down a code that produce an animation of rotating
    the cube by –90 degrees about the vertex (1,0).
    이것을 하기 위해서는 어떻게 해야할지 모르겠네요ㅜㅜ

  11. 질문있습니다 2015.12.01 21:15 신고

    set함수랑 updatedX,Y 가 잘이해가 안되네요 ㅠㅠ set함수는 매스웍스에서 보면 어느정도 이해는 하겠는데 누군가에게 설명을해야할때 어떻게 말해야 하는지 모르겠어요 그리고 updatedX,Y이거는 그냥 좌표값을 지정해주는 것을 지정하는 연산자(매개체)?인가요 아니면 특별한 함수인건가요? 이것도찾아봤는데 도무지 알길이없네요ㅠㅠ
    다른 애니매이션 포스팅에도 나오는데 그냥 통일을하신건지 어떤함수인건지 잘모르겠어요

    • BlogIcon PinkWink 2015.12.02 10:40 신고

      update라고 이름 붙은 건 반복문이 진행될 때마다 애니매이션을 위한 좌표를 업데이트했다는 것을 의미하고... 그려야할 좌표값이 바뀌었으니.. set함수로 변경해 준 것입니다.^^

  12. 알려주세요..! 2016.04.15 09:36 신고

    box=fill(x,y,'r'); 이부분에서 자꾸 에러나오는데 어떤점이 잘못된걸까요 ㅠㅜ

  13. 2016.04.21 09:22

    비밀댓글입니다

    • BlogIcon PinkWink 2016.04.21 18:59 신고

      t는 삼각함수의 입력의 단위를 결정하는 것입니다.
      Rot은 회전행렬이라는 것으로 좌표계에서 대상을 원하는 만큼 회전한 좌표를 계산할 때 사용하는 것입니다.
      updateX/Y라는 코드는 애니메이션을 구현하기 위해 새로운 좌표를 갱신하기 위해 사용하는 변수입니다.
      그리고 MALTAB에서는 []'를 찍는 것의 차이는
      MATLAB Command Window에서
      a = [1 1]
      이라고 해보시고,
      a = [1 1]'
      이라고 해보시면 그 차이를 알 수 있으실 겁니다.

    • 2016.04.27 13:58

      비밀댓글입니다

    • BlogIcon PinkWink 2016.04.27 21:56 신고

      도움이 되었나요?? 뭐 아무튼 좋은 성과 있으시길 바랍니다.

  14. 2016.04.27 14:14

    비밀댓글입니다

    • BlogIcon PinkWink 2016.04.27 21:57 신고

      아하... 위와 같이는 해보지 않아서.. 어떻게 될지 모르겠네요.. 저도 해봐야할 듯 한데... 시간이 허락하지 않아서ㅠㅠ