新しく発言する EXIT インデックスへ
先日の質問した内容を利用して・・・

  先日の質問した内容を利用して・・・ 白川和樹 2004/03/04 18:00:38 
  続き 白川和樹 2004/03/04 18:01:13 

  先日の質問した内容を利用して・・・ 白川和樹 2004/03/04 18:00:38  ツリーへ

先日の質問した内容を利用して・・・ 返事を書く
白川和樹 2004/03/04 18:00:38
先日質問した内容を応用して立体図形を回転させるプログラムを作りました
なお、SE12(A,B,C,W)の説明は半径Wの球にはまる正12面体を(A,B,C)を中心として書くということです(他も同じ)

OPTION ANGLE DEGREES
LET WIN=3
SET WINDOW -WIN,WIN,-WIN,WIN
LET GX=0!←回転の中心(X座標)
LET GY=0!      (Y座標)
LET GZ=0!      (Z座標)
LET KYZ=1! ←YZ平面で何回回転するか
LET KXY=1! YZ平面で一周する間に何回XY平面で回転するか
LET KXZ=1! XY平面で一周する間に何回XZ平面で回転するか
FOR HXY=1 TO 360*KXZ*KYZ*kXY+1 STEP 10
LET HYZ=HXY/kXY/KXZ
LET HZX=HXY/KXZ
LET CO=HXY/(360*KYZ*kXY*KXZ)
! SET COLOR MIX(1)1-CO,1-CO,1-CO
CALL SE12(0,0,-2,CO)
CALL SE8(0,-2,0,CO)
CALL SE6(0,2,0,CO)
CALL SE4(0,0,2,CO)
CALL SE20(0,0,0,CO)
! CALL PLOTl(2,0,CO)
SET DRAW MODE EXPLICIT
SET DRAW MODE HIDDEN
CLEAR
NEXT HXY
SUB PLOTL(X,Y,Z)
CALL BASE(X,Y,Z)
PLOT LINES : M,N;
END SUB
SUB BASE(X,Y,Z)
LET X=X-GX
LET Y=Y-GY
LET Z=Z-GZ
WHEN EXCEPTION IN
LET GXY=ANGLE(X,Y)+HXY
LET XY=SQR(X^2+Y^2)
LET X=XY*COS(GXY)
LET Y=XY*SIN(GXY)
USE
END WHEN
WHEN EXCEPTION IN
LET GYZ=ANGLE(Y,Z)+HYZ
LET YZ=SQR(Y^2+Z^2)
LET Y=YZ*COS(GYZ)
LET Z=YZ*SIN(GYZ)
USE
END WHEN
WHEN EXCEPTION IN
LET GZX=ANGLE(x,Z)+HZX
LET XZ=SQR(X^2+Z^2)
LET X=XZ*COS(GZX)
LET Z=XZ*SIN(GZX)
USE
END WHEN
LET X=X+GX
LET Y=Y+GY
LET Z=Z+GZ
LET M=Y-SQR(0.5)*X/2
LET N=Z-SQR(0.5)*X/2
END SUB
SUB STOP
PLOT LINES
END SUB
! 正4面体を書く
SUB SE4(A,B,C,W)
CALL PLOTL((A),(B),C+W)
CALL PLOTL(A-W*SQR(3)/2,(B),C-W/2)
CALL PLOTL(A+SQR(3)/4*W,B+0.75*W,C-W/2)
CALL PLOTL(A-W*SQR(3)/2,(B),C-W/2)
CALL PLOTL(A+SQR(3)/4*W,B-0.75*W,C-W/2)
CALL PLOTL(A+SQR(3)/4*W,B+0.75*W,C-W/2)
CALL PLOTL((A),(B),C+W)
CALL PLOTL(A+SQR(3)/4*W,B-0.75*W,C-W/2)
CALL PLOTL(A+SQR(3)/4*W,B+0.75*W,C-W/2)
CALL PLOTL(A+SQR(3)/4*W,B-0.75*W,C-W/2)
CALL STOP
END SUB
! 正八面体を書く
SUB SE8(A,B,C,W)
CALL PLOTL(A-W,(B),(C))
CALL PLOTL((A),B+W,(C))
CALL PLOTL(A-W,(B),(C))
CALL PLOTL((A),B-W,(C))
CALL PLOTL(A-W,(B),(C))
CALL PLOTL((A),(B),C-W)
CALL PLOTL(A-W,(B),(C))
CALL PLOTL((A),(B),C+W)
CALL PLOTL(A-W,(B),(C))
CALL STOP
CALL PLOTL(A+W,(B),(C))
CALL PLOTL((A),B+W,(C))
CALL PLOTL((A),(B),C+W)
CALL PLOTL(A+W,(B),(C))
CALL PLOTL((A),B-W,(C))
CALL PLOTL((A),(B),C+W)
CALL PLOTL(A+W,(B),(C))
CALL PLOTL((A),B-W,(C))
CALL PLOTL((A),(B),C-W)
CALL PLOTL(A+W,(B),(C))
CALL PLOTL((A),B+W,(C))
CALL PLOTL((A),(B),C-W)
CALL PLOTL(A+W,(B),(C))
CALL STOP
END SUB

  続き 白川和樹 2004/03/04 18:01:13  ツリーへ

Re: 先日の質問した内容を利用して・・・ 返事を書く
白川和樹 2004/03/04 18:01:13
続き

