VTKファイルをつくる26

 投稿者:しばっち  投稿日:2018年 3月10日(土)21時19分55秒
  ParaViewでは「anime000.vtk」「anime001.vtk」「anime002.vtk」のような連番ファイルを自動的にグループ化して
読み込み、アニメーションとして再生することができます。

このプログラムでは立方体を回して、『回転』アニメーションを表示させます。
上の方にある緑の三角形の「Play」のアイコンをクリックしてください。
アニメーションが再生されます。

また、fileメニューの「Save Animation」から連番静止画(jpg,png)や動画(avi,ogv)を書き出すことができます。

image magickなら連番の静止画から
convert(magick) -delay 10 -loop 0 anime*.jpg anime.gif
convert(magick) -delay 10 -loop 0 anime*.jpg anime.mng
とすればフレームレート10/100秒、無限回ループのアニメーションgifやmngファイルを生成できます。

※なお、大量書き込みにつきましてはご容赦下さい。

OPTION ANGLE DEGREES
DIM M(4,4),POINT(4),ROTXY(4,4),ROTXZ(4,4),ROTYU(4,4),ROTYZ(4,4),ROTXU(4,4),ROTZU(4,4)
LET L=100
LET X=0
LET Y=0
LET Z=0
LET U=0
LET ST=5 !'回転角
FILE GETSAVENAME F$,"vtkファイル|*.vtk" !'BASE名のみ(拡張子なし)
IF F$="" THEN STOP
FOR J=1 TO 360/ST
   LET FF$=F$&RIGHT$("000"&STR$(J),3)
   IF POS(UCASE$(FF$),".VTK")=0 THEN LET FF$=FF$&".vtk"
   OPEN #1:NAME FF$
   ERASE #1
   LET YU=YU+ST
   LET XZ=XZ+ST
   MAT ROTXY=IDN !'XY平面上の回転
   LET ROTXY(1,1)=COS(XY)
   LET ROTXY(1,2)=SIN(XY)
   LET ROTXY(2,1)=-SIN(XY)
   LET ROTXY(2,2)=COS(XY)
   MAT ROTXZ=IDN !'XZ平面上の回転
   LET ROTXZ(1,1)=COS(XZ)
   LET ROTXZ(1,3)=-SIN(XZ)
   LET ROTXZ(3,1)=SIN(XZ)
   LET ROTXZ(3,3)=COS(XZ)
   MAT ROTYU=IDN !'YU平面上の回転
   LET ROTYU(2,2)=COS(YU)
   LET ROTYU(2,4)=-SIN(YU)
   LET ROTYU(4,2)=SIN(YU)
   LET ROTYU(4,4)=COS(YU)
   MAT ROTYZ=IDN !'YZ平面上の回転
   LET ROTYZ(2,2)=COS(YZ)
   LET ROTYZ(2,3)=SIN(YZ)
   LET ROTYZ(3,2)=-SIN(YZ)
   LET ROTYZ(3,3)=COS(YZ)
   MAT ROTXU=IDN !'XU平面上の回転
   LET ROTXU(1,1)=COS(XU)
   LET ROTXU(1,4)=SIN(XU)
   LET ROTXU(4,1)=-SIN(XU)
   LET ROTXU(4,4)=COS(XU)
   MAT ROTZU=IDN !'ZU平面上の回転
   LET ROTZU(3,3)=COS(ZU)
   LET ROTZU(3,4)=-SIN(ZU)
   LET ROTZU(4,3)=SIN(ZU)
   LET ROTZU(4,4)=COS(ZU)
   MAT M=ROTXY*ROTXZ*ROTYU*ROTYZ*ROTXU*ROTZU !'4次元回転
   PRINT #1:"# vtk DataFile Version 2.0"
   PRINT #1:"cube"
   PRINT #1:"ASCII"
   PRINT #1:"DATASET UNSTRUCTURED_GRID"
   PRINT #1:"POINTS 8 float"
   LET FLG=0
   CALL PLOT(X-L/2,Y-L/2,Z-L/2,U) !'座標
   CALL PLOT(X+L/2,Y-L/2,Z-L/2,U)
   CALL PLOT(X+L/2,Y+L/2,Z-L/2,U)
   CALL PLOT(X-L/2,Y+L/2,Z-L/2,U)
   CALL PLOT(X-L/2,Y-L/2,Z+L/2,U)
   CALL PLOT(X+L/2,Y-L/2,Z+L/2,U)
   CALL PLOT(X+L/2,Y+L/2,Z+L/2,U)
   CALL PLOT(X-L/2,Y+L/2,Z+L/2,U)
   PRINT #1:"CELLS 1 9"
   PRINT #1:"8 0 1 2 3 4 5 6 7" !'meshデータ
   PRINT #1:"CELL_TYPES 1"
   PRINT #1:12     !'立方体を表す
   PRINT #1:"POINT_DATA 8"
   PRINT #1:"SCALARS height float"
   PRINT #1:"LOOKUP_TABLE default"
   LET FLG=1
   CALL PLOT(X-L/2,Y-L/2,Z-L/2,U) !'スカラー値
   CALL PLOT(X+L/2,Y-L/2,Z-L/2,U)
   CALL PLOT(X+L/2,Y+L/2,Z-L/2,U)
   CALL PLOT(X-L/2,Y+L/2,Z-L/2,U)
   CALL PLOT(X-L/2,Y-L/2,Z+L/2,U)
   CALL PLOT(X+L/2,Y-L/2,Z+L/2,U)
   CALL PLOT(X+L/2,Y+L/2,Z+L/2,U)
   CALL PLOT(X-L/2,Y+L/2,Z+L/2,U)
   CLOSE #1
NEXT J

SUB PLOT(X,Y,Z,U)
   LET LU=100
   LET POINT(1)=X
   LET POINT(2)=Y
   LET POINT(3)=Z
   LET POINT(4)=U
   MAT POINT=POINT*M
   FOR I=1 TO 4
      LET POINT(I)=POINT(I)/(LU-POINT(4))
   NEXT I
   IF FLG=0 THEN
      PRINT #1:POINT(1);POINT(2);POINT(3) !'座標
   ELSE
      PRINT #1:POINT(2) !'スカラー値
   END IF
END SUB
END
 

戻る