|
OPTION ARITHMETIC NATIVE
PUBLIC NUMERIC K,LL,XO,YO,ZO,XX(4096),YY(4096),ZZ(4096) !'8^LEV
OPTION ANGLE DEGREES
INPUT PROMPT "LEVEL(1<=LEVEL=<4)=":LEV
LET ZTH=0 ! z軸のまわりの回転角
LET XTH=0 ! x軸のまわりの回転角初期値
LET YTH=0 ! y軸のまわりの回転角初期値
LET LL=5 !'移動量
DIM M(4,4),POINT(4),ROTX(4,4),ROTY(4,4)
DIM A(3),B(3),C(3),D(3),E(3),F(3),G(3),H(3)
MAT M=ROTATE(ZTH)
SET POINT STYLE 1
MAT READ A,B,C,D,E,F,G,H !'位置ベクトル
DATA -1,1,1
DATA -1,-1,1
DATA 1,-1,1
DATA 1,1,1
DATA -1,1,-1
DATA -1,-1,-1
DATA 1,-1,-1
DATA 1,1,-1
LET K=1
CALL RECURSIVE(LEV,A,E,F,B,C,G,H,D)
FOR I=1 TO K
LET MX=MX+XX(I)
LET MY=MY+YY(I)
LET MZ=MZ+ZZ(I)
LET XMIN=MIN(XMIN,XX(I))
LET XMAX=MAX(XMAX,XX(I))
LET YMIN=MIN(YMIN,YY(I))
LET YMAX=MAX(YMAX,YY(I))
LET ZMIN=MIN(ZMIN,ZZ(I))
LET ZMAX=MAX(ZMAX,ZZ(I))
NEXT I
LET MX=MX/K
LET MY=MY/K
LET MZ=MZ/K
LET RANGE=MAX(XMAX-XMIN,MAX(YMAX-YMIN,ZMAX-ZMIN))
LET XDT=RND-.5
LET YDT=RND-.5
LET LMIN=1E+10
LET LMAX=-1E+10
LOCATE VALUE NOWAIT(1),RANGE 0 TO 2,AT 1 : SCALE
LOCATE VALUE NOWAIT(2),RANGE -3 TO 5,AT 1 : SPEED
LOCATE VALUE NOWAIT(3),RANGE -RANGE TO RANGE,AT 0 : XMOVE
LOCATE VALUE NOWAIT(4),RANGE -RANGE TO RANGE,AT 0 : YMOVE
LOCATE VALUE NOWAIT(5),RANGE -RANGE TO RANGE,AT 0 : ZMOVE
DO
LOCATE VALUE NOWAIT(1): SCALE
LOCATE VALUE NOWAIT(2): SPEED
LOCATE VALUE NOWAIT(3): XMOVE
LOCATE VALUE NOWAIT(4): YMOVE
LOCATE VALUE NOWAIT(5): ZMOVE
MAT ROTX=IDN ! x軸のまわりの回転
LET ROTX(2,2)=COS(XTH)
LET ROTX(2,3)=SIN(XTH)
LET ROTX(3,2)=-SIN(XTH)
LET ROTX(3,3)=COS(XTH)
MAT ROTY=IDN ! y軸のまわりの回転
LET ROTY(1,1)=COS(YTH)
LET ROTY(1,3)=-SIN(YTH)
LET ROTY(3,1)=SIN(YTH)
LET ROTY(3,3)=COS(YTH)
MAT M=M * ROTX * ROTY
SET DRAW MODE HIDDEN
CLEAR
FOR I=1 TO K
CALL PLOT(XX(I),YY(I),ZZ(I))
NEXT I
PLOT LINES
IF FL=0 THEN
SET WINDOW LMIN*2,LMAX*2,LMIN*2,LMAX*2
LET WW=(LMAX-LMIN)*2
END IF
LET FL=1
SET DRAW MODE EXPLICIT
MOUSE POLL X,Y,L,R
IF R<>0 THEN STOP
LET XTH=0
LET YTH=0
IF L<>0 THEN
DO WHILE L<>0
MOUSE POLL X,Y,L,R
LOOP
LET XDT=-(Y-Y0)/WW*5
LET YDT= (X-X0)/WW*5
LET XDT=MAX(-5,MIN(5,XDT))
LET YDT=MAX(-5,MIN(5,YDT))
ELSE
LET XTH=XTH+XDT*SPEED
LET YTH=YTH+YDT*SPEED
END IF
LET X0=X
LET Y0=Y
LOOP
SUB PLOT(X,Y,Z)
LET POINT(1)=X-MX+XMOVE
LET POINT(2)=Y-MY+YMOVE
LET POINT(3)=Z-MZ+ZMOVE
MAT POINT=POINT*M
IF FL=0 THEN
LET LMIN=MIN(LMIN,POINT(1))
LET LMAX=MAX(LMAX,POINT(1))
LET LMIN=MIN(LMIN,POINT(2))
LET LMAX=MAX(LMAX,POINT(2))
ELSE
PLOT LINES:POINT(1)*SCALE,POINT(2)*SCALE;
END IF
END SUB
END
EXTERNAL SUB MOVE(A(),B())
OPTION ARITHMETIC NATIVE
LET XO=XO+LL*(B(1)-A(1))
LET YO=YO+LL*(B(2)-A(2))
LET ZO=ZO+LL*(B(3)-A(3))
LET K=K+1
LET XX(K)=XO
LET YY(K)=YO
LET ZZ(K)=ZO
END SUB
EXTERNAL SUB RECURSIVE(N,A(),E(),F(),B(),C(),G(),H(),D()) !'ヒルベルト曲線
OPTION ARITHMETIC NATIVE
IF N>0 THEN
CALL RECURSIVE(N-1,A,B,C,D,H,G,F,E)
CALL MOVE(A,E)
CALL RECURSIVE(N-1,A,D,H,E,F,G,C,B)
CALL MOVE(E,F)
CALL RECURSIVE(N-1,A,D,H,E,F,G,C,B)
CALL MOVE(F,B)
CALL RECURSIVE(N-1,F,B,A,E,H,D,C,G)
CALL MOVE(B,C)
CALL RECURSIVE(N-1,F,B,A,E,H,D,C,G)
CALL MOVE(C,G)
CALL RECURSIVE(N-1,C,B,F,G,H,E,A,D)
CALL MOVE(G,H)
CALL RECURSIVE(N-1,C,B,F,G,H,E,A,D)
CALL MOVE(H,D)
CALL RECURSIVE(N-1,H,G,F,E,A,B,C,D)
END IF
END SUB
|
|