VTKファイルをつくる25

 投稿者:しばっち  投稿日:2018年 3月10日(土)21時18分1秒
  マンデルブロートを計算し、ボリュームレンダリングによって
立体的に表示させます。3次元なので計算に時間がかかります。
また、ファイルサイズも大きくなります。
マシンパワーによって格子のサイズ及び繰り返し数(MAXITER)を調整してください。

LET XSIZE=100 !'各格子の大きさ
LET YSIZE=100
LET ZSIZE=100
OPTION BASE 0
DIM CC(3),ZZ(3)
READ XS,XE,YS,YE,ZS,ZE,MAXITER
DATA -2.2,0.5,-1.35,1.35,-1.35,1.35,50
FILE GETSAVENAME F$,"vtkファイル|*.vtk"
IF F$="" THEN STOP
IF POS(UCASE$(F$),".VTK")=0 THEN LET F$=F$&".vtk"
OPEN #1:NAME F$
ERASE #1
PRINT #1:"# vtk DataFile Version 2.0"
PRINT #1:"mandel"
PRINT #1:"ASCII"
PRINT #1:"DATASET STRUCTURED_POINTS"
PRINT #1:"DIMENSIONS";XSIZE;YSIZE;ZSIZE
PRINT #1:"ORIGIN 0 0 0"
PRINT #1:"SPACING 1 1 1"
PRINT #1:"POINT_DATA";XSIZE*YSIZE*ZSIZE
PRINT #1:"SCALARS scalar float"
PRINT #1:"LOOKUP_TABLE default"
FOR Z=0 TO ZSIZE-1
   FOR Y=0 TO YSIZE-1
      FOR X=0 TO XSIZE-1
         LET CC(0)=XS+X*(XE-XS)/XSIZE
         LET CC(1)=YS+Y*(YE-YS)/YSIZE
         LET CC(2)=ZS+Z*(ZE-ZS)/ZSIZE
         LET CC(3)=0
         MAT ZZ=ZER
         FOR I=1 TO MAXITER
            CALL QMUL(ZZ,ZZ,ZZ)      !' CALL HMUL(ZZ,ZZ,ZZ)
            CALL ADD(ZZ,ZZ,CC)
            IF ZZ(0)^2+ZZ(1)^2+ZZ(2)^2>4 THEN EXIT FOR
         NEXT I
         IF I>=MAXITER THEN LET DA=255 ELSE LET DA=0
         PRINT #1:DA
      NEXT X
   NEXT Y
NEXT Z
CLOSE #1
END

EXTERNAL SUB QMUL(S(),A(),B()) !'QUATERNION 掛け算 S=A*B
OPTION BASE 0
DIM SS(3)
LET SS(0)=A(0)*B(0)-A(1)*B(1)-A(2)*B(2)-A(3)*B(3)
LET SS(1)=A(0)*B(1)+A(1)*B(0)+A(2)*B(3)-A(3)*B(2)
LET SS(2)=A(0)*B(2)-A(1)*B(3)+A(2)*B(0)+A(3)*B(1)
LET SS(3)=A(0)*B(3)+A(1)*B(2)-A(2)*B(1)+A(3)*B(0)
MAT S=SS
END SUB

EXTERNAL  SUB HMUL(S(),A(),B()) !'HYPER COMPLEX 掛け算 S=A*B
OPTION BASE 0
DIM SS(3)
LET P1=SQR(A(0)^2+A(1)^2)
LET P2=SQR(B(0)^2+B(1)^2)
IF P1<>0 AND P2<>0 THEN
   LET AA=1-A(2)*B(2)/(P1*P2)
   LET SS(0)=AA*(A(0)*B(0)-A(1)*B(1))
   LET SS(1)=AA*(B(0)*A(1)+A(0)*B(1))
END IF
LET SS(2)=P1*B(2)+P2*A(2)
MAT S=SS
END SUB

EXTERNAL SUB ADD(S(),A(),B()) !'足し算 S=A+B
OPTION BASE 0
DIM SS(3)
MAT SS=A+B
MAT S=SS
END SUB
 

戻る