! 正六面体を書く
SUB SE6(A,B,C,W)
CALL PLOTL(A-W/SQR(3),B-W/SQR(3),C-W/SQR(3))
CALL PLOTL(A-W/SQR(3),B-W/SQR(3),C+W/SQR(3))
CALL PLOTL(A-W/SQR(3),B-W/SQR(3),C-W/SQR(3))
CALL PLOTL(A-W/SQR(3),B+W/SQR(3),C-W/SQR(3))
CALL PLOTL(A-W/SQR(3),B-W/SQR(3),C-W/SQR(3))
CALL PLOTL(A+W/SQR(3),B-W/SQR(3),C-W/SQR(3))
CALL STOP
CALL PLOTL(A+W/SQR(3),B+W/SQR(3),C+W/SQR(3))
CALL PLOTL(A-W/SQR(3),B+W/SQR(3),C+W/SQR(3))
CALL PLOTL(A-W/SQR(3),B-W/SQR(3),C+W/SQR(3))
CALL PLOTL(A+W/SQR(3),B-W/SQR(3),C+W/SQR(3))
CALL PLOTL(A+W/SQR(3),B+W/SQR(3),C+W/SQR(3))
CALL PLOTL(A+W/SQR(3),B+W/SQR(3),C-W/SQR(3))
CALL PLOTL(A-W/SQR(3),B+W/SQR(3),C-W/SQR(3))
CALL PLOTL(A-W/SQR(3),B+W/SQR(3),C+W/SQR(3))
CALL PLOTL(A-W/SQR(3),B+W/SQR(3),C-W/SQR(3))
CALL PLOTL(A+W/SQR(3),B+W/SQR(3),C-W/SQR(3))
CALL PLOTL(A+W/SQR(3),B-W/SQR(3),C-W/SQR(3))
CALL PLOTL(A+W/SQR(3),B-W/SQR(3),C+W/SQR(3))
CALL STOP
END SUB

!正12面体を書く
SUB SE12(A,B,C,W)
SET LINE STYLE 1
LET F=W^2/SQR((((2*COS(36)*W)*(SQR((2*COS(36)*W)^2-(W/2)^2))/((SQR((2*COS(36)*W)^2-(W/2)^2))*W/(2*COS(36)*W)))/2)^2+(W/2)^2)
LET D=2*COS(36)*F
LET E=SQR(D^2-(F/2)^2)
LET H=F/(2*SIN(36))
LET I=H*D/F
FOR J=0 TO 360 STEP 72
CALL PLOTL(A-H*COS(J),B+H*SIN(J),C+SQR(W^2-H^2))
NEXT J
CALL STOP
FOR J=0 TO 360 STEP 72
CALL PLOTL(A+H*COS(J),B+H*SIN(J),C-SQR(W^2-H^2))
NEXT J
CALL STOP
FOR J=0 TO 360 STEP 36
IF MOD(J,72)=0 THEN LET Z=C-SQR(W^2-I^2) ELSE LET Z=C+SQR(W^2-I^2)
CALL PLOTL(A+I*COS(J),B+I*SIN(J),Z)
NEXT J
CALL STOP
FOR J=0 TO 360 STEP 72
CALL PLOTL(A+H*COS(J),B+H*SIN(J),C-SQR(W^2-H^2))
CALL PLOTL(A+I*COS(J),B+I*SIN(J),C-SQR(W^2-I^2))
CALL STOP
NEXT J
FOR J=0 TO 360 STEP 72
CALL PLOTL(A-H*COS(J),B+H*SIN(J),C+SQR(W^2-H^2))
CALL PLOTL(A-I*COS(J),B+I*SIN(J),C+SQR(W^2-I^2))
CALL STOP
NEXT J
END SUB

!正20面体を書く
SUB SE20(A,B,C,W)
LET G=W^2/SQR(((2*COS(36)*W)/2)^2+(W/2)^2)
LET D=2*COS(36)*G
LET E=SQR(D^2-(G/2)^2)
LET F=G*E/(G+D/2)
LET ZN=SQR(W^2-F^2)
FOR H=0 TO 360 STEP 36
IF MOD(H,72)=0 THEN LET Z=-ZN ELSE LET Z=ZN
CALL PLOTL (A+F*COS(H),B+F*SIN(H),C+Z)
NEXT H
CALL STOP
FOR H=0 TO 360 STEP 72
CALL PLOTL(A+F*COS(H),B+F*SIN(H),C-ZN)
CALL PLOTL((A),(B),C-W)
CALL PLOTL(A+F*COS(H),B+F*SIN(H),C-ZN)
NEXT H
CALL STOP
FOR H=36 TO 396 STEP 72
CALL PLOTL(A+F*COS(H),B+F*SIN(H),C+ZN)
CALL PLOTL((A),(B),C+W)
CALL PLOTL(A+F*COS(H),B+F*SIN(H),C+ZN)
NEXT H
CALL STOP
CALL PLOTL(A+F*COS(180),B+F*SIN(180),C+ZN)
CALL PLOTL(A+F*COS(252),B+F*SIN(252),C+ZN)
CALL STOP
CALL PLOTL(A+F*COS(216),B+F*SIN(216),C-ZN)
CALL PLOTL(A+F*COS(288),B+F*SIN(288),C-ZN)
CALL STOP
END SUB
END


インデックスへ EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。