先日の質問した内容を利用して・・・ 白川和樹 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 |