■n角の穴をあけるドリル(その8)

 ルーローの三角形の代わりに,正2n−1角形を少し膨らませた同種の形では幅(曲線に接する2本の平行な直線の間の距離)はどの方向で測っても一定で,必ず同じ距離だけ離れています.すなわち,平行な接線をどこにおこうと2本の接線間の距離は同じであり,このような性質をもつ曲線を「定幅図形」と呼びます.

 ルーローの三角形の代わりに正2n−1角形を少し膨らませた同種の形(ルーローの多角形)は定幅図形なので,偶数角形の穴をあけることができました.一方,奇数角形の穴の場合,正三角形の穴ではそれに内接しながら回転することできる円以外の図形(藤原・掛谷の2角形)が存在するのですが,正2n+1角形の場合,そのような図形は知られていません.

 n=3の場合の藤原・掛谷の2角形から類推から,そのような図形の候補として,

(1)奇数角形の頂点を円弧の中心,頂点から底辺に下ろした垂線を半径とする円弧を描き,奇数角形の辺との交点同士を結んだ線分を1辺とする少し膨らませた偶数角形のドリル

(2)奇数n角形の頂点から底辺に下ろした垂線を対角線とする偶数(n−1)角形に中心角が2π/n(n−1)の円弧で少し丸みをつけたドリル

が考えられました.

 しかし,いずれの場合でもn=5,7,9,・・・にそのまま適用することができなかったため,これまで奇数角形の穴をあけるドリルに対しては,内接する偶数角形の辺の長さと円弧の厚さ(円弧の中心の位置)を個別に目測で調整してきました.このことは私にとって不満の残る決着であり,完全な問題解決には至っていないと思われました.結論はもっと単純でかつ美しくあらねばならないのです.

===================================

【1】プログラム再考

 そもそもこのような結論に達したのは,円弧の中心を偶数角形の辺の中点において各頂点の軌跡を描いてみたときに解が得られなくなってしまう場合があったからである.そこでプログラムを再考してみたところ,円弧の中心が偶数角形の外部にある場合にはうまく対応していたが,辺の中点に一致する場合は軌跡の計算が不正確になることがわかった.円弧の中心が辺上あるいは偶数角形の内部にある場合は想定していなかったのである.

 偶数角形の穴をあけるドリルは「定幅図形」なので円弧の中心は頂点にあった.これと符合するためには,偶数角形の穴をあけるドリルでは,円弧の中心が偶数角形の辺の中点に一致しなければならないはずである.・・・そして思った通り,円弧の中心は

(1)偶数角形の穴をあけるドリルでは奇数角形の頂点

(2)奇数角形の穴をあけるドリルでは偶数角形の辺の中点

に存在することがわかった.

 結局,n=3の場合だけが特別であって,それに振り回されて無駄な考察をしてきたことになる.

===================================

【2】出力例

[1]五角の穴をあけるドリル

[2]七角の穴をあけるドリル

[3]九角の穴をあけるドリル

===================================

【3】プログラム

 ここで使用したプログラムを掲げます.動画では

1170 GOSUB *FRAME:GOSUB *TRACE

1180 'GOSUB *MOVIE

1170 'GOSUB *FRAME:GOSUB *TRACE

1180 GOSUB *MOVIE

とします.

1000 '

1010 ' **** n-gonal drill ****

1020 ' 2005/12/10 (C) サトウ イクロウ

1030 SCREEN 3,0:CONSOLE ,,0,1

1040 CLS 3:WIDTH 80,25:COLOR 6

1050 PI=3.14159

1060 '

1070 PRINT "n-gonal hole"

1080 PRINT:PRINT "input n ( end=0 ).....";:INPUT N

1090 IF N<3 THEN 1240

1100 IF (N MOD 2)=0 THEN GOSUB *EVEN : GOTO 1120

1110 IF N=3 THEN GOSUB *ODD ELSE GOSUB *ODD2

1120 '

1130 CLS 3

1140 WW=HH/2+1

1150 WINDOW(-WW*1.1,-WW*2.1)-(WW*1.1,WW*.1)

1160 VIEW(120,0)-(519,399)

1170 GOSUB *FRAME:GOSUB *TRACE

1180 'GOSUB *MOVIE

1190 WINDOW(0,0)-(639,399)

1200 VIEW(0,0)-(639,399)

1210 '

1230 GOSUB *TEMP

1240 SCREEN 3,0:CLS 3

1250 END

1260 '

1270 ' ***initialize ***

1280 '

1290 *EVEN:

1300 HH=10

1310 R1=HH/2/COS(PI/N)

1320 L1=R1*2*SIN(PI/N)

