N角形の Simson Line(シムソン線)

 投稿者:SECOND  投稿日:2011年11月 3日(木)15時50分10秒
  !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
 

戻る