(その2)で奇数角形の穴をあけるドリルの問題に取り組んで以来,(その3)(その4)と失敗を繰り返してきたのですが,そうこうしているうちに問題を解決するためにはどこに着目すべきかがわかってきました.今回のコラムでは「奇数角形の穴をあけるドリル・解決編」をお届けしたいと思います.
===================================
【1】着眼点の見直し
(その2)では,奇数角形に内接する少し膨らませた偶数角形のドリルを,奇数n角形の頂点から底辺に下ろした垂線を対角線とする偶数(n−1)角形に中心角が2π/n(n−1)の円弧で少し丸みをつけたものにしてみました.このようにしたのはn=3の場合の類推からです.
しかし,このドリルは正n角形の頂角2π/nにピッタリとはまり込むものの,辺が長すぎて奇数角形からはみ出してしまいました.また辺が長すぎると相対的に弧が薄くなります.
それでは辺の長さと弧の厚さをどうやって決めればよいのかが問題となっていたわけですが,失敗を繰り返すうちに,ドリルの運動に要請される本質的な物理的条件が見えてきました.
それは
(1)奇数角形の底辺に接する弧
(2)奇数角形の頂角に連接する辺に接する偶数角形の頂点
の2点だけが極めて重要な接点であるということです.これに着目すればあとはこの2点から奇数角形に内接するための幾何学的条件を求めればよいだけです.計算式は省きますが,内接条件は(1)(2)から簡単に求められます.
===================================
【2】奇数角形の穴をあけるドリル
その後は(数学的条件からではなく)試行錯誤で最もよい条件を求めることになります.めのこ(目測)で良し悪しを決めたのですが,
(1)奇数角形の1辺の長さを1としたときの偶数角形の1辺
(2)偶数角形の1辺の長さを1としたときの弧の半径
(3)弧の中心角
はそれぞれ
n (1) (2) (3)
5 1.0404 1.13716 52.1686
7 1.07215 1.81125 32.0495
9 1.07125 2.48403 23.2243
となりました.
辺の長さは,奇数n角形の頂点から底辺に下ろした垂線を対角線とした場合の
5 1.08813
7 1.09532
9 1.08515
より短くなり,さらに(その3)に掲げた正n角形内にはいる最大の正(n−1)角形の1辺の長さ
5 1.0674
7 1.08378
9 1.0794
をも下回りました.
辺の長さが短くなった分,中心角は2π/n(n−1)よりかなり大きくなりました.中心角の値は(その1)に掲げた偶数角形に穴をあけるドリルの場合の中心角π/(n−1)よりも大きな値が得られていることに注意します.この点についてはあとでもう一度考察することにします.
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
ドリルの中心の軌跡と各頂点の軌跡を重ねて表示します(ここでは円弧の運動は考慮していない).偶数角形の穴をあけるドリル同様,外接n角形の頂点近くを除いてほとんどn角形に一致します.また(その2)に比べて中心の軌跡は円に近くなり,これであればスムーズな回転が期待できます.どなたか実際に作ってくれないものでしょうか.
[1]五角の穴をあけるドリル
[2]七角の穴をあけるドリル
[3]九角の穴をあけるドリル
===================================
【3】円弧の中心
前節に掲げた中心角はπ/(n−1)よりも大きくなりました.偶数角形の外接円上に円弧の中心があるとき中心角はπ/(n−1)になるわけですから,円弧の中心は外接円の内部にあることになります.
そこで,円弧の中心が偶数角形の辺の中点に一致するのではないかという疑問が湧きました.偶数角形の穴をあけるドリルでは「定幅図形」なので円弧の中心は頂点にありましたから,そのことからの類推です.
もし辺の中点のあるのであれば中心角は
2arctan(1/2tan(π/(n−1))
と計算されますし,偶数角形の1辺の長さを1としたときの弧の半径は
{1/4+cot^2(π/(n−1))}^1/2+1/2tan(π/n)
になります.
その場合,
n (1) (2) (3)
5 1.03884 1.11804 53.1301
7 1.07197 1.80278 32.2042
9 1.07109 2.46545 23.4018
となり,めのこで測った前節の計算結果とのズレは非常に小さいことがわかります.
このことから円弧の中心はほぼ辺の中点上にあるといってもよいのですが,逆にそうでなければならないという数学的な理由が見あたりません.実際にこの内接条件でドリルの中心の軌跡と各頂点の軌跡を描いてみたのですが,解が得られなくなってしまう場合がありました.奇数角形の穴をあけるドリルは個別(n=5,7,9,・・・)に対応する必要があるのかもしれません.
===================================
【4】プログラム
ここでは奇数角形の穴をあけるドリル(n=5,7,9)に個別に対応するプログラムを掲げることにします.
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 1260
1100 IF (N MOD 2)=0 THEN GOSUB *EVEN :'ELSE GOSUB *ODD
1110 IF N=3 THEN GOSUB *ODD ELSE GOSUB *ODD2
1120 '
1130 CLS 3
1140 WW=HH/2+1
1150 'WINDOW(-WW,-WW)-(WW,WW)
1160 'WINDOW(-WW,-WW*2)-(WW,0)
1170 WINDOW(-WW*1.1,-WW*2.1)-(WW*1.1,WW*.1)
1180 VIEW(120,0)-(519,399)
1190 GOSUB *FRAME
1200 GOSUB *TRACE
1210 WINDOW(0,0)-(639,399)
1220 VIEW(0,0)-(639,399)
1230 '
1250 GOSUB *TEMP
1260 SCREEN 3,0:CLS 3
1270 END
1280 '
1290 ' ***initialize ***
1300 '
1310 *EVEN:
1320 HH=10
1330 R1=HH/2/COS(PI/N)
1340 L1=R1*2*SIN(PI/N)
1350 YC=HH/2
1360 AA=HH
1370 R2=AA/2/COS(PI/2/(N-1))
1380 L2=R2*2*SIN(PI/(N-1))
1390 BB=R2
1400 CC=R2
1410 YB=AA-BB
1420 T0=PI/(N-1)
1430 TT=PI*((N-2)/N-(N-3)/(N-1))
1440 TS=0:TE=TT/2
1450 RETURN
1460 '
1470 *ODD:
1480 HH=10
1490 R1=HH/(COS(PI/N)+1)
1500 L1=R1*2*SIN(PI/N)
1510 YC=R1*COS(PI/N)
1520 R2=HH/2
1530 L2=R2*2*SIN(PI/(N-1))
1540 '
1550 MX=L2/2
1560 MY=MX*TAN(PI/N)
1570 MZ=SQR(MX*MX+MY*MY)/L1
1580 '
1590 AA=L2/2/SIN(PI/N/(N-1))
1600 BB=AA*COS(PI/N/(N-1))-R2*COS(PI/(N-1))
1610 CC=R2:IF N=3 THEN CC=AA/2
1620 YB=AA-BB
1630 T0=PI*2/N/(N-1)
1640 TT=PI*((N-2)/N-(N-3)/(N-1))
1650 TS=0:TE=TT/2
1660 '
1670 D2=(L2/2)^2+(AA*COS(T0/2)-R2*2*COS(PI/(N-1)))^2
1680 DD=SQR(D2)
1690 T1=ATN(L2/2/(AA*COS(T0/2)-R2*2*COS(PI/(N-1))))
1700 RETURN
1710 '
1720 *ODD2:
1730 HH=10
1740 R1=HH/(COS(PI/N)+1)
1750 L1=R1*2*SIN(PI/N)
1760 YC=R1*COS(PI/N)
1770 '
1780 IF N=5 THEN MZ=.643
1790 IF N=7 THEN MZ=.595
1800 IF N=9 THEN MZ=.57
1810 MX=MZ*L1/SQR(1+TAN(PI/N)*TAN(PI/N))
1820 MY=MX*TAN(PI/N)
1830 L2=MX*2
1840 R2=L2/2/SIN(PI/(N-1))
1850 AR=HH-MY-R2*2*COS(PI/(N-1))
1860 T0=4*ATN(AR*2/L2)
1870 AA=L2/2/SIN(T0/2):'PRINT L2/L1,AA/L2,T0*180/PI:END
1880 '
1890 BB=AA*COS(T0/2)-R2*COS(PI/(N-1))
1900 CC=R2
1910 YB=AA-BB
1920 TT=PI*((N-2)/N-(N-3)/(N-1))
1930 TS=0:TE=TT/2
1940 '
1950 D2=(L2/2)^2+(AA*COS(T0/2)-R2*2*COS(PI/(N-1)))^2
1960 DD=SQR(D2)
1970 T1=ATN(L2/2/(AA*COS(T0/2)-R2*2*COS(PI/(N-1))))
1980 RETURN
1990 '
2000 ' *** frame ***
2010 '
2020 *FRAME:
2030 XS=-L1/2:YS=-YC
2040 XE= L1/2:YE=-YC
2050 FOR I=0 TO N-1
2060 C1=COS(PI*2/N*I):S1=SIN(PI*2/N*I)
2070 X1= XS*C1-YS*S1
2080 Y1= XS*S1+YS*C1+YC
2090 X2= XE*C1-YE*S1
2100 Y2= XE*S1+YE*C1+YC
2110 LINE(X1,-Y1)-(X2,-Y2),5
2120 NEXT I
2130 '
2140 FOR I=0 TO N-2
2150 C1=COS(PI*2/(N-1)*I):S1=SIN(PI*2/(N-1)*I)
2160 '
2170 FOR T=-T0/2 TO T0/2 STEP PI/180
2180 C2=COS(T):S2=SIN(T)
2190 XW=0:YW=-AA
2200 X1= XW*C2-YW*S2
2210 Y1= XW*S2+YW*C2+AA
2220 '
2230 XW=X1:YW=Y1-YB
2240 X2= XW*C1-YW*S1
2250 Y2= XW*S1+YW*C1+YB
2260 PSET(X2,-Y2),7
2270 NEXT T
2280 '
2290 NEXT I
2300 RETURN
2310 '
2320 ' *** trace ***
2330 '
2340 *TRACE:
2350 FOR I=0 TO N-1
2360 C1=COS(PI*2/N*I):S1=SIN(PI*2/N*I)
2370 '
2380 FOR T=TS TO TE STEP PI/180
2390 IF (N MOD 2)=0 THEN GOSUB *Z0 ELSE GOSUB *Z1
2400 X= XW*C1-YW*S1
2410 Y= XW*S1+YW*C1+YC
2420 PSET(X,-Y),4
2430 '
2440 XW=-XW
2450 X= XW*C1-YW*S1
2460 Y= XW*S1+YW*C1+YC
2470 PSET(X,-Y),4
2480 NEXT T
2490 '
2500 NEXT I
2510 '
2730 FOR I=0 TO N-1
2740 C1=COS(PI*2/N*I):S1=SIN(PI*2/N*I)
2750 '
2760 FOR J=0 TO N-2
2770 FOR T=TS TO TE STEP PI/180
2780 IF (N MOD 2)=0 THEN GOSUB *Z0 ELSE GOSUB *Z1
2790 X1=XW+CC*SIN(PI/(N-1)-T+PI*2/(N-1)*J)
2800 Y1=YW-CC*COS(PI/(N-1)-T+PI*2/(N-1)*J)
2810 '
2820 X= X1*C1-Y1*S1
2830 Y= X1*S1+Y1*C1+YC
2840 PSET(X,-Y),4
2850 '
2860 X1=-X1
2870 X= X1*C1-Y1*S1
2880 Y= X1*S1+Y1*C1+YC
2890 PSET(X,-Y),4
2900 NEXT T
2910 NEXT J
2920 '
2930 NEXT I
2940 '
3030 RETURN
3040 '
3050 *Z0:
3060 'XW=AA*T-BB*SIN(T)
3070 XW=L2*COS(T0-T)-L1/2-L2*SIN(T0-T)/TAN(PI*2/N)-BB*SIN(T)
3080 YW=AA-BB*COS(T)-YC
3090 RETURN
3100 '
3110 *Z1:
3120 'XW=AA*T-BB*SIN(T)
3130 XW=DD*SIN(T1+T)-(DD*COS(T1+T)-AA+HH)/TAN(PI/N)-BB*SIN(T)
3140 YW=AA-BB*COS(T)-YC
3150 RETURN
3160 '
3170 *TEMP:
3180 LOCATE 0,0 :PRINT "何かキーを押してください";:WHILE INKEY$="":WEND
3190 RETURN
===================================