1330 YC=HH/2

1340 AA=HH

1350 R2=AA/2/COS(PI/2/(N-1))

1360 L2=R2*2*SIN(PI/(N-1))

1370 BB=R2

1380 CC=R2

1390 YB=AA-BB

1400 T0=PI/(N-1)

1410 TT=PI*((N-2)/N-(N-3)/(N-1))

1420 TS=0:TE=TT/2

1430 RETURN

1440 '

1450 *ODD:

1460 HH=10

1470 R1=HH/(COS(PI/N)+1)

1480 L1=R1*2*SIN(PI/N)

1490 YC=R1*COS(PI/N)

1500 R2=HH/2

1510 L2=R2*2*SIN(PI/(N-1))

1520 AA=L2/2/SIN(PI/N/(N-1))

1530 BB=AA*COS(PI/N/(N-1))-R2*COS(PI/(N-1))

1540 CC=R2:IF N=3 THEN CC=AA/2

1550 YB=AA-BB

1560 T0=PI*2/N/(N-1)

1570 TT=PI*((N-2)/N-(N-3)/(N-1))

1580 TS=0:TE=TT/2

1590 '

1600 D2=(L2/2)^2+(AA*COS(T0/2)-R2*2*COS(PI/(N-1)))^2

1610 DD=SQR(D2)

1620 T1=ATN(L2/2/(AA*COS(T0/2)-R2*2*COS(PI/(N-1))))

1630 RETURN

1640 '

1650 *ODD2:

1660 HH=10

1670 R1=HH/(COS(PI/N)+1)

1680 L1=R1*2*SIN(PI/N)

1690 YC=R1*COS(PI/N)

1700 '

1710 L2=HH/(SQR(1/4+1/TAN(PI/(N-1))/TAN(PI/(N-1)))+1/2*TAN(PI/N))

1720 R2=L2/2/SIN(PI/(N-1))

1730 T0=2*ATN(1/2*TAN(PI/(N-1)))

1740 AA=L2/2/SIN(T0/2)

1750 '

1760 BB=AA*COS(T0/2)-R2*COS(PI/(N-1))

1770 CC=R2

1780 YB=AA-BB

1790 TT=PI*((N-2)/N-(N-3)/(N-1))

1800 TS=0:TE=TT/2

1810 '

1820 DD=L2/2

1830 T1=PI/2

1840 RETURN

1850 '

1860 ' *** frame ***

1870 '

1880 *FRAME:

1890 GOSUB *FRAME.SUB

1900 GOSUB *STILL

1910 'GOSUB *ROT.CENTER

1920 RETURN

1930 '

1940 *FRAME.SUB:

1950 XS=-L1/2:YS=-YC

1960 XE= L1/2:YE=-YC

1970 FOR I=0 TO N-1

1980 C1=COS(PI*2/N*I):S1=SIN(PI*2/N*I)

1990 X1= XS*C1-YS*S1

2000 Y1= XS*S1+YS*C1+YC

2010 X2= XE*C1-YE*S1

2020 Y2= XE*S1+YE*C1+YC

2030 LINE(X1,-Y1)-(X2,-Y2),5

2040 NEXT I

2050 RETURN

2060 '

2070 *STILL:

2080 FOR I=0 TO N-2

2090 C1=COS(PI*2/(N-1)*I):S1=SIN(PI*2/(N-1)*I)

2100 '

2110 FOR T=-T0/2 TO T0/2 STEP PI/180

2120 C2=COS(T):S2=SIN(T)

2130 XW=0:YW=-AA

2140 X1= XW*C2-YW*S2

2150 Y1= XW*S2+YW*C2+AA

2160 '

2170 XW=X1:YW=Y1-YB

2180 X2= XW*C1-YW*S1

2190 Y2= XW*S1+YW*C1+YB

2200 PSET(X2,-Y2),7

2210 NEXT T

2220 '

2230 NEXT I

2240 RETURN

2250 '

2260 *ROT.CENTER:

2270 FOR I=0 TO N-2

2280 C1=COS(PI*2/(N-1)*I):S1=SIN(PI*2/(N-1)*I)

2290 XW=0 :YW=AA-YB

2300 X2= XW*C1-YW*S1

2310 Y2= XW*S1+YW*C1+YB

2320 PSET(X2,-Y2),7

2330 NEXT I

2340 RETURN

2350 '

2360 ' *** movie ***

2370 '

2380 *MOVIE:

2390 GOSUB *FRAME.SUB

2400 GOSUB *MOVIE.SUB

2410 RETURN

2420 '

2430 *MOVIE.SUB:

