|
!N角形の Simson Line(シムソン線) Ver7.5.4 以降で動きます。
!定理(シムソン)円に内接する三角形 ABC 、同円周上に点P。
! _BC _CA _AB 各辺の線(3本)へ
!点Pから引いた垂線の交点(3個)は、同一直線上にある。
!この直線を、点Pの三角形 ABC に対するシムソン線。
!定理(四角形) 円に内接する四角形 ABCD 、同円周上に点P。
!点Pの △BCD △ACD △ABD △ABC に対するシムソン線(4本)へ
!点Pから引いた垂線の交点(4個)は、同一直線上にある。
!この直線を、点Pの四角形 ABCD に対するシムソン線。
!定理(五角形) 円に内接する五角形 ABCDE 、同円周上に点P。
!点Pの □BCDE □ACDE □ABDE □ABCE □ABCD に対するシムソン線(5本)へ
!点Pから引いた垂線の交点(5個)は、同一直線上にある。
!この直線を、点Pの五角形 ABCDE に対するシムソン線。
!----------------------------------------------------------
! (N角形) 円に内接するN角形 、同円周上に点P。
!点Pの (N-1)角形 *N個 に対するシムソン線(N本)へ
!点Pから引いた垂線の交点(N個)は、同一直線上にある??
!この直線を、点PのN角形 に対するシムソン線 ??
!----------------------------------------------------------
! k 角形での Simson Line の本数Sk
! k=3 k=4 k=5 k=6 k=7 ... k=n
! S3=1 S4=4*S3+1=5 S5=5*S4+1=26 S6=6*S5+1=157 S7=7*S6+1=1100 ... Sn= n*Sn-1 +1
!N角について、実際のグラフを描く。が、8角形位から、画面がパンクぎみで、
!N=11 で止めてある。(必要なら、注釈マーク ※N ※N-1 の個所で変える)
!------------------------
OPTION ARITHMETIC COMPLEX
SET BEAM MODE "IMMORTAL"
LET N=11 !※N
DIM p(N), px(N)
!
PRINT "シムソン線の直線性検査"
PRINT "線上の交点(1,2,3,4,…)間ベクトルの、"
PRINT "絶対値積/内積。"
PRINT "|3-2||2-1|/(3-2・2-1) |4-3||3-2|/(4-3・3-2) …"
SET TEXT COLOR "red"
RANDOMIZE
FOR K0=3 TO N
! ---make sample
LET P0=EXP(COMPLEX(0, RND*2*PI) ) !P点 サンプル作成 P0
FOR i=1 TO K0 !K0角形サンプル作成 p()
IF i=1 THEN
LET b0=.3/K0
LET b=0
ELSE
LET w=(1-b)/(K0-i+2)
DO
LET a=RND
LOOP UNTIL .7*w< a AND a< 1.4*w
LET b=b+a
END IF
LET p(i)=EXP(COMPLEX(0, (b0+b)*2*PI+arg(P0)) )
NEXT i
!---start with whole view
CALL s_main(0, 1.5) !(画面中心, 半幅)
!---checking simson px() on the straight
PRINT K0;"角形: ";
FOR i=3 TO K0
PRINT ABS(px(i)-px(i-1))*ABS(px(i-1)-px(i-2))/DOTc( px(i)-px(i-1), px(i-1)-px(i-2) );
NEXT i
PRINT
!---repeat with zoom up
IF 4< K0 THEN
LET w$=CONFIRM$("次は、同"& STR$(K0)& "角形のズームアップ")
IF w$="NO" THEN STOP
CALL s_main((px(1)+px(K0))/2, ABS(px(K0)-px(1))) !(画面中心, 半幅)
END IF
!---how to start next K0+1?
IF K0< N THEN
LET w$=CONFIRM$("次は、"& STR$(K0+1)& "角形")
IF w$="NO" THEN STOP
END IF
NEXT K0
SUB s_main(c,hw)
SET WINDOW re(c)-hw, re(c)+hw ,im(c)-hw ,im(c)+hw !zooming
CLEAR
SET LINE COLOR "black"
DRAW circle !円周 、描画
CALL GRAPH_p(K0, p) !K0角形 、描画
CALL simson(K0, p,px) !シムソン線、描画
!---
SET POINT COLOR "red"
SET POINT STYLE 6
PLOT POINTS: P0 !P0点 、描画
PLOT label ,AT P0:"P"
END SUB
SUB simson(K, p(),px()) !( 角数 K, K角形 p(), →シムソン線 px() )
local i, s(10),sx(10) !※N-1 !s(K-1),sx(K-1)の使用量だが、副プログラムでの変数は×。手書き!
!---
FOR i=1 TO K !K角形 p()の下の、(K-1)角形 s()を、K通り作成
! ---
FOR j=1 TO i-1 !i番目頂点の抜けた(K-1)角形 s()を、1個作成。
LET s(j)=p(j)
NEXT j
FOR j=i+1 TO K
LET s(j-1)=p(j)
NEXT j
!---
IF K=3 THEN !※K角形 p()が3角の時、i番目の2角形 s()の扱い。(形態は線分)
LET sx(1)=s(1) ! それに対する P0点からの垂線は2本とも s()自身に交わるため、
LET sx(2)=s(2) ! 2角形 s()に対するシムソン線 sx()は、自身 s()に重なるとする。
ELSE ! 2角形を考える事で、3角も、N角の連続として扱える。
CALL simson(K-1, s,sx) !i番目の(K-1)角形 s()に対するシムソン線 sx()を自己呼出しで採取。
CALL GRAPH_p(K-1, s) !i番目の(K-1)角形 s() の描画。
END IF
!--- !(K-1)角形 s()に対するシムソン線 sx()は、その下の、
! ! 角形 s()に対するシムソン線への(K-1)個の垂線交点の配列。
LET px(i)=pxab(P0, sx(1),sx(K-1)) !px(i)= P0点から sx(1)~sx(K-1)線 に引く1個の垂線交点。
PLOT LINES: P0;px(i) ! P0点から sx(1)~sx(K-1)線 に引く1個の垂線 の描画。
!---
IF 0< DOTc(px(i)-sx(1), px(i)-sx(K-1)) THEN !交点px(i)が sx(1)~sx(K-1)線の延長上なら破線 の描画。
SET LINE STYLE 3
IF ABS(px(i)-sx(1))< ABS(px(i)-sx(K-1)) THEN PLOT LINES:px(i);sx(1) ELSE PLOT LINES:px(i);sx(K-1)
SET LINE STYLE 1
END IF
NEXT i
CALL GRAPH_px(K, p,px) !K角形 p()についてのシムソン線 px()の描画
END SUB
SUB GRAPH_px(K, p(),px())
SET LINE COLOR K0-K+1
SET POINT COLOR K0-K+1
!---simson line
IF K=K0 THEN
SET LINE width 2
SET POINT STYLE 7
ELSE
SET LINE width 1
SET POINT STYLE 6
END IF
FOR i=1 TO K !シムソン線 px()の描画。
IF 1< i THEN PLOT LINES: px(i-1);px(i) !交点間、px(i-1)~px(i)線
PLOT POINTS: px(i) !px(i)交点
IF K=K0 THEN PLOT label,AT px(i):STR$(i) !交点番号
NEXT i
END SUB
SUB GRAPH_p(K, p())
SET LINE COLOR K0-K+2
IF K=K0 THEN SET LINE width 2
FOR i=1 TO K !K角形 p()の描画。
PLOT LINES: p(i);p(MOD(i,K)+1) !頂点間、p(i)~p(i+1)線
IF K=K0 THEN PLOT label,AT p(i):CHR$(64+i) !頂点名、A,B,,,
NEXT i
SET LINE width 1
END SUB
FUNCTION pxab(p, a, b)
LET h1=(b-a)/ABS(b-a) !h1= a~b 線 に平行な単位ベクトル (a→b方向)
LET n1=COMPLEX(-im(h1),re(h1)) !n1= a~b 線 に垂直な単位ベクトル (a→bの左方向)
LET pxab= DOTc( a-p, n1 )*n1 +p !pxab= p 点 から a~b 線 に引く垂線の交点
END FUNCTION
DEF DOTc(a,b)=re(a)*re(b)+im(a)*im(b) !内積(a・b) …complex
END
|
|