2440 FOR I=0 TO N-1

2450 C1=COS(PI*2/N*I):S1=SIN(PI*2/N*I)

2460 '

2470 FOR T=-TE TO TE STEP PI/180

2480 TZ=ABS(T)

2490 IF (N MOD 2)=0 THEN GOSUB *Z0 ELSE GOSUB *Z1

2500 IF T<0 THEN XW=-XW

2510 X=XW:Y=YW+YC

2520 X0=X:Y0=Y:GOSUB *F2T

2530 NEXT T

2540 '

2550 NEXT I

2560 RETURN

2570 '

2580 *F2T:

2590 FOR J=0 TO N-2

2600 C3=COS(PI*2/(N-1)*J-T):S3=SIN(PI*2/(N-1)*J-T)

2610 '

2620 FOR TH=-T0/2 TO T0/2 STEP PI/180

2630 C2=COS(TH):S2=SIN(TH)

2640 XW=0:YW=-AA

2650 X1= XW*C2-YW*S2

2660 Y1= XW*S2+YW*C2+AA

2670 '

2680 XW=X1:YW=Y1-YB

2690 X2= XW*C3-YW*S3+X0

2700 Y2= XW*S3+YW*C3+Y0

2710 '

2720 XW=X2:YW=Y2-YC

2730 X3= XW*C1-YW*S1

2740 Y3= XW*S1+YW*C1+YC

2750 PSET(X3,-Y3),7

2760 NEXT TH

2770 '

2780 NEXT J

2790 RETURN

2800 '

2810 ' *** trace ***

2820 '

2830 *TRACE:

2840 GOSUB *TRACE.CENTER

2850 GOSUB *TRACE.VERTEX

2860 'GOSUB *CENTER.CIRCLE

2870 RETURN

2880 '

2890 *TRACE.CENTER:

2900 FOR I=0 TO N-1

2910 C1=COS(PI*2/N*I):S1=SIN(PI*2/N*I)

2920 '

2930 FOR T=-TE TO TE STEP PI/180

2940 TZ=ABS(T)

2950 IF (N MOD 2)=0 THEN GOSUB *Z0 ELSE GOSUB *Z1

2960 IF T<0 THEN XW=-XW

2970 X= XW*C1-YW*S1

2980 Y= XW*S1+YW*C1+YC

2990 PSET(X,-Y),4

3000 NEXT T

3010 '

3020 NEXT I

3030 RETURN

3040 '

3050 *TRACE.VERTEX:

3060 FOR J=0 TO N-2

3070 FOR I=0 TO N-1

3080 C1=COS(PI*2/N*I):S1=SIN(PI*2/N*I)

3090 '

3100 FOR T=-TE TO TE STEP PI/180

3110 TZ=ABS(T)

3120 IF (N MOD 2)=0 THEN GOSUB *Z0 ELSE GOSUB *Z1

3130 X1=XW+CC*SIN(PI/(N-1)-TZ+PI*2/(N-1)*J)

3140 Y1=YW-CC*COS(PI/(N-1)-TZ+PI*2/(N-1)*J)

3150 IF T<0 THEN X1=-X1

3160 '

3170 X= X1*C1-Y1*S1

3180 Y= X1*S1+Y1*C1+YC

3190 PSET(X,-Y),4

3200 NEXT T

3210 '

3220 NEXT I

3230 NEXT J

3240 RETURN

3250 '

3260 *CENTER.CIRCLE:

3270 XW=0:YW=(AA-BB)-YC

3280 FOR T=0 TO PI*2 STEP PI/180*10

3290 C1=COS(T):S1=SIN(T)

3300 X1= XW*C1-YW*S1

3310 Y1= XW*S1+YW*C1+YC

3320 PSET(X1,-Y1),7

3330 NEXT T

3340 RETURN

3350 '

3360 *Z0:

3370 'XW=AA*T-BB*SIN(TZ)

3380 XW=L2*COS(T0-TZ)-L1/2-L2*SIN(T0-TZ)/TAN(PI*2/N)-BB*SIN(TZ)

3390 YW=AA-BB*COS(TZ)-YC

3400 RETURN

3410 '

3420 *Z1:

3430 'XW=AA*T-BB*SIN(TZ)

3440 XW=DD*SIN(T1+TZ)-(DD*COS(T1+TZ)-AA+HH)/TAN(PI/N)-BB*SIN(TZ)

3450 YW=AA-BB*COS(TZ)-YC

3460 RETURN

3470 '

3480 *TEMP:

3490 LOCATE 0,0 :PRINT "何かキーを押してください";:WHILE INKEY$="":WEND

3500 RETURN

===================================