投稿者:リアス
投稿日:2011年10月25日(火)22時25分0秒
|
|
|
点数0~100を入力して、その成績を評価するプログラムを作成してくれませんか?
例
優 80点以上100点以下
良 70点以上79点以下
可 60点以上69点以下
不可 59点以下
|
|
投稿者:山中和義
投稿日:2011年10月26日(水)08時46分58秒
|
|
|
> No.1686[元記事へ]
リアスさんへのお返事です。
> 点数0~100を入力して、その成績を評価するプログラムを作成してくれませんか?
> 例
> 優 80点以上100点以下
> 良 70点以上79点以下
> 可 60点以上69点以下
> 不可 59点以下
INPUT PROMPT "得点を入力してください。": P
IF P>=80 THEN
PRINT "優"
ELSEIF P>=70 THEN
PRINT "良"
ELSEIF P>=60 THEN
PRINT "可"
ELSE
PRINT "不可"
END IF
END
|
|
|
投稿者:リアス
投稿日:2011年10月26日(水)12時12分38秒
|
|
|
お忙しいところ、お手数をおかけしました。
ありがとうございました。
|
|
|
投稿者:山中和義
投稿日:2011年10月29日(土)19時29分43秒
|
|
|
> No.1674[元記事へ]
!図形と方程式
SET WINDOW -8,8,-8,8 !表示領域を設定する ※
DRAW grid !XY座標
PUBLIC NUMERIC cEps !精度 ※調整が必要である
LET cEPS=1E-8
PUBLIC NUMERIC cINF !∞
LET cINF=999999
PUBLIC NUMERIC gcCOLOR,gcSTYLE,gcLINESTYLE !描画色、線種
LET gcCOLOR=1
LET gcLINESTYLE=1
!------------------------------ ここまでがサブルーチン
DIM L(5),M(5),N(5) !作業用
DIM xx(8),yy(8)
!●3点を通る
LET gcCOLOR=4
LET x1=-4 !1点目
LET y1=0
LET x2=1 !2点目
LET y2=-2
LET x3=2 !3点目
LET y3=2
CALL gcDRAWPOINT(x1,y1,"") !点1を描く
CALL gcDRAWPOINT(x2,y2,"") !点2
CALL gcDRAWPOINT(x3,y3,"") !点3
CALL gcFNC2P3(x1,y1,x2,y2,x3,y3, A,B,C)
CALL gcDRAWFNC2(A,B,C,-cINF,cINF) !2次関数を描く
END
!↓↓↓↓↓※※※※※ ここに前出のサブルーチンの抜粋部分
!作図ツール(Geometric Constructor)
!図形と方程式
! 点 (x,y)
! 直線 Lx+My+N=0
! 円 x^2+y^2+Ax+By+C=0
!
! 角度の単位は度、反時計まわりが正とする。
!作図ルーチン
EXTERNAL SUB gcDRAWPOINT(x,y,s$) !点(x,y)を描く
ASK WINDOW x1,x2,y1,y2
SET AREA COLOR gcCOLOR
DRAW disk WITH SCALE(0.1)*SHIFT(x,y) !※拡大率0.1は調整が必要である
IF s$<>"" THEN PLOT TEXT ,AT x,y: s$
END SUB
EXTERNAL SUB gcDRAWLINE(L,M,N,s$,o) !直線Lx+My+N=0を描く
IF (L=0 AND M=0) THEN
PRINT "L=M=0なので、直線が成立しません。"; L;M;N
ELSE
ASK WINDOW x1,x2,y1,y2
SET LINE COLOR gcCOLOR
SET LINE STYLE gcLINESTYLE
IF ABS(L)>ABS(M) THEN !y=±xの傾きより大きいなら ※y軸に平行な直線を含む
PLOT LINES: -(M*y1+N)/L,y1; -(M*y2+N)/L,y2
ELSE
PLOT LINES: x1,-(L*x1+N)/M; x2,-(L*x2+N)/M
END IF
IF s$<>"" THEN !注釈
IF M=0 THEN !y軸に平行なら
LET x=-N/L !x切片
LET y=0
ELSEIF L=0 THEN !x軸に平行なら
LET x=0 !y切片
LET y=-N/M
ELSE !x軸とy軸の両方と交差するなら(いわゆる斜めの直線)
SELECT CASE o !記入位置
CASE 0 !y切片
LET x=0
LET y=-N/M
CASE 1 !x切片
LET x=-N/L
LET y=0
CASE 2 !x切片とy切片との中点
LET x=-N/L*0.5
LET y=-N/M*0.5
CASE ELSE
END SELECT
END IF
PLOT TEXT ,AT x,y: s$
END IF
END IF
END SUB
EXTERNAL SUB gcDRAWCIRCLE(A,B,C,s$,o) !円x^2+y^2+Ax+By+C=0を描く
LET RR=(A^2+B^2)/4-C !判別式
IF RR>=0 THEN
SET LINE COLOR gcCOLOR
SET LINE STYLE gcLINESTYLE
LET CX=-A/2 !中心
LET CY=-B/2
LET R=SQR(RR) !半径
FOR i=0 TO 360 !(x-CX)^2+(y-CY)^2=R^2として描く
PLOT LINES: R*COS(RAD(i))+CX,R*SIN(RAD(i))+CY;
NEXT i
PLOT LINES
IF s$<>"" THEN !注釈
SELECT CASE o !記入位置
CASE 0 !右
LET x=CX+R
LET y=CY
CASE 1 !上
LET x=CX
LET y=CY+R
CASE 2 !右上
LET x=R*SQR(2)/2+CX !45度
LET y=R*SQR(2)/2+CY
CASE ELSE
END SELECT
PLOT TEXT ,AT x,y: s$
END IF
ELSE
PRINT "半径が負なので、円が成立しません。"; A;B;C
END IF
END SUB
!補助ルーチン
EXTERNAL FUNCTION DIST(x1,y1,x2,y2) !2点(x1,y1),(x2,y2)間の距離
LET DIST=SQR((x1-x2)^2+(y1-y2)^2)
END FUNCTION
!点(x,y)と直線Lx+My+N=0との距離(点から直線へ下した垂線の長さ)
EXTERNAL FUNCTION DIST1L(x,y,L,M,N)
LET DIST1L=ABS(L*x+M*y+N)/SQR(L^2+M^2)
END FUNCTION
EXTERNAL SUB Solve2Equ(a,b,c, x1,x2,K) !2次方程式ax^2+bx+c=0を解く
IF a=0 THEN
PRINT "2次の係数が0なので、2次方程式ではありません。"; a;b;c
LET K=0
ELSE
LET D=b^2-4*a*c !判別式
IF D>=0 THEN !実数解なら
LET x1=(-b+SQR(D))/(2*a) !1つの解
IF D=0 THEN !重解なら
LET K=1
ELSE
LET x2=(-b-SQR(D))/(2*a) !もう1つの解
LET K=2
END IF
ELSE !虚数解なら
LET K=0
END IF
END IF
END SUB
!演算ルーチン
!●点
!点A(x1,y1),B(x2,y2)を結ぶ線分ABをm:nに分ける点(内分・外分する点)
EXTERNAL SUB gcDIVIDE(x1,y1,x2,y2,m,n, xx,yy)
LET xx=(n*x1+m*x2)/(m+n) !※外分m:nは、m:(-n)となる
LET yy=(n*y1+m*y2)/(m+n)
END SUB
!●直線
!2点(x1,y1), (x2,y2)を通る直線Lx+My+N=0
!公式 -(y2-y1)(x-x1)+(x2-x1)(y-y1)=0 より
EXTERNAL SUB gcLINE(x1,y1,x2,y2, L,M,N)
IF (x1=x2 AND y1=y2) THEN !同一点なら
PRINT "異なる2点ではないので、直線が成立しません。"; x1;y1;x2;y2
ELSE
LET L=y1-y2
LET M=x2-x1
LET N=x1*y2-y1*x2
END IF
END SUB
!↑↑↑↑↑※※※※※ ここに前出のサブルーチンの抜粋部分
つづく
|
|
|
投稿者:山中和義
投稿日:2011年10月29日(土)19時31分12秒
|
|
|
> No.1689[元記事へ]
!------------------------- オプション
!2次関数 y=Ax^2+Bx+C(一般形)
!作図ルーチン
EXTERNAL SUB gcDRAWFNC2(A,B,C,d1,d2) !2次関数y=Ax^2+Bx+C、x=[d1,d2]を描く
IF A=0 THEN
PRINT "A=0なので、2次関数ではありません。"; A;B;C
ELSE
ASK WINDOW x1,x2,y1,y2
LET x1=MAX(x1,d1)
LET x2=MIN(x2,d2)
SET LINE COLOR gcCOLOR
FOR x=x1 TO x2 STEP 1/2^8 !※折れ線による
PLOT LINES: x,A*x^2+B*x+C;
NEXT x
PLOT LINES
END IF
END SUB
!補助ルーチン
EXTERNAL FUNCTION gcFNC2VAL(x,A,B,C) !2次関数Ax^2+Bx+Cの値
LET gcFNC2VAL=A*x^2+B*x+C
END FUNCTION
!演算ルーチン
EXTERNAL SUB gcFNC2(aa,p,q, A,B,C) !標準形(基本形) 軸x=p、頂点(p,q)として、y=a(x-p)^2+q
LET A=aa
LET B=-2*aa*p
LET C=aa*p^2+q
END SUB
EXTERNAL SUB gcFNC2F(aa,x1,x2, A,B,C) !因数分解形(分離形) y=a(x-x1)(x-x2)
LET A=aa
LET B=-(x1+x2)*aa
LET C=x1*x2*aa
END SUB
!3点A(x1,y1),B(x2,y2),C(x3,y3)を通る2次関数
! 点A,Bを通る直線は、y=(y2-y1)(x-x1)/(x2-x1)+y1なので、
! 点A,Bを通る2次関数は、y=k(x-x1)(x-x2)+(y2-y1)(x-x1)/(x2-x1)+y1とおける。
! ∵点(x1,0)、(x2,0)を通る2次関数は、y=k(x-x1)(x-x2)となる。
! これを平行移動させて、点(x1,y1)、(x2,y2)を通るようにしたものである。
! 点Cを通るので、代入して、kを求める。
EXTERNAL SUB gcFNC2P3(x1,y1,x2,y2,x3,y3, A,B,C)
IF (x1=x2 AND y1=y2) OR (x2=x3 AND y2=y3) OR (x3=x1 AND y3=y1) THEN !同一点なら
PRINT "異なる3点ではないので、2次関数が成立しません。"; x1;y1;x2;y2;x3;y3
ELSE
LET k=( y3 -(y2-y1)*(x3-x1)/(x2-x1) -y1 )/( (x3-x1)*(x3-x2) )
LET A=k
LET B=-k*(x1+x2)+(y2-y1)/(x2-x1)
LET C=k*x1*x2-(y2-y1)*x1/(x2-x1)+y1
END IF
END SUB
!2次関数y=Ax^2+Bx+Cと直線Lx+My+N=0との交点
EXTERNAL SUB gcFNC2INTERSECTION(A,B,C,L,M,N, xx(),yy(),K)
IF M=0 THEN !y軸に平行な直線
LET t=-N/L
LET xx(1)=t
LET yy(1)=A*t^2+B*t+C
LET K=1
ELSE
CALL Solve2Equ(A,B+L/M,C+N/M, x1,x2,K)
IF K>0 THEN
LET xx(1)=x1
LET yy(1)=-(L*x1+N)/M !直線の式に代入する
IF K=2 THEN
LET xx(2)=x2
LET yy(2)=-(L*x2+N)/M
END IF
END IF
END IF
END SUB
!2次関数y=A1x^2+B1x+C1と2次関数y=A2x^2+B2x+C2との交点
EXTERNAL SUB gcFNC2INTERSECTION1F(A1,B1,C1,A2,B2,C2, xx(),yy(),K)
IF A1=A2 AND B1=B2 THEN !軸上を平行移動したもの
IF C1=C2 THEN
PRINT "2次関数は同一なので、交点は2次関数そのものです。(無限個)"; A1;B1;C1A2;B2;C2
ELSE
PRINT "交点なし"
END IF
LET K=0
ELSE !下に凸下に凸、下に凸上に凸、上に凸上に凸の場合
CALL Solve2Equ(A1-A2,B1-B2,C1-C2, x1,x2,K)
IF K>0 THEN
LET xx(1)=x1
LET yy(1)=gcFNC2VAL(x1,A1,B1,C1) !A1*x1^2+B1*x1+C1
IF K=2 THEN
LET xx(2)=x2
LET yy(2)=gcFNC2VAL(x2,A1,B1,C1) !A1*x2^2+B1*x2+C2
END IF
END IF
END IF
END SUB
!2次関数y=Ax^2+Bx+Cと円x^2+y^2+Px+Qy+R=0との交点
EXTERNAL SUB gcFNC2INTERSECTION1C(A,B,C,P,Q,R, xx(),yy(),K)
END SUB
!2次関数y=Ax^2+Bx+C上の点(x,Ax^2+Bx+C)における接線
! Y-y=f'(x)(X-x)より、Y-(Ax^2+Bx+C)=(2Ax+B)(X-x)
EXTERNAL SUB gcFNC2TANGENTLINE(x0,y0,A,B,C, L,M,N)
IF ABS(A*x0^2+B*x0+C-y0)>cEPS THEN
PRINT "点は2次関数上にありません。"; x0;y0;A;B;C
ELSE
LET L=-(2*A*x0+B)
LET M=1
LET N=A*x0^2-C
END IF
END SUB
!点(x,y)から2次関数y=Ax^2+Bx+Cへの接線
! y軸と平行な直線(x=p)ではないので、点(x,y)を通る傾きmの直線は、Y-y=m(X-x)とおける。
! AX^2+BX+C=m(X-x)+y ∴AX^2+(B-m)X+(C+mx-y)=0 ←式1
! 重根を持つので、判別式D=(B-m)^2-4A(C+mx-y)=0 ∴m^2-(4Ax+2B)m+(B^2-4AC+4Ay)=0
! mについての2次方程式を解く。2つの解をm1,m2とする。
! m1={ (4Ax+2B) + √{(4Ax+2B)^2-4(B^2-4AC+4Ay)} }/2
! =(2Ax+B) + 2√{ A((A^2x^2+Bx+C) -y) }
! =(2Ax+B)+2√(Ad) ただし、d={(A^2x^2+Bx+C) -y}とする。
! 接点のX座標X1は、式1より、
! -(B-m1)/(2A)
! =-B/(2A)+m1/(2A)
! =-B/(2A)+{(2Ax+B)+2√(Ad)}/(2A)
! ={-B+(2Ax+B)}/(2A)+√(d/A)
! =x+√(d/A)
! 同様に、X2=x-√(d/A)
EXTERNAL SUB gcFNC2TANGENTLINE1F(x,y,A,B,C, L(),M(),N(),K, xx(),yy(),K2)
LET d=(A*x^2+B*x+C)-y !点と2次関数とのX=x上での符号付き距離
IF SGN(A)*d<0 THEN !点が下に凸なら上側、上に凸なら下側の場合
PRINT "接線なし"
LET K=0
LET K2=0
ELSE
LET t=SQR(ABS(d/A)) !√(d/A)
LET xx(1)=x-SGN(A)*t !接点 ※x座標が小さい方
LET yy(1)=gcFNC2VAL(xx(1),A,B,C) !A*xx(1)^2+B*xx(1)+C
LET xx(2)=x+SGN(A)*t
LET yy(2)=gcFNC2VAL(xx(2),A,B,C) !A*xx(2)^2+B*xx(2)+C
LET K2=2
CALL gcLINE(x,y,xx(1),yy(1), L(1),M(1),N(1)) !接線
CALL gcLINE(x,y,xx(2),yy(2), L(2),M(2),N(2))
LET K=2
END IF
END SUB
!2次関数y=A1x^2+B1x+C1と2次関数y=A2x^2+B2x+C2との共通接線
! 2頂点及び共通接線の2接点を結ぶ線分を-A2:A1の比に分ける点は一致する
! y=A1(x+B1/(2A1))^2-(B1/(4A1))+C1
! y=A2(x+B2/(2A2))^2-(B2/(4A2))+C2
EXTERNAL SUB gcFNC2TANGENTLINE2F(A1,B1,C1, A2,B2,C2, L(),M(),N(),K, xx(),yy(),K2)
IF A1=A2 AND B1=B2 THEN !軸上を平行移動したもの
IF C1=C2 THEN
PRINT "2次関数は同一なので、共通接線は無限個です。"; A1;B1;C1A2;B2;C2
ELSE
PRINT "共通接線なし"
END IF
LET K=0
LET K2=0
ELSEIF A1=A2 THEN !共に上に(下に)凸で、開きが同じなら
LET m1=((A2*B1^2-A1*B2^2)-4*A1*A2*(C1-C2))/(2*(A2*B1-A1*B2)) !1次関数なので
LET L(1)=-m1
LET M(1)=1
LET N(1)=(B1-m1)^2/(4*A1)-C1 !式1に代入
LET K=1
LET t=-(B1-m1)/(2*A1) !2次関数1の接点
LET xx(1)=t
LET yy(1)=gcFNC2VAL(t,A1,B1,C1) !A1*t^2+B1*t+C1
LET t=-(B2-m1)/(2*A2) !2次関数2の接点
LET xx(2)=t
LET yy(2)=gcFNC2VAL(t,A2,B2,C2) !A2*t^2+B2*t+C2
LET K2=2
ELSE
LET x1=-B1/(2*A1) !頂点
LET y1=gcFNC2VAL(x1,A1,B1,C1)
LET x2=-B2/(2*A2) !頂点
LET y2=gcFNC2VAL(x2,A2,B2,C2)
CALL gcDIVIDE(x1,y1,x2,y2,-A2,A1,x,y) !2頂点を-A2:A1に外分する点
IF ABS( gcFNC2VAL(x,A1,B1,C1) )<=cEPS THEN ! !2次関数上の点なら(2次関数は接する)
CALL gcFNC2TANGENTLINE(x,y,A1,B1,C1, LL,MM,NN)
LET L(1)=LL
LET M(1)=MM
LET N(1)=NN
LET K=1
FOR i=1 TO 2 !2次関数1,2の接点
LET xx(i)=x
LET yy(i)=y
NEXT i
LET K2=2
ELSE
DIM px(2),py(2)
CALL gcFNC2TANGENTLINE1F(x,y,A1,B1,C1, L,M,N,K, px,py,K2) !2次関数1の接線と接点
IF K>0 THEN
FOR i=1 TO K2 !copy it
LET xx(2*i-1)=px(i)
LET yy(2*i-1)=py(i)
NEXT i
CALL gcFNC2TANGENTLINE1F(x,y,A2,B2,C2, L,M,N,K, px,py,K3) !2次関数2の接線と接点
FOR i=1 TO K3 !copy it
LET xx(2*i)=px(i)
LET yy(2*i)=py(i)
NEXT i
LET K2=K2+K3
END IF
END IF
END IF
END SUB
!2次関数y=Ax^2+Bx+Cと円x^2+y^2+Px+Qy+R=0との共通接線
EXTERNAL SUB gcFNC2TANGENTLINE1C(A,B,C, P,Q,R, L(),M(),N(),K)
END SUB
|
|
|
投稿者:GAI
投稿日:2011年10月30日(日)13時11分59秒
|
|
|
テレビの番組で目の錯覚の特集があっていて、
白と黒の長方形が上下に位置して、同じスピードで右から左へ移動している。
それだけだと、上と下の長方形は目には同じ速さで滑らかに揃って移動していることが認識できる。
これに背景に白と黒のストライプ(縦の帯が交互に並ぶ)の模様を付けたのを配置すると、
そのときは前の白と黒の長方形を同じ条件で移動させて見ると、今度はそれぞれの長方形が
ぎくしゃくした動きをしているように見えてくる。また動きのスピードも異なっているように感じる。
これを体験できるプログラムを作って頂きたいです。
|
|
|
投稿者:山中和義
投稿日:2011年10月30日(日)14時52分54秒
|
|
|
> No.1691[元記事へ]
GAIさんへのお返事です。
●サンプル
LET W=800 !画面の大きさ
LET H=300
SET bitmap SIZE W,H
SET WINDOW 0,W-1,0,H-1
LET A=80 !長方形の横の長さ
LET B=120 !縦
LET C=40 !縦の縞模様の幅
FOR t=0 TO W !左から右へ
SET DRAW mode hidden !ちらつき防止開始
CLEAR
SET AREA COLOR 1
FOR x=0 TO W STEP 2*C !縦の縞模様を描く ※左下が原点
PLOT AREA: x,0; x,H; x+C,H; x+C,0; x,0
NEXT x
SET AREA COLOR 0 !白の長方形を描く
LET y=H/4-B/2
PLOT AREA: t,y; t,y+B; t+A,y+B; t+A,y; t,y
SET AREA COLOR 1 !黒の長方形を描く
LET y=H*3/4-B/2
PLOT AREA: t,y; t,y+B; t+A,y+B; t+A,y; t,y
SET DRAW mode explicit !ちらつき防止終了
!!!WAIT DELAY 0.1
NEXT t
END
|
|
|
投稿者: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
|
|
|
投稿者:日高
投稿日:2011年11月 6日(日)11時13分15秒
|
|
|
画素数を取得する命令文 ASK PIXEL SIZE (x1,y1;x2,y2) a,b が、座標系によっては負の値を返します。
100 SET BITMAP SIZE 401,401
!
110 SET WINDOW 0,1,0,1
120 CALL pixel
!
130 SET WINDOW 1,0,0,1
140 CALL pixel
!
150 SET WINDOW 0,1,30,10
160 CALL pixel
!
170 SET WINDOW 9,4,30,10
180 CALL pixel
!
190 SUB pixel
200 ASK WINDOW L,R,B,T
210 ASK PIXEL SIZE (L,B;R,T) w,h
220 PRINT w;h,
230 PLOT POINTS: L+(R-L)/4,B+(T-B)/4;L+(R-L)/2,B+(T-B)/2
240 ASK PIXEL SIZE (L+(R-L)/4,B+(T-B)/4;L+(R-L)/2,B+(T-B)/2) w,h
250 PRINT w;h, !描画領域の1/4の画素数
260 ASK PIXEL SIZE w,h !十進BASIC独自拡張
270 PRINT w;h
280 END SUB
!
290 END
|
|
|
投稿者:白石和夫
投稿日:2011年11月 6日(日)12時17分23秒
|
|
|
> No.1694[元記事へ]
ご報告ありがとうございました。
座標系の逆転を考えていなかったのは見落としでした。修正します。
SET WINDOW 4,0,4,0
ASK PIXEL SIZE (4,4;0,0) a,b
PRINT a,b
END
|
|
|
投稿者:白石和夫
投稿日:2011年11月 6日(日)15時12分49秒
|
|
|
投稿者:日高
投稿日:2011年11月 6日(日)22時11分58秒
|
|
|
白石和夫さんへのお返事です。
早々にご対応いただきありがとうございます。十進BASICは仕事でも使わせていただいております。助かりました。
[参考] 今までの ASK PIXEL SIZE (x1,y1;x2,y2) a,b の値がほしい場合は、おそらく次の式で得られます。
LET a=PIXELX(MAX(x1,x2))-PIXELX(MIN(x1,x2))+1
LET b=PIXELY(MAX(y1,y2))-PIXELY(MIN(y1,y2))+1
[追加] 修正パッチとして次の2行を加筆すれば、新旧どちらのバージョンでも正しい値になります。自作プログラムの配布などでは、ぜひ加筆して配布を。
ASK PIXEL SIZE (x1,y1;x2,y2) a,b
LET a=ABS(a-1)+1
LET b=ABS(b-1)+1
|
|
|
投稿者:白石和夫
投稿日:2011年11月 7日(月)16時47分10秒
|
|
|
投稿者:しばっち
投稿日:2011年11月13日(日)19時57分48秒
|
|
|
くりぬき図形(シェルピンスキーのカーペット)
!'ボクセル表現(VOXEL)
LET L=6^4
INPUT PROMPT "LEVEL =":N !' LEVEL 3で146MB
FILE GETSAVENAME F$,"dxfファイル|*.dxf"
IF F$="" THEN STOP
IF POS(UCASE$(F$),".DXF")=0 THEN LET F$=F$ & ".dxf"
OPEN #1:NAME F$
ERASE #1
PRINT #1:"0"
PRINT #1:"SECTION"
PRINT #1:"2"
PRINT #1:"ENTITIES"
CALL RECURSIVE(N,X,Y,Z,L,#1)
PRINT #1:"0"
PRINT #1:"ENDSEC"
PRINT #1:"0"
PRINT #1:"EOF"
CLOSE #1
END
EXTERNAL SUB RECURSIVE(N,X,Y,Z,L,#1)
IF N=0 THEN
CALL CUBE(#1,X-L/3,Y+L/3,Z+L/3,L/3)
CALL CUBE(#1,X, Y+L/3,Z+L/3,L/3)
CALL CUBE(#1,X+L/3,Y+L/3,Z+L/3,L/3)
CALL CUBE(#1,X-L/3,Y, Z+L/3,L/3)
CALL CUBE(#1,X+L/3,Y, Z+L/3,L/3)
CALL CUBE(#1,X-L/3,Y-L/3,Z+L/3,L/3)
CALL CUBE(#1,X, Y-L/3,Z+L/3,L/3)
CALL CUBE(#1,X+L/3,Y-L/3,Z+L/3,L/3)
CALL CUBE(#1,X-L/3,Y+L/3,Z-L/3,L/3)
CALL CUBE(#1,X, Y+L/3,Z-L/3,L/3)
CALL CUBE(#1,X+L/3,Y+L/3,Z-L/3,L/3)
CALL CUBE(#1,X-L/3,Y, Z-L/3,L/3)
CALL CUBE(#1,X+L/3,Y, Z-L/3,L/3)
CALL CUBE(#1,X-L/3,Y-L/3,Z-L/3,L/3)
CALL CUBE(#1,X, Y-L/3,Z-L/3,L/3)
CALL CUBE(#1,X+L/3,Y-L/3,Z-L/3,L/3)
CALL CUBE(#1,X-L/3,Y+L/3,Z,L/3)
CALL CUBE(#1,X+L/3,Y+L/3,Z,L/3)
CALL CUBE(#1,X-L/3,Y-L/3,Z,L/3)
CALL CUBE(#1,X+L/3,Y-L/3,Z,L/3)
ELSE
CALL RECURSIVE(N-1,X-L/3,Y+L/3,Z+L/3,L/3,#1)
CALL RECURSIVE(N-1,X, Y+L/3,Z+L/3,L/3,#1)
CALL RECURSIVE(N-1,X+L/3,Y+L/3,Z+L/3,L/3,#1)
CALL RECURSIVE(N-1,X-L/3,Y, Z+L/3,L/3,#1)
CALL RECURSIVE(N-1,X+L/3,Y, Z+L/3,L/3,#1)
CALL RECURSIVE(N-1,X-L/3,Y-L/3,Z+L/3,L/3,#1)
CALL RECURSIVE(N-1,X, Y-L/3,Z+L/3,L/3,#1)
CALL RECURSIVE(N-1,X+L/3,Y-L/3,Z+L/3,L/3,#1)
CALL RECURSIVE(N-1,X-L/3,Y+L/3,Z-L/3,L/3,#1)
CALL RECURSIVE(N-1,X, Y+L/3,Z-L/3,L/3,#1)
CALL RECURSIVE(N-1,X+L/3,Y+L/3,Z-L/3,L/3,#1)
CALL RECURSIVE(N-1,X-L/3,Y, Z-L/3,L/3,#1)
CALL RECURSIVE(N-1,X+L/3,Y, Z-L/3,L/3,#1)
CALL RECURSIVE(N-1,X-L/3,Y-L/3,Z-L/3,L/3,#1)
CALL RECURSIVE(N-1,X, Y-L/3,Z-L/3,L/3,#1)
CALL RECURSIVE(N-1,X+L/3,Y-L/3,Z-L/3,L/3,#1)
CALL RECURSIVE(N-1,X-L/3,Y+L/3,Z,L/3,#1)
CALL RECURSIVE(N-1,X+L/3,Y+L/3,Z,L/3,#1)
CALL RECURSIVE(N-1,X-L/3,Y-L/3,Z,L/3,#1)
CALL RECURSIVE(N-1,X+L/3,Y-L/3,Z,L/3,#1)
END IF
END SUB
以下省略
EXTERNAL SUB CUBE(#1,X,Y,Z,L)
END SUB
http://6317.teacup.com/basic/bbs/1630 からコピペしてください
|
|
|
投稿者:しばっち
投稿日:2011年11月13日(日)19時58分37秒
|
|
|
素数を求める
!'ボクセル表現(VOXEL)
PUBLIC NUMERIC R
OPTION BASE 0
DIM A(3)
FILE GETSAVENAME F$,"dxfファイル|*.dxf"
IF F$="" THEN STOP
IF POS(UCASE$(F$),".DXF")=0 THEN LET F$=F$ & ".dxf"
LET R=10 !'半径
OPEN #1:NAME F$
ERASE #1
PRINT #1:"0"
PRINT #1:"SECTION"
PRINT #1:"2"
PRINT #1:"ENTITIES"
FOR I=0 TO R
FOR J=0 TO R
FOR K=0 TO R
IF ABS(I)+ABS(J)+ABS(K)>1 AND SQR(I*I+J*J+K*K)<=R THEN
LET A(0)=I
LET A(1)=J
LET A(2)=K
IF ISQUATERNIONPRIME(A)<>0 THEN CALL CUBE(#1,A(0),A(1),A(2),1)
LET A(0)=-I
LET A(1)=J
LET A(2)=K
IF ISQUATERNIONPRIME(A)<>0 THEN CALL CUBE(#1,A(0),A(1),A(2),1)
LET A(0)=I
LET A(1)=-J
LET A(2)=K
IF ISQUATERNIONPRIME(A)<>0 THEN CALL CUBE(#1,A(0),A(1),A(2),1)
LET A(0)=I
LET A(1)=J
LET A(2)=-K
IF ISQUATERNIONPRIME(A)<>0 THEN CALL CUBE(#1,A(0),A(1),A(2),1)
LET A(0)=-I
LET A(1)=-J
LET A(2)=K
IF ISQUATERNIONPRIME(A)<>0 THEN CALL CUBE(#1,A(0),A(1),A(2),1)
LET A(0)=-I
LET A(1)=J
LET A(2)=-K
IF ISQUATERNIONPRIME(A)<>0 THEN CALL CUBE(#1,A(0),A(1),A(2),1)
LET A(0)=I
LET A(1)=-J
LET A(2)=-K
IF ISQUATERNIONPRIME(A)<>0 THEN CALL CUBE(#1,A(0),A(1),A(2),1)
LET A(0)=-I
LET A(1)=-J
LET A(2)=-K
IF ISQUATERNIONPRIME(A)<>0 THEN CALL CUBE(#1,A(0),A(1),A(2),1)
END IF
NEXT K
NEXT J
NEXT I
PRINT #1:"0"
PRINT #1:"ENDSEC"
PRINT #1:"0"
PRINT #1:"EOF"
CLOSE #1
END
EXTERNAL FUNCTION ISQUATERNIONPRIME(A())
OPTION BASE 0
DIM B(3),S(3)
LET ISQUATERNIONPRIME=0
FOR I=-R*1.5 TO R*1.5 !'探索範囲を広めに
FOR J=-R*1.5 TO R*1.5
FOR K=-R*1.5 TO R*1.5
IF SQR(I*I+J*J+K*K)<=R AND ABS(I)+ABS(J)+ABS(K)>1 THEN
LET B(0)=I
LET B(1)=J
LET B(2)=K
CALL DIV(S,A,B)
IF FRAC(S(0))=0 AND FRAC(S(1))=0 AND FRAC(S(2))=0 AND FRAC(S(3))=0 AND ABS(S(0))+ABS(S(1))+ABS(S(2))+ABS(S(3))>1 THEN
EXIT FUNCTION
END IF
END IF
NEXT K
NEXT J
NEXT I
LET ISQUATERNIONPRIME=-1
END FUNCTION
EXTERNAL FUNCTION FRAC(X) !'小数部
LET FRAC=X-INT(X)
END FUNCTION
EXTERNAL SUB MUL(S(),A(),B()) !'クォータニオン(4元数)掛算
OPTION BASE 0
DIM SS(3)
LET SS(0)=A(0)*B(0)-A(1)*B(1)-A(2)*B(2)-A(3)*B(3)
LET SS(1)=A(0)*B(1)+A(1)*B(0)+A(2)*B(3)-A(3)*B(2)
LET SS(2)=A(0)*B(2)-A(1)*B(3)+A(2)*B(0)+A(3)*B(1)
LET SS(3)=A(0)*B(3)+A(1)*B(2)-A(2)*B(1)+A(3)*B(0)
MAT S=SS
END SUB
EXTERNAL SUB DIV(S(),A(),B())
OPTION BASE 0
DIM BB(3)
LET BB(0)=B(0)
LET BB(1)=-B(1)
LET BB(2)=-B(2)
LET BB(3)=-B(3)
CALL MUL(S,A,BB)
MAT S=(1/(B(0)^2+B(1)^2+B(2)^2+B(3)^2))*S
END SUB
以下省略
EXTERNAL SUB CUBE(#1,X,Y,Z,L)
END SUB
|
|
|
投稿者:しばっち
投稿日:2011年11月13日(日)19時59分28秒
|
|
|
サンプル波形の表示
!'XSIZE/(SAMPLING/FREQ)=表示周期(3周期)
LET XSIZE=600
CALL GINIT(XSIZE,400)
SET WINDOW 0 , XSIZE-1 , -1.5,1.5
LET SAMPLING=8000 !'サンプリング周波数
LET FREQ=40 !'周波数
SET TEXT FONT "" , 18
FOR MODE=1 TO 7
FOR I=1 TO XSIZE
LET X1=FREQ*(I-1)/SAMPLING*2*PI
LET X2=FREQ*I/SAMPLING*2*PI
LET Y1=SIN(X1)
LET Y2=SIN(X2)
CALL LINE(I-1,Y1,I,Y2,7)
SELECT CASE MODE
CASE 1
PLOT LABEL,AT XSIZE/2,1.3 : "のこぎり波"
LET Y1=SAW(X1)
LET Y2=SAW(X2)
CALL LINE(I-1,Y1,I,Y2,4)
CASE 2
PLOT LABEL,AT XSIZE/2,1.3 : "方形波"
LET Y1=SQUAREW(X1)
LET Y2=SQUAREW(X2)
CALL LINE(I-1,Y1,I,Y2,6)
CASE 3
PLOT LABEL,AT XSIZE/2,1.3 : "三角波"
LET Y1=TRIANGLEW(X1)
LET Y2=TRIANGLEW(X2)
CALL LINE(I-1,Y1,I,Y2,5)
CASE 4
PLOT LABEL,AT XSIZE/2,1.3 : "パルス波"
LET Y1=PULSEW(X1)
LET Y2=PULSEW(X2)
CALL LINE(I-1,Y1,I,Y2,1)
CASE 5
PLOT LABEL,AT XSIZE/2,1.3 : "台形波"
LET Y1=TRAPEZOIDALW(X1)
LET Y2=TRAPEZOIDALW(X2)
CALL LINE(I-1,Y1,I,Y2,3)
CASE 6
PLOT LABEL,AT XSIZE/2,1.3 : "階段状"
LET Y1=STEPWISE(X1,4)
LET Y2=STEPWISE(X2,4)
CALL LINE(I-1,Y1,I,Y2,2)
CASE 7
PLOT LABEL,AT XSIZE/2,1.3 : "ワイヤストラス"
LET Y1=WEIERSTRASS(X1,15)
LET Y2=WEIERSTRASS(X2,15)
CALL LINE(I-1,Y1,I,Y2,8)
END SELECT
NEXT I
WAIT DELAY 3 !'表示時間(秒)
CLEAR
NEXT MODE
END
EXTERNAL FUNCTION PULSEW(X) !'パルス波 PULSE WAVE
IF ABS(ABS(SIN(X))-1)<.000001 THEN LET PULSEW=SGN(SIN(X)) ELSE LET PULSEW=0
END FUNCTION
EXTERNAL FUNCTION SQUAREW(X) !'方形波 SQUARE WAVE
LET SQUAREW=SGN(SIN(X))
END FUNCTION
!'EXTERNAL FUNCTION SQUAREW(X,N)
!'FOR I=1 TO N
!' LET S=S+SIN((2*I-1)*X)/(2*I-1)
!'NEXT I
!'LET SQUAREW=S*4/PI
!'END FUNCTION
EXTERNAL FUNCTION TRIANGLEW(X) !'三角波 TRIANGLE WAVE
LET NN=MOD(X,PI)
IF NN>PI/2 THEN LET NN=PI-NN
LET TRIANGLEW=NN/(PI/2)*SGN(SIN(X))
END FUNCTION
!'EXTERNAL FUNCTION TRIANGLEW(X,N)
!'FOR I=1 TO N
!' LET S=S+SIN(I*PI/2)*SIN(I*X)/I/I
!'NEXT I
!'LET TRIANGLEW=S*8/PI/PI
!'END FUNCTION
EXTERNAL FUNCTION SAW(X) !'のこぎり波
LET SAW=MOD(X,PI)/(PI/2)-1
END FUNCTION
!'EXTERNAL FUNCTION SAW(X,N)
!'FOR I=1 TO N
!' LET S=S+SIN(I*X)/I
!'NEXT I
!'LET SAW=S/(PI/2)
!'END FUNCTION
EXTERNAL FUNCTION TRAPEZOIDALW(X) !'台形波 TRAPEZOIDAL WAVE
LET NN=X-INT(X/PI)*PI
IF NN>PI/2 THEN LET NN=PI-NN
LET TRAPEZOIDALW=MIN(1,MAX(-1,NN*SGN(SIN(X))) )
END FUNCTION
!'EXTERNAL FUNCTION TRAPEZOIDALW(X,N)
!'LET ALPHA=1
!'FOR I=1 TO N
!' LET S=S+SIN((2*I-1)*ALPHA)/(2*I-1)^2*SIN((2*I-1)*X)
!'NEXT I
!'LET TRAPEZOIDALW=S*4/(ALPHA*PI)
!'END FUNCTION
EXTERNAL FUNCTION STEPWISE(X,NN) !'階段状
LET STEPWISE=INT(NN*SIN(X))/NN
END FUNCTION
EXTERNAL FUNCTION WEIERSTRASS(X,N) !'ワイヤストラス
LET B=11
FOR I=0 TO N
LET S=S+.5^(I+1)*SIN(B^I*X)
NEXT I
LET WEIERSTRASS=S
END FUNCTION
EXTERNAL SUB GINIT(XSIZE,YSIZE)
SET BITMAP SIZE XSIZE,YSIZE
SET POINT STYLE 1
SET COLOR MODE "REGULAR"
SET COLOR MIX(0) 0,0,0
SET COLOR MIX(1) 0,0,1
SET COLOR MIX(2) 1,0,0
SET COLOR MIX(3) 1,0,1
SET COLOR MIX(4) 0,1,0
SET COLOR MIX(5) 0,1,1
SET COLOR MIX(6) 1,1,0
SET COLOR MIX(7) 1,1,1
CLEAR
END SUB
EXTERNAL SUB LINE(XS,YS,XE,YE,C)
SET COLOR C
PLOT LINES
PLOT LINES: XS,YS;XE,YE
END SUB
|
|
|
投稿者:しばっち
投稿日:2011年11月13日(日)20時00分9秒
|
|
|
サンプル波形の生成
OPTION CHARACTER BYTE
LET CHANNEL=1 !'モノラル
LET SAMPLEBIT=16 !'ビット数
LET HEADERSIZE=16
LET WAVETYPE=1
!'LET PATH$="C:\WINDOWS\TEMP\" !'作業用フォルダ、RAMディスクなど
DIM A$(7),FR(6),TYPE$(8)
MAT READ A$
DATA "8kHz","11.25kHz","22.5kHz","32kHz","44.1kHz","48kHz","プログラム終了"
MAT READ FR
DATA 8000,11025,22050,32000,44100,48000
MAT READ TYPE$
DATA 正弦波,三角波,方形波,台形波,のこぎり波,階段状,パルス波,ワイヤストラス
DO
LOCATE CHOICE (A$):MODE
IF MODE=7 THEN STOP
LOCATE VALUE ,RANGE 0 TO FR(MODE)/2 ,AT 440 : FREQ
SELECT CASE MODE !'サンプリング周波数
CASE 1
LET SAMPLINGFREQ=8000
CASE 2
LET SAMPLINGFREQ=11025
CASE 3
LET SAMPLINGFREQ=22050
CASE 4
LET SAMPLINGFREQ=32000
CASE 5
LET SAMPLINGFREQ=44100
CASE 6
LET SAMPLINGFREQ=48000
END SELECT
LOCATE CHOICE (TYPE$):MODE
LET SAMPLESIZE = SAMPLEBIT / 8 * CHANNEL
LET DATARATE = SAMPLESIZE * SAMPLINGFREQ
LET VOL=.1 !'音量 ※スピーカ破損の可能性あり。音量に気をつけること
LET LEVEL=2^(SAMPLEBIT-1)*VOL
LET SECOND=3 !'再生時間(3秒間)
!' LOCATE VALUE ,RANGE 1 TO 10,AT 3 : SECOND
LET PCMSIZE=INT(DATARATE*SECOND)
LET WAVEFILESIZE = PCMSIZE + 36
OPEN #1:NAME PATH$ & TYPE$(MODE) & ".wav"
ERASE #1
PRINT #1:"RIFF";
PRINT #1:MKL$(WAVEFILESIZE);
PRINT #1:"WAVEfmt ";
PRINT #1:MKL$(HEADERSIZE);
PRINT #1:MKI$(WAVETYPE);
PRINT #1:MKI$(CHANNEL);
PRINT #1:MKL$(SAMPLINGFREQ);
PRINT #1:MKL$(DATARATE);
PRINT #1:MKI$(SAMPLESIZE);
PRINT #1:MKI$(SAMPLEBIT);
PRINT #1:"data";
PRINT #1:MKL$(PCMSIZE);
FOR I=0 TO INT(SAMPLINGFREQ*SECOND)-1
LET X=I*FREQ/SAMPLINGFREQ*2*PI
SELECT CASE MODE
CASE 1
LET DAT=SIN(X)
CASE 2
LET DAT=TRIANGLEW(X)
CASE 3
LET DAT=SQUAREW(X)
CASE 4
LET DAT=TRAPEZOIDALW(X)
CASE 5
LET DAT=SAW(X)
CASE 6
LET DAT=STEPWISE(X,4)
CASE 7
LET DAT=PULSEW(X)
CASE 8
LET DAT=WEIERSTRASS(X,15)
END SELECT
LET DAT=DAT*LEVEL
PRINT #1:MKI$(INT(DAT));
NEXT I
CLOSE #1
PLAYSOUND PATH$ & TYPE$(MODE) & ".wav" !'再生
!'FILE DELETE PATH$ & TYPE$(MODE) & ".wav"
LOOP
END
EXTERNAL FUNCTION PULSEW(X) !'パルス波 PULSE WAVE
IF ABS(ABS(SIN(X))-1)<.0001 THEN LET PULSEW=SGN(SIN(X)) ELSE LET PULSEW=0
END FUNCTION
EXTERNAL FUNCTION SQUAREW(X) !'方形波 SQUARE WAVE
LET SQUAREW=SGN(SIN(X))
END FUNCTION
EXTERNAL FUNCTION TRIANGLEW(X) !'三角波 TRIANGLE WAVE
LET NN=MOD(X,PI)
IF NN>PI/2 THEN LET NN=PI-NN
LET TRIANGLEW=NN/(PI/2)*SGN(SIN(X))
END FUNCTION
EXTERNAL FUNCTION SAW(X) !'のこぎり波
LET SAW=MOD(X,PI)/(PI/2)-1
END FUNCTION
EXTERNAL FUNCTION TRAPEZOIDALW(X) !'台形波 TRAPEZOIDAL WAVE
LET NN=X-INT(X/PI)*PI
IF NN>PI/2 THEN LET NN=PI-NN
LET TRAPEZOIDALW=MIN(1,MAX(-1,NN*SGN(SIN(X))) )
END FUNCTION
EXTERNAL FUNCTION STEPWISE(X,NN) !'階段状
LET STEPWISE=INT(NN*(SIN(X)+1))/NN-1
END FUNCTION
EXTERNAL FUNCTION WEIERSTRASS(X,N) !'ワイヤストラス
LET B=11
FOR I=0 TO N
LET S=S+.5^(I+1)*SIN(B^I*X)
NEXT I
LET WEIERSTRASS=S
END FUNCTION
EXTERNAL FUNCTION MKI$(A)
OPTION CHARACTER BYTE
DECLARE STRING A$,B$
IF A<0 THEN LET A=A+65536
LET A$=CHR$(MOD(A,256))
LET B$=CHR$(INT(A/256))
LET MKI$=A$ & B$
END FUNCTION
EXTERNAL FUNCTION MKL$(A)
OPTION CHARACTER BYTE
DECLARE STRING A$,B$,C$,D$
IF A<0 THEN LET A=A+2^32
LET A$=CHR$(MOD(A,256))
LET B$=CHR$(MOD(INT(A/256),256))
LET C$=CHR$(MOD(INT(A/65536),256))
LET D$=CHR$(MOD(INT(A/16777216),256))
LET MKL$=A$ & B$ & C$ & D$
END FUNCTION
|
|
|
投稿者:しばっち
投稿日:2011年11月13日(日)20時01分10秒
|
|
|
DTMF信号音の生成(ピッポッパッ音)
※できるだけ受話器とスピーカーを近づけて行ってください
※電話がかかれば、当然ながら通話料が発生します
※電話のかけ間違い? にご注意ください
http://ja.wikipedia.org/wiki/DTMF
OPTION CHARACTER BYTE
DIM LOFREQ(12),HIFREQ(12)
FOR I=1 TO 12
READ LOFREQ(I),HIFREQ(I) !'周波数(Hz)データ
NEXT I
DATA 697,1209 !'1
DATA 697,1336 !'2
DATA 697,1447 !'3
DATA 770,1209 !'4
DATA 770,1336 !'5
DATA 770,1447 !'6
DATA 852,1209 !'7
DATA 852,1336 !'8
DATA 852,1447 !'9
DATA 941,1336 !'0
DATA 941,1209 !'*
DATA 941,1447 !'#
LET CHANNEL=1
LET SAMPLEBIT=16
LET HEADERSIZE=16
LET WAVETYPE=1
LET SAMPLINGFREQ=22050 !'サンプリング周波数
LET SAMPLESIZE = SAMPLEBIT / 8 * CHANNEL
LET DATARATE = SAMPLESIZE * SAMPLINGFREQ
LET VOL=.95
LET LEVEL=2^(SAMPLEBIT-1)*VOL
!'LET PATH$="C:WINDOWS\TEMP\" !'作業用フォルダ、RAMディスクなど
LET TELNUM$="TEL 117" !'電話番号(時報) 兼ファイル名
LET SECOND1=.3 !'信号音継続時間(秒)
LET SECOND2=.1 !'区切り時間(秒)
FOR I=1 TO LEN(TELNUM$)
IF POS("0123456789*#",MID$(TELNUM$,I,1))>0 THEN LET NUM$=NUM$ & MID$(TELNUM$,I,1) !'電話番号のみを取り出す
NEXT I
LET SECOND=LEN(NUM$)*(SECOND1+SECOND2)
LET PCMSIZE=INT(DATARATE*SECOND)
LET WAVEFILESIZE = PCMSIZE + 36
OPEN #1:NAME PATH$ & TELNUM$ & ".wav"
ERASE #1
PRINT #1:"RIFF";
PRINT #1:MKL$(WAVEFILESIZE);
PRINT #1:"WAVEfmt ";
PRINT #1:MKL$(HEADERSIZE);
PRINT #1:MKI$(WAVETYPE);
PRINT #1:MKI$(CHANNEL);
PRINT #1:MKL$(SAMPLINGFREQ);
PRINT #1:MKL$(DATARATE);
PRINT #1:MKI$(SAMPLESIZE);
PRINT #1:MKI$(SAMPLEBIT);
PRINT #1:"data";
PRINT #1:MKL$(PCMSIZE);
FOR J=1 TO LEN(NUM$)
LET K=POS("1234567890*#",MID$(NUM$,J,1))
FOR I=0 TO INT(SAMPLINGFREQ*SECOND1)-1
LET DAT=LEVEL*(.5*SIN(LOFREQ(K)*I/SAMPLINGFREQ*2*PI)+.5*SIN(HIFREQ(K)*I/SAMPLINGFREQ*2*PI))
PRINT #1: MKI$(INT(DAT));
NEXT I
FOR I=0 TO INT(SAMPLINGFREQ*SECOND2)-1 !'無音(区切り)
PRINT #1: MKI$(0);
NEXT I
NEXT J
CLOSE #1
PLAYSOUND PATH$ & TELNUM$ & ".wav" !'再生
!'FILE DELETE PATH$ & TELNUM$ & ".wav"
END
EXTERNAL FUNCTION MKI$(A)
OPTION CHARACTER BYTE
DECLARE STRING A$,B$
IF A<0 THEN LET A=A+65536
LET A$=CHR$(MOD(A,256))
LET B$=CHR$(INT(A/256))
LET MKI$=A$ & B$
END FUNCTION
EXTERNAL FUNCTION MKL$(A)
OPTION CHARACTER BYTE
DECLARE STRING A$,B$,C$,D$
IF A<0 THEN LET A=A+2^32
LET A$=CHR$(MOD(A,256))
LET B$=CHR$(MOD(INT(A/256),256))
LET C$=CHR$(MOD(INT(A/65536),256))
LET D$=CHR$(MOD(INT(A/16777216),256))
LET MKL$=A$ & B$ & C$ & D$
END FUNCTION
|
|
|
投稿者:しばっち
投稿日:2011年11月13日(日)20時01分50秒
|
|
|
無限音階(シェパードトーン)
音程が上がり続けるように聞こえる(かな?)
http://www-antenna.ee.titech.ac.jp/~hira/hobby/edu/sonic_wave/sh_tone/index-j.html
DIM FREQ(7)
MAT READ FREQ
!' ド レ ミ ファ ソ ラ シ
DATA 261.626,293.665,329.628,349.228,195.998,220,246.942 !'各音の周波数(Hz) ※ソ、ラ、シはオクターブ下
!'LET PATH$="C:\WINDOWS\TEMP\" !'作業用フォルダ、RAMディスクなど
LET CHANNEL=1 !'モノラル
LET SAMPLEBIT=16 !'ビット数(-32768~32767)
LET HEADERSIZE=16
LET WAVETYPE=1
LET SAMPLINGFREQ=22050 !'サンプリング周波数
LET SAMPLESIZE = SAMPLEBIT / 8 * CHANNEL
LET DATARATE = SAMPLESIZE * SAMPLINGFREQ
LET VOL=.5 !'音量
LET LEVEL=2^(SAMPLEBIT-1)*VOL
LET N=3 !'ドレミファ・・・の繰り返し回数
LET SECOND=.5 !'各音の継続時間(0.5秒)
LET PCMSIZE=INT(DATARATE*SECOND*7*N)
LET WAVEFILESIZE = PCMSIZE + 36
OPEN #1:NAME PATH$ & "無限音階.wav"
ERASE #1
PRINT #1:"RIFF";
PRINT #1:MKL$(WAVEFILESIZE);
PRINT #1:"WAVEfmt ";
PRINT #1:MKL$(HEADERSIZE);
PRINT #1:MKI$(WAVETYPE);
PRINT #1:MKI$(CHANNEL);
PRINT #1:MKL$(SAMPLINGFREQ);
PRINT #1:MKL$(DATARATE);
PRINT #1:MKI$(SAMPLESIZE);
PRINT #1:MKI$(SAMPLEBIT);
PRINT #1:"data";
PRINT #1:MKL$(PCMSIZE);
FOR J=1 TO N
FOR I=1 TO 7
LET M=SAMPLINGFREQ*SECOND-1
FOR K=0 TO M
LET X=K/M
LET ENVELOPE=1-X^6
LET DAT=0
FOR L=1 TO 8
LET DAT=DAT+SIN(2^(L-3)*FREQ(I)*K/SAMPLINGFREQ*2*PI)/8
NEXT L
LET DAT=DAT*LEVEL*ENVELOPE
PRINT #1:MKI$(INT(DAT));
NEXT K
NEXT I
NEXT J
CLOSE #1
PLAYSOUND PATH$ & "無限音階.wav" !'再生
!'FILE DELETE PATH$ & "無限音階.wav"
END
EXTERNAL FUNCTION MKI$(A)
OPTION CHARACTER BYTE
DECLARE STRING A$,B$
IF A<0 THEN LET A=A+65536
LET A$=CHR$(MOD(A,256))
LET B$=CHR$(INT(A/256))
LET MKI$=A$ & B$
END FUNCTION
EXTERNAL FUNCTION MKL$(A)
OPTION CHARACTER BYTE
DECLARE STRING A$,B$,C$,D$
IF A<0 THEN LET A=A+2^32
LET A$=CHR$(MOD(A,256))
LET B$=CHR$(MOD(INT(A/256),256))
LET C$=CHR$(MOD(INT(A/65536),256))
LET D$=CHR$(MOD(INT(A/16777216),256))
LET MKL$=A$ & B$ & C$ & D$
END FUNCTION
|
|
|
投稿者:しばっち
投稿日:2011年11月13日(日)20時02分43秒
|
|
|
OPTION CHARACTER BYTE
LET CHANNEL=1 !'モノラル
LET SAMPLEBIT=16 !'ビット数
LET HEADERSIZE=16
LET WAVETYPE=1
!'LET PATH$="C:\WINDOWS\TEMP\" !'作業用フォルダ、RAMディスクなど
LET SAMPLINGFREQ=16000 !'サンプリング周波数
LET TEMPO=80 !'テンポ
DO
READ IF MISSING THEN EXIT DO:A$,T$
LET PLAYTIME=PLAYTIME+LENGTH(T$) !'演奏時間(秒)
LOOP
LET SAMPLESIZE = SAMPLEBIT / 8 * CHANNEL
LET DATARATE = SAMPLESIZE * SAMPLINGFREQ
LET VOL=.5 !'音量
LET LEVEL=2^(SAMPLEBIT-1)*VOL
LET PCMSIZE=INT(DATARATE*PLAYTIME)
LET WAVEFILESIZE = PCMSIZE + 36
OPEN #1:NAME PATH$ & "故郷.wav"
ERASE #1
PRINT #1:"RIFF";
PRINT #1:MKL$(WAVEFILESIZE);
PRINT #1:"WAVEfmt ";
PRINT #1:MKL$(HEADERSIZE);
PRINT #1:MKI$(WAVETYPE);
PRINT #1:MKI$(CHANNEL);
PRINT #1:MKL$(SAMPLINGFREQ);
PRINT #1:MKL$(DATARATE);
PRINT #1:MKI$(SAMPLESIZE);
PRINT #1:MKI$(SAMPLEBIT);
PRINT #1:"data";
PRINT #1:MKL$(PCMSIZE);
RESTORE
DO
READ IF MISSING THEN EXIT DO:A$,T$
LET FREQ=GETFREQ(A$)
LET M=SAMPLINGFREQ*LENGTH(T$)-1 !'※Mが整数であること(非整数になる場合、再生エラーとなる可能性あり)
FOR J=0 TO M
LET X=J/M
LET ENVELOPE=1-X^6
LET DAT=LEVEL*SIN(J*FREQ/SAMPLINGFREQ*2*PI)*ENVELOPE
PRINT #1:MKI$(INT(DAT));
NEXT J
LOOP
DATA C,4,C,4,C,4,D,4.,E,8,D,4,E,4,E,4,F,4,G,2,R,4
DATA F,4,G,4,A,4,E,4.,F,8,E,4,D,4,D,4,-B,4,C,2,R,4
DATA D,8,C,8,D,4,-G,4,C,8,D,8,E,4,E,4,F,8,E,8,F,4.,A,8
DATA G,8,F,8,E,4,R,4,G,4,G,4,G,4,C,4.,D,8,E,4,F,4,F,4,D,4,C,2,R,4
CLOSE #1
PLAYSOUND PATH$ & "故郷.wav" !'再生
!'FILE DELETE PATH$ & "故郷.wav"
FUNCTION LENGTH(T$)
SELECT CASE T$
CASE "2" !'2分音符
LET LENGTH=60/TEMPO*2
CASE "2." !'付点2分音符
LET LENGTH=60/TEMPO*2+60/TEMPO
CASE "4" !'4分音符
LET LENGTH=60/TEMPO
CASE "4." !'付点4分音符
LET LENGTH=60/TEMPO+60/TEMPO/2
CASE "8"
LET LENGTH=60/TEMPO/2
CASE "8."
LET LENGTH=60/TEMPO/2+60/TEMPO/4
CASE "16"
LET LENGTH=60/TEMPO/4
END SELECT
END FUNCTION
END
EXTERNAL FUNCTION GETFREQ(KEY$) !'音名 → 周波数(Hz)
RESTORE
DO
READ K$,FREQ
IF KEY$=K$ THEN
LET GETFREQ=FREQ
EXIT FUNCTION
END IF
LOOP
DATA -C,130.813,-D,146.832,-E,164.814,-F,174.614,-G,195.998,-A,220,-B,246.942
DATA C,261.626,D,293.665,E,329.628,F,349.228,G,391.996,A,440,B,493.884
DATA +C,523.251,+D,587.33,+E,659.255,+F,698.456,+G,783.991,+A,880,R,0
END FUNCTION
EXTERNAL FUNCTION MKI$(A)
OPTION CHARACTER BYTE
DECLARE STRING A$,B$
IF A<0 THEN LET A=A+65536
LET A$=CHR$(MOD(A,256))
LET B$=CHR$(INT(A/256))
LET MKI$=A$ & B$
END FUNCTION
EXTERNAL FUNCTION MKL$(A)
OPTION CHARACTER BYTE
DECLARE STRING A$,B$,C$,D$
IF A<0 THEN LET A=A+2^32
LET A$=CHR$(MOD(A,256))
LET B$=CHR$(MOD(INT(A/256),256))
LET C$=CHR$(MOD(INT(A/65536),256))
LET D$=CHR$(MOD(INT(A/16777216),256))
LET MKL$=A$ & B$ & C$ & D$
END FUNCTION
|
|
|
投稿者:しばっち
投稿日:2011年11月13日(日)20時03分34秒
|
|
|
「埴生の宿」
差し替えデータのみ
該当部分を書き換えてください
LET TEMPO=120
DATA C,4,E,4.,F,8,F,4.,G,8,G,2,E,4,G,4,F,4.,E,8,F,4,D,4,E,2,R,4
DATA C,4,E,4.,F,8,F,4.,G,8,G,2,E,4,G,4,F,4.,E,8,F,4,D,4,C,2,R,4
DATA G,4,+C,4.,B,8,A,4.,G,8,G,2,E,4,G,4,F,4.,E,8,F,4,D,4
DATA E,2,R,4,G,4,+C,4.,B,8,A,4.,G,8,G,2,E,4,G,4,G,2,F,4,D,4,C,2.,R,4
DATA G,2.,R,4,F,2,D,2,C,2,D,2,E,2,R,4,G,4,+C,4.,B,8,A,4.
DATA G,8,G,2,E,4,G,4,G,4,A,4,F,4,D,4,C,2.,R,4
|
|
|
投稿者:しばっち
投稿日:2011年11月13日(日)20時04分15秒
|
|
|
「歓びのうた」
差し替えデータのみ
該当部分を書き換えてください
LET TEMPO=120
DATA E,4,E,4,F,4,G,4,G,4,F,4,E,4,D,4,C,4,C,4,D,4,E,4,E,4.,D,8,D,4.,R,8
DATA E,4,E,4,F,4,G,4,G,4,F,4,E,4,D,4,C,4,C,4,D,4,E,4,D,4.,C,8,C,4.,R,8
DATA D,2,E,4,C,4,D,4,E,8,F,8,E,4,C,4,D,4,E,8,F,8,E,4,D,4,C,4,D,4,-G,8,R,8
DATA E,2,E,4,F,4,G,4,G,4,F,4,E,4,D,4,C,4,C,4,D,4,E,4,D,4.,C,8,C,8,G,8,F,8,E,8
DATA D,2,E,4,C,4,D,4,E,8,F,8,E,4,C,4,D,4,E,8,F,8,E,4,D,4,C,4,D,4,-G,8,R,8,E,2
DATA E,4,F,4,G,4,G,4,F,4,E,4,D,4,C,4,C,4,D,4,E,4,D,4.,C,8,C,2
|
|
|
投稿者:しばっち
投稿日:2011年11月13日(日)20時04分51秒
|
|
|
直角三角形ABCにおいて
C/A=SIN(θ)
B/A=COS(θ)とする
A/(A+B+C),B/(A+B+C),C/(A+B+C)を求める
(A)/(A+B+C)→(A/A)/(A/A+B/A+C/A)→1/(1+COS(θ)+SIN(θ))
DIM A$(3),B$(3)
FOR I=1 TO 3
READ A$(I),B$(I)
NEXT I
DATA "A","A+B+C"
DATA "B","A+B+C"
DATA "C","A+B+C"
PRINT REPEAT$(" ",8);
FOR I=1 TO 3
PRINT "(";A$(I);")/(";B$(I);")";REPEAT$(" ",12);
NEXT I
PRINT
FOR TH=0 TO 360
PRINT TH;"° ";
FOR I=1 TO 3
CALL CALC(A$(I),B$(I),RAD(TH))
NEXT I
PRINT
NEXT TH
END
EXTERNAL SUB CALC(A$,B$,TH)
WHEN EXCEPTION IN
LET K$=STR$(CALCSUB(A$,TH)/CALCSUB(B$,TH))
PRINT LEFT$(K$ & REPEAT$(" ",23),23);
USE
PRINT " ERROR!! ";
END WHEN
END SUB
EXTERNAL FUNCTION CALCSUB(E$,TH)
SELECT CASE UCASE$(E$)
CASE "A"
LET CALCSUB=1
CASE "B"
LET CALCSUB=COS(TH)
CASE "C"
LET CALCSUB=SIN(TH)
CASE "A+B"
LET CALCSUB=1+COS(TH)
CASE "A+C"
LET CALCSUB=1+SIN(TH)
CASE "B+C"
LET CALCSUB=SIN(TH)+COS(TH)
CASE "A+B+C"
LET CALCSUB=1+SIN(TH)+COS(TH)
END SELECT
END FUNCTION
|
|
|
投稿者:しばっち
投稿日:2011年11月13日(日)20時05分38秒
|
|
|
ローマ字 to 平仮名変換
DIM ROME$(500), NIHON$(500)
DO
LET K = K + 1
READ ROME$(K), NIHON$(K)
LOOP UNTIL ROME$(K)=""
CALL SORT(ROME$, NIHON$, K)
INPUT PROMPT "文字列=": A$
!'LET A$="shibacchi"
LET A$ = UCASE$(A$)
DO
LET A$ = LTRIM$(A$)
FOR J=4 TO 1 STEP -1
LET AA$=LEFT$(A$,J)
FOR I = 1 TO K
IF AA$ = ROME$(I) THEN
PRINT NIHON$(I);
IF J=2 AND POS("BB CC DD FF GG HH JJ KK PP SS TT ZZ", AA$)<>0 THEN
LET A$ = MID$(A$, 2,LEN(A$)-1)
EXIT FOR
END IF
LET A$ = RIGHT$(A$, LEN(A$)-J)
EXIT FOR
END IF
NEXT I
IF I<=K THEN EXIT FOR
NEXT J
LOOP UNTIL A$ = ""
DATA A,あ,I,い,U,う,E,え,O,お
DATA BA,ば,BI,び,BU,ぶ,BE,べ,BO,ぼ
DATA CA,か,CI,ち,CU,く,CE,せ,CO,こ
DATA DA,だ,DI,ぢ,DU,づ,DE,で,DO,ど,TZU,づ
DATA FA,ふぁ,FI,ふぃ,FU,ふ,FE,ふぇ,FO,ふぉ
DATA GA,が,GI,ぎ,GU,ぐ,GE,げ,GO,ご
DATA HA,は,HI,ひ,HU,ふ,HE,へ,HO,ほ
DATA JA,じゃ,JI,じぃ,JU,じゅ,JE,じぇ,JO,じょ
DATA KA,か,KI,き,KU,く,KE,け,KO,こ
DATA LA,ら,LI,り,LU,る,LE,れ,LO,ろ
DATA MA,ま,MI,み,MU,む,MU,め,MO,も
DATA NA,な,NI,に,NU,ぬ,NE,ね,NO,の
DATA PA,ぱ,PI,ぴ,PU,ぷ,PE,ぺ,PO,ぽ
DATA QA,くぁ,QI,くぃ,QU,くぅ,QE,くぇ,QO,くぉ
DATA RA,ら,RI,り,RU,る,RE,れ,RO,ろ
DATA SA,さ,SI,し,SU,す,SE,せ,SO,そ
DATA TA,た,TI,ち,TU,つ,TE,て,TO,と
DATA YA,や,YI,ゐ,YU,ゆ,YE,ゑ,YO,よ
DATA VA,ヴァ,VI,ヴィ,VU,ぶ,VE,ヴェ,VO,ヴォ
DATA WA,わ,WI,うぃ,WU,う,WE,うぇ,WO,を
DATA XA,ざぁ,XI,じぃ,XU,ずぅ,XE,ぜぇ,XO,ぞぉ
DATA ZA,ざ,ZI,じ,ZU,ず,ZE,ぜ,ZO,ぞ
DATA N,ん,NQ,ん,Q,ん,NX,ん,XN,ん
DATA BYA,びゃ,BYI,びぃ,BYU,びゅ,BYE,びぇ,BYO,びょ
DATA GYA,ぎゃ,GYI,ぎぃ,GYU,ぎゅ,GYE,ぎぇ,GYO,ぎょ
DATA HYA,ひゃ,HYI,ひぃ,HYU,ひゅ,HYE,ひぇ,HYO,ひょ
DATA JYA,じゃ,JYI,じぃ,JYU,じゅ,JYE,じぇ,JYO,じょ
DATA KYA,きゃ,KYI,きぃ,KYU,きゅ,KYE,きぇ,KYO,きょ
DATA MYA,みゃ,MYI,みぃ,MYU,みゅ,MYE,みぇ,MYO,みょ
DATA NYA,にゃ,NYI,にぃ,NYU,にゅ,NYE,にぇ,NYO,にょ
DATA PYA,ぴゃ,PYI,ぴぃ,PYU,ぴゅ,PYE,ぴぇ,PYO,ぴょ
DATA RYA,りゃ,RYI,りぃ,RYU,りゅ,RYE,りぇ,RYO,りょ
DATA SYA,しゃ,SYI,しぃ,SYU,しゅ,SYE,しぇ,SYO,しょ
DATA TYA,ちゃ,TYI,ちぃ,TYU,ちゅ,TYE,ちぇ,TYO,ちょ
DATA ZYA,じゃ,ZYI,じぃ,ZYU,じゅ,ZYE,じぇ,ZYO,じょ
DATA BHA,びぁ,BHI,びぃ,BHU,びゅ,BHE,びぇ,BHO,びょ
DATA CHA,ちぁ,CHI,ち,CHU,ちゅ,CHE,ちぇ,CHO,ちょ
DATA PHA,ふぁ,PHI,ふぃ,PHU,ふぅ,PHE,ふぇ,PHO,ふょ
DATA SHA,しゃ,SHI,し,SHU,しゅ,SHE,しぇ,SHO,しょ
DATA TSA,つぁ,TSI,つぃ,TSU,つ,TSE,つぇ,TSO,つぉ
DATA LTU,っ,XTU,っ,LTSU,っ,XTU,っ,XTSU,っ
DATA WRI,らい,XY,っくし,CK,っく,TCHI,っち
DATA BB,っ,CC,っ,DD,っ,FF,っ,GG,っ,HH,っ,JJ,っ,KK,っ,PP,っ,SS,っ,TT,っ,ZZ,っ
DATA LKA,カ,XKA,カ,LKE,ケ,XKE,ケ,X,っくす
DATA "",""
END
EXTERNAL SUB SORT (A$(), B$(), N)
FOR I=1 TO N-1
FOR J=I+1 TO N
IF A$(I)>A$(J) THEN
SWAP A$(I), A$(J)
SWAP B$(I), B$(J)
END IF
NEXT J
NEXT I
END SUB
|
|
|
投稿者:しばっち
投稿日:2011年11月13日(日)20時06分51秒
|
|
|
魔方陣(奇数 魔方陣のみ)
N * N 方陣において1~N^2までの数字を全て使用し、各縦、横、斜めの列の和が全て同じ
DIM A(19, 19)
FOR N=3 TO 19 STEP 2
LET X = INT(N / 2) + 1
LET A(X, 1) = 1
LET I = 2
LET Y = N + 1
DO
IF X = N THEN LET X = 1 ELSE LET X = X + 1
IF Y = 1 THEN LET Y = N ELSE LET Y = Y - 1
IF A(X, Y) <> 0 THEN
LET Y = Y + 2
LET X = X - 1
END IF
DO
LET A(X, Y) = I
IF X = N AND Y = 1 THEN
LET Y = Y + 1
LET I = I + 1
ELSE
EXIT DO
END IF
LOOP
IF I = N * N THEN EXIT DO
LET I = I + 1
LOOP
PRINT N; " * "; N; " 魔方陣"
FOR Y = 1 TO N
FOR X = 1 TO N
PRINT USING "#####": A(X, Y);
NEXT X
PRINT
NEXT Y
MAT A=ZER
NEXT N
END
|
|
|
投稿者:しばっち
投稿日:2011年11月13日(日)20時07分45秒
|
|
|
魔方陣(4*N 魔方陣)
OPTION BASE 0
DIM A(27, 27)
FOR L=4 TO 24 STEP 4
FOR M = 0 TO L / 4
FOR N = 0 TO L / 4
LET A(4 * N, 4 * M) = 1
LET A(4 * N + 1, 4 * M) = 1
LET A(4 * N + 1, 4 * M + 1) = 1
LET A(4 * N, 4 * M + 1) = 1
LET A(4 * N + 2, 4 * M + 2) = 1
LET A(4 * N + 3, 4 * M + 2) = 1
LET A(4 * N + 2, 4 * M + 3) = 1
LET A(4 * N + 3, 4 * M + 3) = 1
NEXT N
NEXT M
FOR Y = 1 TO L
FOR X = 1 TO L
IF A(X, Y) = 1 THEN LET A(X, Y) = L * (Y - 1) + X ELSE LET A(X, Y) = L * L - (L * (Y - 1) + X - 1)
NEXT X
NEXT Y
PRINT L; " * "; L; " 魔方陣"
FOR Y = 1 TO L
FOR X = 1 TO L
PRINT USING "#####": A(X,Y);
NEXT X
PRINT
NEXT Y
PRINT
MAT A=ZER
NEXT L
END
|
|
|
投稿者:しばっち
投稿日:2011年11月13日(日)20時08分25秒
|
|
|
魔方陣(4*N+2 魔方陣)
OPTION BASE 0
DIM A(30,30)
FOR N=6 TO 30 STEP 4
LET K = N * 2 - 2
FOR I = 1 TO N - 2
FOR J = 1 TO N-2
IF BITAND(I,2) = BITAND(J,2) THEN
LET K=K+1
LET A(I,J) = K
ELSE
LET K=K+1
LET A(N - 1 - I,N - 1 - J) = K
END IF
NEXT J
NEXT I
LET SUM = N * N + 1
LET A(0,0)=N-2
LET A(N - 1,N - 1) = SUM - (N-2)
LET A(0,N - 1)=N-1
LET A(N - 1,0) = SUM - (N-1)
LET A(0,N - 2) = SUM - 2 * N + 3
LET A(N - 1,N - 2) = SUM - (SUM-2*N+3)
LET A(N - 2,0)= 2 * N - 2
LET A(N - 2,N - 1) = SUM - (2*N-2)
FOR I = 1 TO N - 3
IF BITAND(I, 2) = 0 THEN LET J= 0 ELSE LET J= N - 1
LET A(J,I) = N - 2 - I
LET A(N - 1 -J,I) = SUM - (N-2-I)
LET A(I,J) = N - 1 + I
LET A(I,N - 1 -J) = SUM - (N-1+I)
NEXT I
PRINT N; " * "; N; " 魔方陣"
FOR I=0 TO N-1
FOR J=0 TO N-1
PRINT USING" ####":A(I,J);
NEXT J
PRINT
NEXT I
PRINT
NEXT N
END
|
|
|
投稿者:しばっち
投稿日:2011年11月13日(日)20時09分4秒
|
|
|
魔星陣? (魔方陣の星型版)
FOR A = 1 TO 12
FOR B = 1 TO 12
IF A = B THEN GOTO 60
FOR C = 1 TO 12
IF A = C OR B = C THEN GOTO 50
FOR D = 1 TO 12
IF A = D OR B = D OR C = D THEN GOTO 40
LET E = 26 - D - C - B
IF E < 1 THEN EXIT FOR
IF E > 12 THEN GOTO 40
IF A = E OR B = E OR C = E OR D = E THEN GOTO 40
FOR F = 1 TO 12
IF A = F OR B = F OR C = F OR D = F OR E = F THEN GOTO 30
LET H = 26 - A - C - F
IF H < 1 THEN EXIT FOR
IF H > 12 THEN GOTO 30
IF A = H OR B = H OR C = H OR D = H OR E = H OR F = H THEN GOTO 30
FOR I = 1 TO 12
IF A = I OR B = I OR C = I OR D = I OR E = I OR F = I OR H = I THEN GOTO 20
LET L = 26 - B - F - I
IF L < 1 THEN EXIT FOR
IF L > 12 THEN GOTO 20
IF A = L OR B = L OR C = L OR D = L OR E = L OR F = L OR H = L OR I = L THEN GOTO 20
FOR G = 1 TO 12
IF A = G OR B = G OR C = G OR D = G OR E = G OR F = G OR H = G OR I = G OR L = G THEN GOTO 10
LET K = 26 - A - D - G
IF K < 1 THEN EXIT FOR
IF K > 12 THEN GOTO 10
IF A = K OR B = K OR C = K OR D = K OR E = K OR F = K OR H = K OR I = K OR L = K OR G = K THEN GOTO 10
LET J = 26 - H - I - K
IF J < 1 THEN GOTO 10
IF J > 12 THEN GOTO 10
IF A = J OR B = J OR C = J OR D = J OR E = J OR F = J OR H = J OR I = J OR L = J OR G = J OR K = J THEN GOTO 10
LET NO = NO + 1
PRINT "No."; NO
PRINT USING " ##":A
PRINT USING "## ## ## ##":B,C,D,E
PRINT USING " ## ##":F,G
PRINT USING "## ## ## ##":H,I,J,K
PRINT USING " ##":L
10 NEXT G
20 NEXT I
30 NEXT F
40 NEXT D
50 NEXT C
60 NEXT B
70 NEXT A
END
|
|
|
投稿者:しばっち
投稿日:2011年11月13日(日)20時09分46秒
|
|
|
魔六角陣? (魔方陣の六角形版)
FOR A = 1 TO 19
FOR B = 1 TO 19
IF A = B THEN GOTO 20
LET C = 38 - A - B
IF C > 19 THEN GOTO 20
IF C < 1 THEN EXIT FOR
IF C = A OR C = B THEN GOTO 20
FOR D = 1 TO 19
IF A = D OR B = D OR C = D THEN GOTO 40
LET H = 38 - A - D
IF H > 19 THEN GOTO 40
IF H < 1 THEN EXIT FOR
IF H = A OR H = B OR H = C OR H = D THEN GOTO 40
FOR E = 1 TO 19
IF A = E OR B = E OR C = E OR D = E OR H = E THEN GOTO 50
FOR F = 1 TO 19
IF A = F OR B = F OR C = F OR D = F OR H = F OR E = F THEN GOTO 60
LET G = 38 - D - E - F
IF G < 1 THEN EXIT FOR
IF G > 19 THEN GOTO 60
IF A = G OR B = G OR C = G OR D = G OR H = G OR E = G OR F = G THEN GOTO 60
LET L = 38 - C - G
IF L < 1 OR L > 19 THEN GOTO 60
IF A = L OR B = L OR C = L OR D = L OR H = L OR E = L OR F = L OR G = L THEN GOTO 60
FOR I = 1 TO 19
IF A = I OR B = I OR C = I OR D = I OR H = I OR E = I OR F = I OR G = I OR L = I THEN GOTO 70
LET M = 38 - B - E - I
IF M < 1 THEN EXIT FOR
IF M > 19 THEN GOTO 70
IF A = M OR B = M OR C = M OR D = M OR H = M OR E = M OR F = M OR G = M OR L = M OR I = M THEN GOTO 70
FOR J = 1 TO 19
IF A = J OR B = J OR C = J OR D = J OR H = J OR E = J OR F = J OR G = J OR L = J OR I = J OR M = J THEN GOTO 80
FOR K = 1 TO 19
IF A = K OR B = K OR C = K OR D = K OR H = K OR E = K OR F = K OR G = K OR L = K OR I = K OR M = K OR J = K THEN GOTO 90
!'IF H + I + J + K + L > 38 THEN EXIT FOR
IF H + I + J + K + L <> 38 THEN GOTO 90
LET P = 38 - B - F - K
IF P < 1 THEN EXIT FOR
IF P > 19 THEN GOTO 90
IF A = P OR B = P OR C = P OR D = P OR H = P OR E = P OR F = P OR G = P OR L = P OR I = P OR M = P OR K = P OR J = P THEN GOTO 90
FOR N = 1 TO 19
IF A = N OR B = N OR C = N OR D = N OR H = N OR E = N OR F = N OR G = N OR L = N OR I = N OR M = N OR K = N OR P = N OR J = N THEN GOTO 100
LET R = 38 - D - I - N
IF R < 1 THEN EXIT FOR
IF R > 19 THEN GOTO 100
IF A = R OR B = R OR C = R OR D = R OR H = R OR E = R OR F = R OR G = R OR L = R OR I = R OR M = R OR K = R OR P = R OR N = R OR J = R THEN GOTO 100
LET Q = 38 - C - F - J - N
IF Q < 1 THEN EXIT FOR
IF Q > 19 THEN GOTO 100
IF H + M + Q <> 38 THEN GOTO 100
IF A = Q OR B = Q OR C = Q OR D = Q OR H = Q OR E = Q OR F = Q OR G = Q OR L = Q OR I = Q OR M = Q OR K = Q OR P = Q OR N = Q OR R = Q OR J = Q THEN GOTO 100
LET O = 38 - G - K - R
IF O < 1 OR O > 19 THEN GOTO 100
IF M + N + O + P <> 38 THEN GOTO 100
IF A = O OR B = O OR C = O OR D = O OR H = O OR E = O OR F = O OR G = O OR L = O OR I = O OR M = O OR K = O OR P = O OR N = O OR R = O OR Q = O OR J = O THEN GOTO 100
LET S = 38 - Q - R
IF S < 1 OR S > 19 THEN GOTO 100
IF L + P + S <> 38 THEN GOTO 100
IF A + E + J + O + S <> 38 THEN GOTO 100
IF A = S OR B = S OR C = S OR D = S OR H = S OR E = S OR F = S OR G = S OR L = S OR I = S OR M = S OR K = S OR P = S OR N = S OR R = S OR Q = S OR O = S OR J = S THEN GOTO 100
LET NO = NO + 1
PRINT "No."; NO
PRINT USING " ## ## ## ": A, B, C
PRINT USING " ## ## ## ## ": D, E, F, G
PRINT USING "## ## ## ## ##": H, I, J, K, L
PRINT USING " ## ## ## ## ": M, N, O, P
PRINT USING " ## ## ## ": Q, R, S
100 NEXT N
90 NEXT K
80 NEXT J
70 NEXT I
60 NEXT F
50 NEXT E
40 NEXT D
20 NEXT B
10 NEXT A
END
|
|
|
投稿者:しばっち
投稿日:2011年11月13日(日)20時10分28秒
|
|
|
画像スライドショー
LET PATH$="D:\My Pictures" !'画像フォルダを指定すること
LET PT$=PATH$ & "\*.*"
LET NN=FILES(PT$)
IF NN>0 THEN
DIM N$(NN),P$(NN),NAME$(NN),EXT$(NN)
FILE LIST PT$, N$
ELSE
STOP
END IF
FOR I=1 TO NN
FILE SPLITNAME(N$(I)) P$(I),NAME$(I),EXT$(I)
IF POS(".JPG.BMP.GIF",UCASE$(EXT$(I)))=0 THEN
LET NAME$(I)=""
LET P$(I)=""
LET EXT$(I)=""
ELSE
LET NUM=NUM+1
END IF
NEXT I
FOR I=1 TO NN
IF NAME$(I)<>"" THEN
WHEN EXCEPTION IN
CALL PICTURELOAD(PATH$ & "\" & NAME$(I) & EXT$(I),XSIZE,YSIZE)
LET K=K+1
PRINT K;"/";NUM;NAME$(I) & EXT$(I);XSIZE;"*";YSIZE
WAIT DELAY 3 !'表示時間(秒)
USE
PRINT "READ ERROR !! ";NAME$(I) & EXT$(I)
END WHEN
END IF
NEXT I
END
EXTERNAL SUB PICTURELOAD(N$,XSIZE,YSIZE)
SET COLOR MODE "NATIVE"
CLEAR
SET POINT STYLE 1
GLOAD N$
LET XSIZE=PIXELX(1)
LET YSIZE=PIXELY(1)
SET BITMAP SIZE XSIZE,YSIZE
SET WINDOW 0,XSIZE-1,YSIZE-1,0
END SUB
|
|
|
投稿者:しばっち
投稿日:2011年11月13日(日)20時11分39秒
|
|
|
3項論理演算
FOR C=0 TO 1
FOR B=0 TO 1
FOR A=0 TO 1
PRINT A;"-";B;"-";C,
PRINT BIT1(A,B,C);
PRINT BIT2(A,B,C);
PRINT BIT3(A,B,C);
PRINT BIT12(A,B,C);
PRINT BIT23(A,B,C);
PRINT BIT123(A,B,C)
NEXT A
NEXT B
NEXT C
END
EXTERNAL FUNCTION BIT0 (A, B, C)
!'0-0-0 1
!'0-0-1 0
!'0-1-0 0
!'0-1-1 0
!'1-0-0 0
!'1-0-1 0
!'1-1-0 0
!'1-1-1 0
LET BIT0 =BITNOT(BIT123(A, B, C))
END FUNCTION
EXTERNAL FUNCTION BIT1 (A, B, C)
!'0-0-0 0
!'0-0-1 1
!'0-1-0 1
!'0-1-1 0
!'1-0-0 1
!'1-0-1 0
!'1-1-0 0
!'1-1-1 0
LET BIT1 = BITXOR(BITOR(BITOR(BITXOR(A,B),BITXOR(B,C)),BITXOR(C,A)),BIT2(A, B, C))
END FUNCTION
EXTERNAL FUNCTION BIT2 (A, B, C)
!'0-0-0 0
!'0-0-1 0
!'0-1-0 0
!'0-1-1 1
!'1-0-0 0
!'1-0-1 1
!'1-1-0 1
!'1-1-1 0
LET BIT2 = BITXOR(BIT23(A, B, C),BIT3(A, B, C))
END FUNCTION
EXTERNAL FUNCTION BIT3 (A, B, C)
!'0-0-0 0
!'0-0-1 0
!'0-1-0 0
!'0-1-1 0
!'1-0-0 0
!'1-0-1 0
!'1-1-0 0
!'1-1-1 1
LET BIT3 = BITAND(BITAND(A,B),C)
END FUNCTION
EXTERNAL FUNCTION BIT01 (A, B, C)
!'0-0-0 1
!'0-0-1 1
!'0-1-0 1
!'0-1-1 0
!'1-0-0 1
!'1-0-1 0
!'1-1-0 0
!'1-1-1 0
LET BIT01 =BITNOT (BIT23(A, B, C))
END FUNCTION
EXTERNAL FUNCTION BIT02 (A, B, C)
!'0-0-0 1
!'0-0-1 0
!'0-1-0 0
!'0-1-1 1
!'1-0-0 0
!'1-0-1 1
!'1-1-0 1
!'1-1-1 0
LET BIT02 =BITNOT (BIT13(A, B, C))
END FUNCTION
EXTERNAL FUNCTION BIT03 (A, B, C)
!'0-0-0 1
!'0-0-1 0
!'0-1-0 0
!'0-1-1 0
!'1-0-0 0
!'1-0-1 0
!'1-1-0 0
!'1-1-1 1
LET BIT03 =BITNOT (BIT12(A, B, C))
END FUNCTION
EXTERNAL FUNCTION BIT12 (A, B, C)
!'0-0-0 0
!'0-0-1 1
!'0-1-0 1
!'0-1-1 1
!'1-0-0 1
!'1-0-1 1
!'1-1-0 1
!'1-1-1 0
LET BIT12 = BITOR(BIT1(A, B, C),BIT2(A, B, C))
END FUNCTION
EXTERNAL FUNCTION BIT13 (A, B, C)
!'0-0-0 0
!'0-0-1 1
!'0-1-0 1
!'0-1-1 0
!'1-0-0 1
!'1-0-1 0
!'1-1-0 0
!'1-1-1 1
LET BIT13 = BITOR(BIT1(A, B, C),BIT3(A, B, C))
END FUNCTION
EXTERNAL FUNCTION BIT23 (A, B, C)
!'0-0-0 0
!'0-0-1 0
!'0-1-0 0
!'0-1-1 1
!'1-0-0 0
!'1-0-1 1
!'1-1-0 1
!'1-1-1 1
LET BIT23 = BITOR(BITOR(BITAND(A,B),BITAND(B,C)),BITAND(C,A))
END FUNCTION
EXTERNAL FUNCTION BIT123 (A, B, C)
!'0-0-0 0
!'0-0-1 1
!'0-1-0 1
!'0-1-1 1
!'1-0-0 1
!'1-0-1 1
!'1-1-0 1
!'1-1-1 1
LET BIT123 = BITOR(BITOR(A,B),C)
END FUNCTION
EXTERNAL FUNCTION BIT023 (A, B, C)
!'0-0-0 1
!'0-0-1 0
!'0-1-0 0
!'0-1-1 1
!'1-0-0 0
!'1-0-1 1
!'1-1-0 1
!'1-1-1 1
LET BIT023 =BITNOT(BIT1(A,B,C))
END FUNCTION
EXTERNAL FUNCTION BIT013 (A, B, C)
!'0-0-0 1
!'0-0-1 1
!'0-1-0 1
!'0-1-1 0
!'1-0-0 1
!'1-0-1 0
!'1-1-0 0
!'1-1-1 1
LET BIT013 =BITNOT(BIT2(A,B,C))
END FUNCTION
EXTERNAL FUNCTION BIT012 (A, B, C)
!'0-0-0 1
!'0-0-1 1
!'0-1-0 1
!'0-1-1 1
!'1-0-0 1
!'1-0-1 1
!'1-1-0 1
!'1-1-1 0
LET BIT012 =BITNOT(BIT3(A,B,C))
END FUNCTION
|
|
|
投稿者:しばっち
投稿日:2011年11月13日(日)20時12分37秒
|
|
|
関数をいくつか定義してみました(※エラー処理なし)
EXTERNAL FUNCTION SEC(X)
LET SEC=1/COS(X) !'secant
END FUNCTION
EXTERNAL FUNCTION COSEC(X)
LET COSEC=1/SIN(X) !'cosecant
END FUNCTION
EXTERNAL FUNCTION COTAN(X)
LET COTAN=1/TAN(X) !'cotangent
END FUNCTION
EXTERNAL FUNCTION ARCSIN(X)
LET ARCSIN=ATN(X/SQR(1-X*X)) !'arcsine
END FUNCTION
EXTERNAL FUNCTION ARCCOS(X)
LET ARCCOS=-ATN(X/SQR(1-X*X))+PI/2 !'arccosine
END FUNCTION
EXTERNAL FUNCTION ARCSEC(X)
LET ARCSEC=ATN(SQR(X*X-1))+(SGN(X)-1)*PI/2 !'arcsecant
END FUNCTION
EXTERNAL FUNCTION ARCSEC2(X)
LET ARCSEC2=ACOS(1/X)
END FUNCTION
EXTERNAL FUNCTION ARCCOSEC(X)
LET ARCCOSEC=ATN(1/SQR(X*X-1))+(SGN(X)-1)*PI/2 !'arccosecant
END FUNCTION
EXTERNAL FUNCTION ARCCOSEC2(X)
LET ARCCOSEC2=ASIN(1/X)
END FUNCTION
EXTERNAL FUNCTION ARCCOTAN(X)
LET ARCCOTAN=-ATN(X)+PI/2 !'arccotangent
END FUNCTION
EXTERNAL FUNCTION ARCCOTAN2(X)
LET ARCCOTAN=ATN(1/X)
END FUNCTION
EXTERNAL FUNCTION SINH(X)
LET SINH=(EXP(X)-EXP(-X))/2 !'hyperbolic sine
END FUNCTION
EXTERNAL FUNCTION COSH(X)
LET COSH=(EXP(X)+EXP(-X))/2 !'hyperbolic cosine
END FUNCTION
EXTERNAL FUNCTION TANH(X)
LET TANH=-EXP(-X)/(EXP(X)+EXP(-X))*2+1 !'hyperbolic tangent
END FUNCTION
EXTERNAL FUNCTION TANH2(X)
LET TANH2=SINH(X)/COSH(X)
END FUNCTION
EXTERNAL FUNCTION SECH(X)
LET SECH=2/(EXP(X)+EXP(-X)) !'hyperbolic secant
END FUNCTION
EXTERNAL FUNCTION SECH2(X)
LET SECH2=1/COSH(X)
END FUNCTION
EXTERNAL FUNCTION COSECH(X)
LET COSECH =2/(EXP(X)-EXP(-X)) !'hyperbolic cosecant
END FUNCTION
EXTERNAL FUNCTION COSECH2(X)
LET COSECH2=1/SINH(X)
END FUNCTION
EXTERNAL FUNCTION COTANH(X)
LET COTANH=EXP(-X)/(EXP(X)-EXP(-X))*2+1 !'hyperbolic cotangent
END FUNCTION
EXTERNAL FUNCTION COTANH2(X)
LET COTANH2=1/TANH(X)
END FUNCTION
EXTERNAL FUNCTION ARCSINH(X)
LET ARCSINH=LOG(X+SQR(X*X+1)) !'arc-hyperbolic sine
END FUNCTION
EXTERNAL FUNCTION ARCCOSH(X)
LET ARCCOSH=LOG(X+SQR(X*X-1)) !'arc-hyperbolic cosine
END FUNCTION
EXTERNAL FUNCTION ARCTANH(X)
LET ARCTANH=LOG((1+X)/(1-X))/2 !'arc-hyperbolic tangent
END FUNCTION
EXTERNAL FUNCTION ARCSECH(X)
LET ARCSECH=LOG((SQR(1-X*X)+1)/X) !'arc-hyperbolic secant
END FUNCTION
EXTERNAL FUNCTION ARCCOSECH(X)
LET ARCCOSECH=LOG((SGN(X)*SQR(X*X+1)+1)/X) !'arc-hyperbolic cosecant
END FUNCTION
EXTERNAL FUNCTION ARCCOTANH(X)
LET ARCCOTANH=LOG((X+1)/(X-1))/2 !'arc-hyperbolic cotangent
END FUNCTION
EXTERNAL FUNCTION SINC(X)
IF X=0 THEN LET SINC=1 ELSE LET SINC=SIN(X)/X
END FUNCTION
EXTERNAL FUNCTION SUM(X)
LET SUM=X/2*(X+1) !'1 + 2 + 3 +...+ X
END FUNCTION
EXTERNAL FUNCTION FACT2(A) !'n!!
IF MOD(A,2)=0 THEN
LET FACT2=2^(A/2)*FACT(A/2) !'2*4*6*8*...
ELSE
LET FACT2=FACT(A)/((2^((A-1)/2))*(FACT((A-1)/2))) !'3*5*7*...
END IF
END FUNCTION
EXTERNAL FUNCTION H(N,R)
LET H=COMB(N+R-1,R) !'nHr 重複組合わせ
END FUNCTION
EXTERNAL FUNCTION ATN2(Y,X)
LET ATN2=ASIN(Y/SQR(X*X+Y*Y)) !' X=SQR(X^2+Y^2)*COS(θ) Y=SQR(X^2+Y^2)*SIN(θ)
END FUNCTION
EXTERNAL FUNCTION MAX(X,Y)
LET MAX=(X+Y+ABS(X-Y))/2 !'IF X>Y THEN MAX=X ELSE MAX=Y 最大値
END FUNCTION
EXTERNAL FUNCTION MIN(X,Y)
LET MIN=(X+Y-ABS(X-Y))/2 !'IF X<Y THEN MIN=X ELSE MIN=Y 最小値
END FUNCTION
EXTERNAL FUNCTION SQR2(X,Y)
LET SQR2=X/COS(ATN(Y/X)) !'SQR(X*X+Y*Y) X>Y
END FUNCTION
EXTERNAL FUNCTION MOD2(X,Y)
LET MOD2=X-INT(X/Y)*Y !'X MOD Y 余り
END FUNCTION
EXTERNAL FUNCTION FIX(X)
LET FIX=INT(ABS(X))*SGN(X) !'FIX(X) 整数部
END FUNCTION
EXTERNAL FUNCTION FRAC(X)
LET FRAC=X-FIX(X) !'FRAC(X) 小数部
END FUNCTION
EXTERNAL FUNCTION FLOOR(X)
IF INT(X)>X THEN LET FLOOR=INT(X)-1 ELSE LET FLOOR=INT(X) !'floor(x)
END FUNCTION
EXTERNAL FUNCTION CEIL(X)
IF INT(X)<X THEN LET CEIL=INT(X)+1 ELSE LET CEIL=INT(X) !'ceil(x)
END FUNCTION
EXTERNAL FUNCTION MIDDLE(X,A,B) !' A<=X<=B
LET MIDDLE=MAX(A,MIN(X,B))
END FUNCTION
EXTERNAL FUNCTION ZELLER(Y,M,D)
LET ZELLER=MOD(Y+INT(Y/4)-INT(Y/100)+INT(Y/400)+INT((13*M+8)/5)+D,7) !'ツェラーの公式
END FUNCTION
EXTERNAL FUNCTION WEEK(Y,M,D)
IF M<3 THEN
LET YY=Y-1
LET MM=M+12
ELSE
LET YY=Y
LET MM=M
END IF
LET WEEK=ZELLER(YY,MM,D)
END FUNCTION
EXTERNAL FUNCTION DAY$(Y,M,D) !'曜日を求める
LET DAY$=MID$("日月火水木金土",WEEK(Y,M,D)+1,1) & "曜日"
END FUNCTION
EXTERNAL FUNCTION NORMAL(U,M,X) !'正規分布密度関数
LET NORMAL=EXP(-(X-U)*(X-U)/(2*M*M))/SQR(2*PI)/M
END FUNCTION
EXTERNAL FUNCTION FUN(X)
LET FUN=1/X !'ダミー定義
END FUNCTION
EXTERNAL FUNCTION FUN2(X,Y)
LET FUN2=X^3+X*Y^2-X^2+X*Y+X !'ダミー定義
END FUNCTION
EXTERNAL FUNCTION FX(X,Y,H)
LET FX=(FUN2(X+H,Y)-FUN2(X,Y))/H !'d/dxF(X,Y)
END FUNCTION
EXTERNAL FUNCTION FY(X,Y,H)
LET FY=(FUN2(X,Y+H)-FUN2(X,Y))/H !'d/dyF(X,Y)
END FUNCTION
EXTERNAL FUNCTION F3(X,H)
LET F3=(FUN(X+H)-FUN(X-H))/(2*H) !'3点微分
END FUNCTION
EXTERNAL FUNCTION F5(X,H)
LET F5 =(-FUN(X+2*H)+8*FUN(X+H)-8*FUN(X-H)+FUN(X-2*H))/(12*H) !'5点微分
END FUNCTION
EXTERNAL FUNCTION FF3(X,H)
LET FF3=(FUN(X+H)-2*FUN(X)+FUN(X-H))/(H*H) !'2階3点微分
END FUNCTION
EXTERNAL FUNCTION FF5(X,H)
LET FF5=(-FUN(X-2*H)+16*FUN(X-H)-30*FUN(X)+16*FUN(X+H)-FUN(X+2*H))/(12*H*H) !'2階5点微分
END FUNCTION
EXTERNAL FUNCTION FFF5(X,H)
LET FFF5=(-FUN(X-2*H)+2*FUN(X-H)-2*FUN(X+H)+FUN(X+2*H))/(2*H*H*H) !'3階5点微分
END FUNCTION
EXTERNAL FUNCTION FXN(XX,H,N) !'n階微分
IF N=0 THEN
LET FXN=FUN(XX)
ELSE
LET FXN=(-FXN(XX+2*H,H,N-1)+8*FXN(XX+H,H,N-1)-8*FXN(XX-H,H,N-1)+FXN(XX-2*H,H,N-1))/(12*H) !'d^n/dx^nF(X)
END IF
END FUNCTION
|
|
|
投稿者:しばっち
投稿日:2011年11月13日(日)20時13分30秒
|
|
|
> No.1717[元記事へ]
続き
EXTERNAL FUNCTION STIRLING(N)
LET STIRLING=SQR(N*2*PI)*N^N*EXP(-N) !'FACT(N)
END FUNCTION
EXTERNAL FUNCTION AREA3(X1,Y1,X2,Y2,X3,Y3)
LET AREA3=ABS(X1*Y2+X2*Y3+X3*Y1-Y1*X2-Y2*X3-Y3*X1)/2 !'三角形の面積
END FUNCTION
EXTERNAL FUNCTION AREA(N, X(), Y()) !'n角形の面積
LET A = X(N - 1) * Y(1) - X(1) * Y(N - 1)
FOR I = 2 TO N - 1
LET A = A + X(I - 1) * Y(I) - X(I) * Y(I - 1)
NEXT I
LET AREA = ABS(A) / 2
END FUNCTION
EXTERNAL FUNCTION NINT(X,N)
LET NINT=INT(10^N*X+.5)/10^N
END FUNCTION
EXTERNAL FUNCTION ISLOWER(X$)
IF ORD(X$)>=97 AND ORD(X$)<=122 THEN LET ISLOWER=-1 ELSE LET ISLOWER=0 !'小文字なら真
END FUNCTION
EXTERNAL FUNCTION ISUPPER(X$)
IF ORD(X$)>=65 AND ORD(X$)<=90 THEN LET ISUPPER=-1 ELSE LET ISUPPER=0 !'大文字なら真
END FUNCTION
EXTERNAL FUNCTION ISDIGIT(X$)
IF ORD(X$)>=48 AND ORD(X$)<=57 THEN LET ISDIGIT=-1 ELSE LET ISDIGIT=0 !'数字なら真
END FUNCTION
EXTERNAL FUNCTION ISALNUM(X$)
IF ISLOWER(X$)=-1 OR ISUPPER(X$)=-1 OR ISDIGIT(X$)=-1 THEN LET ISALNUM=-1 ELSE LET ISALNUM=0
END FUNCTION
EXTERNAL FUNCTION ISALPHA(X$)
IF ISLOWER(X$)=-1 OR ISUPPER(X$)=-1 THEN LET ISALPHA=-1 ELSE LET ISALPHA=0
END FUNCTION
EXTERNAL FUNCTION ISGRAPH(X$)
IF ORD(X$)>=33 AND ORD(X$)<=126 THEN LET ISGRAPH=-1 ELSE LET ISGRAPH=0 !'印字可能文字なら真(空白除く)
END FUNCTION
EXTERNAL FUNCTION ISCNTRL(X$)
IF ORD(X$)<=31 OR ORD(X$)=127 THEN LET ISCNTRL=-1 ELSE LET ISCNTRL=0 !'制御文字なら真
END FUNCTION
EXTERNAL FUNCTION ISPRINT(X$)
IF ORD(X$)>=32 AND ORD(X$)<=126 THEN LET ISPRINT=-1 ELSE LET ISPRINT=0 !'印字可能文字なら真
END FUNCTION
EXTERNAL FUNCTION ISSPACE(X$)
IF ORD(X$)>=9 AND ORD(X$)<=13 OR ORD(X$)=32 THEN LET ISSPACE=-1 ELSE LET ISSPACE=0 !'空白、タブ、復帰、改項、垂直タブ、改頁なら真
END FUNCTION
EXTERNAL FUNCTION ISHEXDIGIT(X$)
IF ISDIGIT(X$)=-1 OR ORD(X$)>=65 AND ORD(X$)<=70 OR ORD(X$)>=97 AND ORD(X$)<=102 THEN LET ISHEXDIGIT=-1 ELSE LET ISHEXDIGIT=0 !'16進表示文字なら真
END FUNCTION
EXTERNAL FUNCTION ISPUNCT(X$)
IF ORD(X$)>=33 AND ORD(X$)<=47 OR ORD(X$)>=58 AND ORD(X$)<=64 OR ORD(X$)>=91 AND ORD(X$)<=96 OR ORD(X$)>=123 AND ORD(X$)<=126 THEN LET ISPUNCT=-1 ELSE LET ISPUNCT=0 !'区切り文字なら真
END FUNCTION
EXTERNAL FUNCTION ISKANJI(X$)
IF LEN(X$)<>BLEN(X$) THEN LET ISKANJI=-1 ELSE LET ISKANJI=0 !'2バイト文字なら真
END FUNCTION
EXTERNAL FUNCTION FIB(N)
LET FIB=INT((((1+SQR(5))/2)^N)/SQR(5)+.5) !'フィボナッチ数列
END FUNCTION
EXTERNAL FUNCTION FIB2(N)
LET A =1
LET B =1
FOR I=1 TO N-2
LET A=A+B
LET B=A-B
NEXT I
LET FIB2=A
END FUNCTION
EXTERNAL FUNCTION MOVEX(X,N,S) !'テンキーによるキャラクター移動(X方向)
IF S=1 OR S=4 OR S=7 THEN LET MOVEX=X+N
IF S=3 OR S=6 OR S=9 THEN LET MOVEX=X-N
END FUNCTION
EXTERNAL FUNCTION MOVEY(Y,N,S) !'テンキーによるキャラクター移動(Y方向)
IF S=7 OR S=8 OR S=9 THEN LET MOVEY=Y-N
IF S=1 OR S=2 OR S=3 THEN LET MOVEY=Y+N
END FUNCTION
EXTERNAL FUNCTION MOVEX2(X,N,S)
LET MOVEX2=X+N*(MOD((S-1),3)-1)
END FUNCTION
EXTERNAL FUNCTION MOVEY2(Y,N,S)
LET MOVEY2=Y+N*(INT((1-S)/3)+1)
END FUNCTION
EXTERNAL FUNCTION LAGRANGE2(X0,X1,Y0,Y1,T)
LET LAGRANGE2=Y0*(T-X1)/(X0-X1)+Y1*(T-X0)/(X1-X0) !'ラグランジュ補間
END FUNCTION
EXTERNAL FUNCTION LAGRANGE3(X0,X1,X2,Y0,Y1,Y2,T)
LET LAGRANGE3=((X2-T)*LAGRANGE2(X0,X1,Y0,Y1,T)-(X1-T)*LAGRANGE2(X0,X2,Y0,Y2,T))/(X2-X1)
END FUNCTION
EXTERNAL FUNCTION LAGRANGE4(X0,X1,X2,X3,Y0,Y1,Y2,Y3,T)
LET LAGRANGE4=((X3-T)*LAGRANGE3(X0,X1,X2,Y0,Y1,Y2,T)-(X2-T)*LAGRANGE3(X0,X1,X3,Y0,Y1,Y3,T))/(X3-X2)
END FUNCTION
EXTERNAL FUNCTION LAGRANGE5(X0,X1,X2,X3,X4,Y0,Y1,Y2,Y3,Y4,T)
LET LAGRANGE5=((X4-T)*LAGRANGE4(X0,X1,X2,X3,Y0,Y1,Y2,Y3,T)-(X3-T)*LAGRANGE4(X0,X1,X2,X4,Y0,Y1,Y2,Y4,T))/(X4-X3)
END FUNCTION
EXTERNAL FUNCTION LAGRANGE(N, X(), Y(), T)
FOR I = 1 TO N
LET P = Y(I)
FOR J = 1 TO N
IF I <> J THEN LET P = P * (T - X(J)) / (X(I) - X(J)) !'ラグランジュ補間
NEXT J
LET S = S + P
NEXT I
LET LARGRANGE = S
END FUNCTION
EXTERNAL FUNCTION Y3(X,X0,Y0,X1,Y1,X2,Y2)
LET Y3=((X-X1)*(X-X2))/((X0-X1)*(X0-X2))*Y0+((X-X0)*(X-X2))/((X1-X0)*(X1-X2))*Y1+((X-X0)*(X-X1))/((X2-X0)*(X2-X1))*Y2 !'3点を通る2次方程式
END FUNCTION
EXTERNAL FUNCTION EQV(X,Y)
LET EQV=BITNOT(BITXOR(X,Y)) !'X EQV Y
END FUNCTION
EXTERNAL FUNCTION AND2(X,Y)
LET AND2=BITNOT(BITOR(BITNOT(X),BITNOT(Y))) !'X AND Y
END FUNCTION
EXTERNAL FUNCTION OR2(X,Y)
LET OR2=BITNOT(BITAND(BITNOT(X),BITNOT(Y))) !'X OR Y
END FUNCTION
EXTERNAL FUNCTION NAND(X,Y)
LET NAND=BITNOT(BITAND(X,Y)) !'X NAND Y
END FUNCTION
EXTERNAL FUNCTION NAND2(X,Y)
LET NAND2=BITOR(BITNOT(X),BITNOT(Y))
END FUNCTION
EXTERNAL FUNCTION NOR(X,Y)
LET NOR=BITNOT(BITOR(X,Y)) !'X NOR Y
END FUNCTION
EXTERNAL FUNCTION NOR2(X,Y)
LET NOR2=BITAND(BITNOT(X),BITNOT(Y))
END FUNCTION
EXTERNAL FUNCTION XOR2(X,Y)
LET XOR2=BITNOT(BITOR(BITAND(X,Y),NOR(X,Y))) !'X XOR Y
END FUNCTION
EXTERNAL FUNCTION XOR3(X,Y)
LET XOR3=BITOR(BITAND(BITNOT(X),Y),BITAND(X,BITNOT(Y)))
END FUNCTION
EXTERNAL FUNCTION XOR4(X,Y)
LET XOR4=BITAND(BITOR(X,Y),BITOR(BITNOT(X),BITNOT(Y)))
END FUNCTION
EXTERNAL FUNCTION XOR5(X,Y)
LET XOR5=NAND(NAND(X,BITNOT(Y)),NAND(BITNOT(X),Y))
END FUNCTION
EXTERNAL FUNCTION IMP(X,Y)
LET IMP=BITOR(BITNOT(X),Y) !'X IMP Y
END FUNCTION
EXTERNAL FUNCTION IMP2(X,Y)
LET IMP2=BITNOT(BITAND(BITNOT(Y),X))
END FUNCTION
EXTERNAL FUNCTION NIMP(X,Y)
LET NIMP=BITNOT(BITOR(BITNOT(X),Y)) !'X NIMP Y
END FUNCTION
EXTERNAL FUNCTION NIMP2(X,Y)
LET NIMP2=BITAND(BITNOT(Y),X)
END FUNCTION
EXTERNAL FUNCTION NIMP3(X,Y)
LET NIMP3=BITNOT(IMP(X,Y))
END FUNCTION
EXTERNAL FUNCTION GCD(M,N) !'最大公約数
DO WHILE N <> 0
LET T = MOD(M , N)
LET M = N
LET N = T
LOOP
LET GCD=M
END FUNCTION
EXTERNAL FUNCTION LCM(A, B)
LET LCM=A*B/GCD(A,B) !'最小公倍数
END FUNCTION
EXTERNAL FUNCTION LCM3(A, B, C)
LET LCM3=A*B*C/GCD(A,B)/GCD(B,C)/GCD(A,C)*GCD(A,GCD(B,C))
END FUNCTION
EXTERNAL FUNCTION WHICH(N,X,Y)
IF N<>0 THEN LET WHICH=X ELSE LET WHICH=Y
END FUNCTION
EXTERNAL FUNCTION COSINE(OX, OY, PX, PY, MX, MY)
LET COSINE=((PX - OX) * (MX - OX) + (PY - OY) * (MY - OY)) / SQR((PX - OX) * (PX - OX) + (PY - OY) * (PY - OY)) / SQR((MX - OX) * (MX - OX) + (MY - OY) * (MY - OY))
END FUNCTION
EXTERNAL FUNCTION COSINE3D(AX,AY,AZ,BX,BY,BZ)
LET COSINE3D=(AX*BX+AY*BY+AZ*BZ)/SQR(AX^2+AY^2+AZ^2)/SQR(BX^2+BY^2+BZ^2)
END FUNCTION
EXTERNAL FUNCTION NSTR$(Y,N) !'N進文字列
LET X=Y
LET B$=""
DO
LET A$=MID$("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",MOD(X,N)+1,1)
LET B$=A$&B$
LET X=INT(X/N)
LOOP UNTIL X=0
LET NSTR$=B$
END FUNCTION
EXTERNAL FUNCTION ANGLE2(X,Y)
LET ANGLE2=ASIN(Y/SQR(X*X+Y*Y))
END FUNCTION
|
|
|
投稿者:山中和義
投稿日:2011年11月16日(水)09時50分14秒
|
|
|
> No.1690[元記事へ]
!図形と方程式
SET WINDOW -8,8,-8,8 !表示領域を設定する ※
!SET WINDOW -1.2,1.2,-1.2,1.2 !表示領域を設定する ※
DRAW grid !XY座標
PUBLIC NUMERIC cEps !精度 ※調整が必要である
LET cEPS=1E-8
PUBLIC NUMERIC cINF !∞
LET cINF=999999
PUBLIC NUMERIC gcCOLOR,gcSTYLE,gcLINESTYLE !描画色、線種
LET gcCOLOR=1
LET gcLINESTYLE=1
!------------------------------ ここまでがサブルーチン
!●3直線の交点を通る円を求めよ。
LET gcN=3 !動点の数
DIM gcX(gcN),gcY(gcN) !制御点の座標
DATA -3,-5
DATA 5,-2
DATA 1,4
FOR i=1 TO gcN
READ gcX(i),gcY(i)
NEXT i
!------------------------------
LET FLG=1
DO
IF FLG=1 THEN !再描画が必要なら
LET FLG=0
SET DRAW MODE HIDDEN !ちらつき防止開始
CLEAR
DRAW grid
CALL frame(gcN,gcX,gcY)
SET DRAW MODE EXPLICIT !ちらつき防止終了
END IF
MOUSE POLL mx,my,left,right !マウスの位置、ボタン状態を読み込む
FOR i=1 TO gcN
IF DIST(mx,my,gcX(i),gcY(i))<=0.4 AND left=1 THEN !近傍を左ドラッグされたなら
LET gcX(i)=mx !移動する
LET gcY(i)=my
LET FLG=1
EXIT FOR !1つだけ
END IF
NEXT i
LOOP UNTIL right=1 !右クリックされるまで
SUB frame(N,MX(),MY()) !作図
LET gcCOLOR=8
FOR i=1 TO N !制御点を描く
CALL gcDRAWPOINT(MX(i),MY(i),"")
NEXT i
LET gcCOLOR=1
CALL gcLINE(MX(1),MY(1),MX(2),MY(2), L1,M1,N1)
CALL gcDRAWLINE(L1,M1,N1,"L1",2) !直線1を描く
LET gcCOLOR=2
CALL gcLINE(MX(2),MY(2),MX(3),MY(3), L2,M2,N2)
CALL gcDRAWLINE(L2,M2,N2,"L2",2) !直線2を描く
LET gcCOLOR=4
CALL gcLINE(MX(3),MY(3),MX(1),MY(1), L3,M3,N3)
CALL gcDRAWLINE(L3,M3,N3,"L3",2) !直線3を描く
!3直線L1x+M1y+N1=0、L2x+M2y+N2=0、L3x+M3y+N3=0を通る
!円錐曲線 s(L1x+M1y+N1)(L2x+M2y+N2)+t(L2x+M2y+N2)(L3x+M3y+N3)+(L3x+M3y+N3)(L1x+M1y+N1)=0
!円となるには、
!・x^2とy^2の係数が0でなく等しい
!・xyの係数が0である
!が条件となる。
!係数を調べると、
!sL1L2+tL2L3+L3L1=tM1M2+tM1M2+M3M1≠0、s(L1M2+M1L2)+t(L2M3+M2L3)+(L3M1+M3L1)=0
! ┌ L1L2-M1M2 L2L3-M2M3 ┐┌ s ┐ = ┌ -L3L1+M3M1 ┐
! └ L1M2+M1L2 L2M3+M2L3 ┘└ t ┘ └ -L3M1-L1M3 ┘
!これを解いて
! ┌ s ┐ = 1/(L2^2+M2^2)(L1M3-L3M1) ┌ L2M3+M2L3 -(L2L3-M2M3) ┐┌ -L3L1+M3M1 ┐
! └ t ┘ └ -(L1M2+M1L2) L1L2-M1M2 ┘└ -L3M1-L1M3 ┘
LET u=(L2^2+M2^2)*(L1*M3-L3*M1)
LET s=( (L2*M3+M2*L3)*(-L3*L1+M3*M1) + (-(L2*L3-M2*M3))*(-L3*M1-L1*M3) ) / u
LET t=( -(L1*M2+M1*L2)*(-L3*L1+M3*M1) + (L1*L2-M1*M2)*(-L3*M1-L1*M3) ) / u
LET u=s*L1*L2+t*L2*L3+L3*L1 !x^2の係数
LET A=( s*(L1*N2+L2*N1)+t*(L2*N3+L3*N2)+(L3*N1+L1*N3) ) / u
LET B=( s*(M1*N2+M2*N1)+t*(M2*N3+M3*N2)+(M3*N1+M1*N3) ) / u
LET C=( s*N1*N2+t*N2*N3+N3*N1 ) / u
LET gcCOLOR=1
CALL gcDRAWCIRCLE(A,B,C,"",0) !求める円を描く
END SUB
END
!作図ルーチン
EXTERNAL SUB gcDRAWPOINT(x,y,s$) !点(x,y)を描く
ASK WINDOW x1,x2,y1,y2
SET AREA COLOR gcCOLOR
DRAW disk WITH SCALE(ABS(x1-x2)/100)*SHIFT(x,y) !※拡大率0.1は調整が必要である
!!!DRAW disk WITH SCALE(0.1)*SHIFT(x,y) !※拡大率0.1は調整が必要である
IF s$<>"" THEN PLOT TEXT ,AT x,y: s$
END SUB
EXTERNAL SUB gcDRAWLINE(L,M,N,s$,o) !直線Lx+My+N=0を描く
IF (L=0 AND M=0) THEN
PRINT "L=M=0なので、直線が成立しません。"; L;M;N
ELSE
ASK WINDOW x1,x2,y1,y2
SET LINE COLOR gcCOLOR
SET LINE STYLE gcLINESTYLE
IF ABS(L)>ABS(M) THEN !y=±xの傾きより大きいなら ※y軸に平行な直線を含む
PLOT LINES: -(M*y1+N)/L,y1; -(M*y2+N)/L,y2
ELSE
PLOT LINES: x1,-(L*x1+N)/M; x2,-(L*x2+N)/M
END IF
IF s$<>"" THEN !注釈
IF M=0 THEN !y軸に平行なら
LET x=-N/L !x切片
LET y=0
ELSEIF L=0 THEN !x軸に平行なら
LET x=0 !y切片
LET y=-N/M
ELSE !x軸とy軸の両方と交差するなら(いわゆる斜めの直線)
SELECT CASE o !記入位置
CASE 0 !y切片
LET x=0
LET y=-N/M
CASE 1 !x切片
LET x=-N/L
LET y=0
CASE 2 !x切片とy切片との中点
LET x=-N/L*0.5
LET y=-N/M*0.5
CASE ELSE
END SELECT
END IF
PLOT TEXT ,AT x,y: s$
END IF
END IF
END SUB
EXTERNAL SUB gcDRAWCIRCLE(A,B,C,s$,o) !円x^2+y^2+Ax+By+C=0を描く
LET RR=(A^2+B^2)/4-C !判別式
IF RR>=0 THEN
SET LINE COLOR gcCOLOR
SET LINE STYLE gcLINESTYLE
LET CX=-A/2 !中心
LET CY=-B/2
LET R=SQR(RR) !半径
FOR i=0 TO 360 !(x-CX)^2+(y-CY)^2=R^2として描く
PLOT LINES: R*COS(RAD(i))+CX,R*SIN(RAD(i))+CY;
NEXT i
PLOT LINES
IF s$<>"" THEN !注釈
SELECT CASE o !記入位置
CASE 0 !右
LET x=CX+R
LET y=CY
CASE 1 !上
LET x=CX
LET y=CY+R
CASE 2 !右上
LET x=R*SQR(2)/2+CX !45度
LET y=R*SQR(2)/2+CY
CASE ELSE
END SELECT
PLOT TEXT ,AT x,y: s$
END IF
ELSE
PRINT "半径が負なので、円が成立しません。"; A;B;C
END IF
END SUB
EXTERNAL SUB gcDRAWFNC2(A,B,C,d1,d2) !2次関数y=Ax^2+Bx+C、x=[d1,d2]を描く
IF A=0 THEN
PRINT "A=0なので、2次関数ではありません。"; A;B;C
ELSE
ASK WINDOW x1,x2,y1,y2
LET x1=MAX(x1,d1)
LET x2=MIN(x2,d2)
SET LINE COLOR gcCOLOR
FOR x=x1 TO x2 STEP 1/2^8 !※折れ線による
PLOT LINES: x,A*x^2+B*x+C;
NEXT x
PLOT LINES
END IF
END SUB
!補助ルーチン
EXTERNAL FUNCTION DIST(x1,y1,x2,y2) !2点(x1,y1),(x2,y2)間の距離
LET DIST=SQR((x1-x2)^2+(y1-y2)^2)
END FUNCTION
!点(x,y)と直線Lx+My+N=0との距離(点から直線へ下した垂線の長さ)
EXTERNAL FUNCTION DIST1L(x,y,L,M,N)
LET DIST1L=ABS(L*x+M*y+N)/SQR(L^2+M^2)
END FUNCTION
EXTERNAL FUNCTION D2Equ(a,b,c) !2次方程式ax^2+bx+c=0の判別式を計算する
IF a=0 THEN
PRINT "2次の係数が0なので、2次方程式ではありません。"; a;b;c
ELSE
LET D2Equ=b^2-4*a*c
END IF
END FUNCTION
!演算ルーチン
!●直線
!2点(x1,y1), (x2,y2)を通る直線Lx+My+N=0
!公式 -(y2-y1)(x-x1)+(x2-x1)(y-y1)=0 より
EXTERNAL SUB gcLINE(x1,y1,x2,y2, L,M,N)
IF (x1=x2 AND y1=y2) THEN !同一点なら
PRINT "異なる2点ではないので、直線が成立しません。"; x1;y1;x2;y2
ELSE
LET L=y1-y2
LET M=x2-x1
LET N=x1*y2-y1*x2
END IF
END SUB
|
|
|
投稿者:山中和義
投稿日:2011年11月16日(水)10時17分42秒
|
|
|
> No.1719[元記事へ]
!図形と方程式
SET WINDOW -8,8,-8,8 !表示領域を設定する ※
!SET WINDOW -1.2,1.2,-1.2,1.2 !表示領域を設定する ※
DRAW grid !XY座標
PUBLIC NUMERIC cEps !精度 ※調整が必要である
LET cEPS=1E-8
PUBLIC NUMERIC cINF !∞
LET cINF=999999
PUBLIC NUMERIC gcCOLOR,gcSTYLE,gcLINESTYLE !描画色、線種
LET gcCOLOR=1
LET gcLINESTYLE=1
!------------------------------ ここまでがサブルーチン
!●直線と2次関数との2交点と他の1点を通る円
LET L=1 !直線x-y+1=0
LET M=-1
LET N=1
CALL gcDRAWLINE(L,M,N,"L",1)
LET A=1 !2次関数y=x^2-2x
LET B=-2
LET C=0
CALL gcDRAWFNC2(A,B,C,-3,5)
LET x=5 !通過点P
LET y=-3
LET gcCOLOR=2
CALL gcDRAWPOINT(x,y,"P")
! 直線Lx+My+N=0、2次関数y=Ax^2+Bx+C
! xを消去する。L^2y=A(-My-N)^2+LB(-My-N)+L^2C ∴AM^2y^2+(2AMN-LBM-L^2)y+(L^2C+AN^2-LBN)=0 ←式1
! yを消去する。(-Lx-N)/M=Ax^2+Bx+C ∴x^2+((B+L/M)/A)x+(C+N/M)/A=0 ←式2
! 直線と2次関数の交点を直径の両端とする円は、式1,式2より、式1+式2=0と表される。
! よって、(直径円)+k(直線)=0は、点(x,y)を通るので、代入して、kを求める。
LET t=L*x+M*y+N !判別式
IF (M=0 AND L=0) OR A=0 THEN
PRINT "直線(L=0かつM=0)または2次関数(A=0)ではありません。"; L;M;N; A;B;C
ELSEIF M=0 THEN
PRINT "垂直線(y軸の平行)では交点が1つです。"; L;M;N
ELSEIF t=0 THEN
PRINT "直線上の点です。"; x;y; L;M;N
ELSE
IF D2Equ(A,B+L/M,C+N/M)>0 THEN !判別式より
LET w1=(B+L/M)/A
LET w2=(2*A*M*N-L*B*M-L^2)/(A*M^2)
LET w3=(L^2*C+A*N^2-L*B*N)/(A*M^2)+(C+N/M)/A
LET k=-(x^2+y^2+w1*x+w2*y+w3) / t
PRINT k !debug
LET P=w1 + k*L
LET Q=w2 + k*M
LET R=w3 + k*N
ELSE
PRINT "直線と2次関数との交点が2つありません。"; L;M;N; A;B;C
END IF
END IF
LET gcCOLOR=2
CALL gcDRAWCIRCLE(P,Q,R,"",0) !求める円を描く
!●直線と円との2交点と他の1点を通る2次関数
LET A=-7 !円x^2+y^2-7x-y-2=0
LET B=-1
LET C=-2
!!CALL gcDRAWCIRCLE(A,B,C,"",0)
LET x=-2 !通過点P
LET y=-5
LET gcCOLOR=4
CALL gcDRAWPOINT(x,y,"Q")
! 直線Lx+My+N=0、円x^2+y^2+Ax+By+C=0
! 直線と円との交点を通る曲線は、(Lx+My+N)(-Lx+My+k)+j(x^2+y^2+Ax+By+C)=0と表される。
! j=-M^2として、-(L^2+M^2)x^2-(LN+AM^2)x+(MN-BM^2)y-CM^2) + k(Lx+My+N) = 0
! よって、(2次関数)+k(直線)=0は、点(x,y)を通るので、代入して、kを求める。
LET t=L*x+M*y+N !判別式
LET RR=(A^2+B^2)/4-C !判別式
IF (M=0 AND L=0) THEN
PRINT "L=0かつM=0なので、直線ではありません。"; L;M;N
ELSEIF RR<=0 THEN
PRINT "半径が0または負なので、円ではありません。"; A;B;C
ELSEIF M=0 THEN
PRINT "垂直線(y軸の平行)では交点が1つです。"; L;M;N
ELSEIF t=0 THEN
PRINT "直線上の点です。"; x;y; L;M;N
ELSE
IF DIST1L(-A/2,-B/2,L,M,N)^2<RR THEN !直線と円の中心との距離<円の半径なら
LET k=((L^2+M^2)*x^2+(L*N+A*M^2)*x-(M*N-B*M^2)*y+C*M^2)/t
PRINT k !debug
LET w=M*N-B*M^2 + k*M
LET P=( L^2+M^2 )/w
LET Q=( L*N+A*M^2 - k*L )/w
LET R=( C*M^2 - k*N )/w
ELSE
PRINT "直線と円との交点が2つありません。"; L;M;N; A;B;C
END IF
END IF
LET gcCOLOR=4
CALL gcDRAWFNC2(P,Q,R,-6,8) !求める2次関数を描く
END
作図ルーチンは省略します。
|
|
|
投稿者:山中和義
投稿日:2011年12月12日(月)19時56分1秒
|
|
|
!座標法で図形(多角形)の断面性能を求める
DATA 12 !頂点の個数 I型
DATA 0, 0 !頂点の座標
DATA 25, 0
DATA 25, 2.5
DATA 13.1, 2.5
DATA 13.1, 47.5
DATA 25, 47.5
DATA 25, 50
DATA 0, 50
DATA 0, 47.5
DATA 11.9, 47.5
DATA 11.9, 2.5
DATA 0, 2.5
!LET CX=20 !中心位置 ※円型 多角形による近似
!LET CY=10
!LET R=30 !半径
!
!LET N=360 !頂点の個数
!DIM X(N),Y(N) !頂点の座標
!FOR i=1 TO N
! LET X(i)=R*COS(RAD(i-1))+CX
! LET Y(i)=R*SIN(RAD(i-1))+CY
!NEXT i
READ N !頂点の個数
DIM X(N),Y(N) !頂点の座標
FOR i=1 TO N
READ X(i),Y(i)
NEXT i
CALL MOAofPolygon(N,X,Y, Du,Dd,Dl,Dr, S,Sx,Sy,Xg,Yg,Jx,Jy,Jxy) !基本
CALL MOA_Print(Du,Dd,Dl,Dr, S,Sx,Sy,Xg,Yg,Jx,Jy,Jxy) !基本を表示する
CALL MOA_Print2(Du,Dd,Dl,Dr, S,Sx,Sy,Xg,Yg,Jx,Jy,Jxy, ALPHA) !その他
!●形状を描く
LET w=Dr-Dl !幅 ※多角形の大きさ
LET h=Du-Dd !高さ
LET t=MAX(w,h) !縦横の比率を合わせる
LET xx1=Dl-t*0.1
LET xx2=Dl+t*1.1
LET yy1=Dd-t*0.1
LET yy2=Dd+t*1.1
SET WINDOW xx1,xx2,yy1,yy2 !表示領域を設定する
IF t>=10 THEN
DRAW grid(INT(t/10),INT(t/10)) !座標を描く
ELSE
DRAW grid(t/10,t/10) !座標を描く
END IF
CALL gcDRAWPOLYGON(N,X,Y) !多角形の形状を描く
CALL gcDRAWPOINT(Xg,Yg,"G") !図心位置
SET LINE COLOR 4 !赤色
LET L=TAN(ALPHA) !u軸 ※点(x1,y1)と通り、傾きαの直線は、Y-y1=tanα(X-x1)より
LET M=-1
LET N=-L*Xg+Yg
CALL gcDRAWLINE(L,M,N)
SET LINE COLOR 3 !緑色
LET A=-M !v軸 ※点(x1,y1)と通り、直線Lx+My+N=0に垂直な直線は、L(y-y1)=M(x-x1)より
LET B=L
LET C=-L*Yg+M*Xg
CALL gcDRAWLINE(A,B,C)
SET LINE COLOR 2 !青色
PLOT LINES: Dl,Dd; Dr,Dd; Dr,Du; Dl,Du; Dl,Dd !AABB(軸並行境界ボックス: Axis-Aligned Bounding Box)
END
!多角形
!反時計まわりに与えられた多角形の頂点が示す座標を(X[i],Y[i])、i=1,2,…,N とする。
!また、X[N+1]=X[1],Y[N+1]=Y{1]とする。
!・辺どうしが交差しない。
!・凸でも凹でも構わない。
!●断面積(sectional area、断面0次モーメント) 単位: mm^2
! 反時計まわりを正とする符号付面積である。
! S=∫dS=(1/2)Σ[i=1,N]{ X(i)*Y(i+1)-X(i+1)*Y(i) } 辺と原点からなる三角形の面積の和(2次元外積による)
! Ax=(1/2)Σ[i=1,N]{ (X(i)-X(i+1))*(Y(i)+Y(i+1)) } 辺とX軸からなる台形の面積の和
! Ay=(1/2)Σ[i=1,N]{ (Y(i+1)-Y(i))*(X(i)+X(i+1)) } 辺とY軸からなる台形の面積の和
! S=Ax=Ay
!
!以下、三角形の面積(2次元外積による)を基準に、
!
!●原点からX軸方向、原点からY軸方向の断面1次モーメント(statical moment of area) 単位: mm^3
! Sx=∫ydS=(1/6)Σ[i=1,N]{ (X(i)*Y(i+1)-X(i+1)*Y(i)) * (X(i)+X(i+1)) }
! Sy=∫xdS=(1/6)Σ[i=1,N]{ (X(i)*Y(i+1)-X(i+1)*Y(i)) * (Y(i)+Y(i+1)) }
!図心Xg軸回り、図心Yg軸回りの断面1次モーメント
! Sxg=Syg=0
!
!●図心(centroid) 単位: mm ※荷重分布が均一なら、重心となる
! Xg=Sx/S
! Yg=Sy/S
!
!●X軸回り、Y軸回りの断面2次モーメント(moment of inertia of area) 単位: mm^4
! Jx=∫y^2dS=(1/24)Σ[i=1,N]{ (X(i)*Y(i+1)-X(i+1)*Y(i)) * ((Y(i)+Y(i+1))^2+Y(i)^2+Y(i+1)^2) }
! Jy=∫x^2dS=(1/24)Σ[i=1,N]{ (X(i)*Y(i+1)-X(i+1)*Y(i)) * ((X(i)+X(i+1))^2+X(i)^2+X(i+1)^2) }
!図心Xg軸回り、図心Yg軸回りの断面2次モーメント
! Jxg=Jx-S*Yg^2
! Jyg=Jy-S*Xg^2
!
!●原点回りの断面相乗モーメント(product of inertia of area) 単位: mm^4
! Jxy=∫xydS=(1/24)Σ[i=1,N]{ (X(i)*Y(i+1)-X(i+1)*Y(i)) * ((X(i)+X(i+1))*(Y(i)+Y(i+1))+X(i)*Y(i)+X(i+1)*Y(i+1)) }
!図心回りの断面相乗モーメント
! Jxyg=Jxy-S*Xg*Yg
EXTERNAL SUB MOAofPolygon(N,X(),Y(), Du,Dd,Dl,Dr, S,Sx,Sy,Xg,Yg,Jx,Jy,Jxy) !基本
LET a=X(N) !Σ部分
LET b=Y(N)
LET c=X(1)
LET d=Y(1)
LET Du=b !座標の最大値、最小値を探す
LET Dd=b
LET Dl=a
LET Dr=a
LET wx=a+c
LET wy=b+d
LET S=a*d-b*c
LET Sx=S*wx
LET Sy=S*wy
LET Jx=S*(wy*wy-b*d)*2
LET Jy=S*(wx*wx-a*c)*2
LET Jxy=S*(wx*wy+(a*b+c*d))
FOR i=1 TO N-1
LET a=X(i) !原点、点(a,b)、点(c,d)の3点
LET b=Y(i)
LET c=X(i+1)
LET d=Y(i+1)
IF b>Du THEN LET Du=b !上端
IF b<Dd THEN LET Dd=b !下端
IF a<Dl THEN LET Dl=a !左端
IF a>Dr THEN LET Dr=a !右端
LET wx=a+c !※似た式が多いので、まとめて乗算の回数が減るように式を変形した
LET wy=b+d
LET t=a*d-b*c
LET S=S+t
LET Sx=Sx+t*wx
LET Sy=Sy+t*wy
LET Jx=Jx+t*(wy*wy-b*d)*2
LET Jy=Jy+t*(wx*wx-a*c)*2
LET Jxy=Jxy+t*(wx*wy+(a*b+c*d))
NEXT i
LET S=S/2 !定数部分
LET Sx=Sx/6
LET Sy=Sy/6
LET Xg=Sx/S
LET Yg=Sy/S
LET Jx=Jx/24
LET Jy=Jy/24
LET Jxy=Jxy/24
END SUB
EXTERNAL SUB MOA_Print(Du,Dd,Dl,Dr, S,Sx,Sy,Xg,Yg,Jx,Jy,Jxy) !基本を表示する
PRINT "上端=";Du; "下端=";Dd; "左端=";Dl; "右端=";Dr
PRINT "断面積 S=";S
PRINT "断面1次モーメント(原点からX軸方向)Sx=";Sx; "(原点からY軸方向)Sy=";Sy
PRINT "図心 Xg=";Xg; "Yg=";Yg
PRINT "断面2次モーメント(X軸回り)Jx=";Jx; "(Y軸回り)Jy=";Jy
PRINT "断面相乗モーメント(原点回り)Jxy=";Jxy
END SUB
EXTERNAL SUB MOA_Print2(Du,Dd,Dl,Dr, S,Sx,Sy,Xg,Yg,Jx,Jy,Jxy, ALPHA) !その他
LET Jxg=Jx-S*Yg^2
LET Jyg=Jy-S*Xg^2
PRINT "断面2次モーメント(図心Xg軸回り)Jxg=";Jxg; "(図心Yg軸回り)Jyg=";Jyg
LET Jxyg=Jxy-S*Xg*Yg
PRINT "断面相乗モーメント(図心回り)Jxyg=";Jxyg
PRINT
!●原点回りの断面2次極モーメント 単位: mm^4
! Jd=∫r^2dS=∫(x^2+y^2)dS=Jx+Jy
!図心回りの断面2次極モーメント
! Jdg=Jxg+Jyg
LET Jd=Jx+Jy
PRINT "断面2次極モーメント(原点回り)Jd=";Jd
LET Jdg=Jxg+Jyg
PRINT "断面2次極モーメント(図心回り)Jdg=";Jdg
!●断面2次半径 単位: mm
! Rx=√(Jx/S)
! Ry=√(Jy/S)
!図心Xg軸回り、図心Yg軸回りの断面2次半径
! Rxg=√(Jxg/S)
! Ryg=√(Jyg/S)
!図心回りの断面2次半径
! Rxyg=√(Rxg^2+Ryg^2)
LET Rx=SQR(Jx/S)
LET Ry=SQR(Jy/S)
PRINT "断面2次半径(X軸回り)Rx=";Rx; "(Y軸回り)Ry=";Ry
LET Rxg=SQR(Jxg/S)
LET Ryg=SQR(Jyg/S)
PRINT "断面2次半径(図心Xg軸回り)Rxg=";Rxg; "(図心Yg軸回り)Ryg=";Ryg
LET Rxyg=SQR(Rxg^2+Ryg^2)
PRINT "断面2次半径(図心回り)Rxyg=";Rxyg
!●断面係数(section modulus) 単位: mm^3
! 上端 Wu=Jyg/d dは、図心から上端までの距離
! 下端 Wd=Jyg/d dは、図心から下端までの距離
! 左端 Wl=Jxg/d dは、図心から左端までの距離
! 右端 Wr=Jxg/d dは、図心から右端までの距離
LET Mu=Jxg/(Du-Yg) !図心を基準にする
LET Md=Jxg/(Yg-Dd)
LET Ml=Jyg/(Xg-Dl)
LET Mr=Jyg/(Dr-Xg)
PRINT "断面係数(上端)Mu=";Mu; "(下端)Md=";Md
PRINT " (左端)Ml=";Ml; "(右端)Mr=";Mr
PRINT
!●X軸からの主軸の角度α 単位: ラジアン
! α=(1/2)ArcTan( (-2*Jxy)/(Jx-Jy) )
IF Jy-Jx=0 THEN
LET ALPHA=PI
ELSE
LET ALPHA=ATN( (2*Jxy)/(Jy-Jx) )/2
END IF
PRINT "主軸の角度=";DEG(ALPHA);"°"
!●主軸回りの断面2次モーメント(固有断面2次モーメント) 単位: mm^4
! Ju=( Jx+Jy + √((Jx-Jy)^2 + 4*Jxy^2) ) / 2
! Jv=( Jx+Jy - √((Jx-Jy)^2 + 4*Jxy^2) ) / 2
! Juv=0
LET t=SQR((Jx-Jy)^2+4*Jxy^2)
LET Ju=(Jx+Jy+t)/2
LET Jv=(Jx+Jy-t)/2
LET Juv=0
PRINT "断面2次モーメント(主軸u軸回り)Ju=";Ju; "(v軸回り)Jv=";Jv
!!PRINT "断面2次モーメント(主軸回り)Juv=";Juv
END SUB
!作図ツール
EXTERNAL SUB gcDRAWPOINT(x,y,s$) !点を描く
PLOT POINTS: x,y
PLOT TEXT ,AT x,y: s$
END SUB
EXTERNAL SUB gcDRAWLINE(L,M,N) !直線Lx+My+N=0を描く
IF (L=0 AND M=0) THEN
PRINT "L=M=0なので、直線が成立しません。"; L;M;N
ELSE
ASK WINDOW x1,x2,y1,y2
IF ABS(L)>ABS(M) THEN !y=±xの傾きより大きいなら ※y軸に平行な直線を含む
PLOT LINES: -(M*y1+N)/L,y1; -(M*y2+N)/L,y2
ELSE
PLOT LINES: x1,-(L*x1+N)/M; x2,-(L*x2+N)/M
END IF
END IF
END SUB
EXTERNAL SUB gcDRAWPOLYGON(N,X(),Y()) !多角形を描く
FOR i=1 TO N !折れ線でつなぐ
PLOT LINES: X(i),Y(i);
NEXT i
PLOT LINES: X(1),Y(1) !閉じる
END SUB
実行結果
上端= 50 下端= 0 左端= 0 右端= 25
断面積 S= 179
断面1次モーメント(原点からX軸方向)Sx= 2237.5 (原点からY軸方向)Sy= 4475
図心 Xg= 12.5 Yg= 25
断面2次モーメント(X軸回り)Jx= 191560.416666667 (Y軸回り)Jy= 34485.6466666667
断面相乗モーメント(原点回り)Jxy= 55937.5
断面2次モーメント(図心Xg軸回り)Jxg= 79685.416666667 (図心Yg軸回り)Jyg= 6516.8966666667
断面相乗モーメント(図心回り)Jxyg= 0
断面2次極モーメント(原点回り)Jd= 226046.063333334
断面2次極モーメント(図心回り)Jdg= 86202.3133333337
断面2次半径(X軸回り)Rx= 32.7134517517199 (Y軸回り)Ry= 13.8801024473114
断面2次半径(図心Xg軸回り)Rxg= 21.0990503462148 (図心Yg軸回り)Ryg= 6.03384155806719
断面2次半径(図心回り)Rxyg= 21.9448665856042
断面係数(上端)Mu= 3187.41666666668 (下端)Md= 3187.41666666668
(左端)Ml= 521.351733333336 (右端)Mr= 521.351733333336
主軸の角度=-17.7300030228545 °
断面2次モーメント(主軸u軸回り)Ju= 209444.630641628 (v軸回り)Jv= 16601.4326917054
|
|
|
投稿者:山中和義
投稿日:2011年12月13日(火)10時23分11秒
|
|
|
> No.1721[元記事へ]
図形を分けて考える。
●例1
!座標法で図形(多角形)の断面性能を求める
!エ = ━ + ┃ + ━
DATA 4 !頂点の個数 ※下フランジ
DATA 0, 0 !頂点の座標
DATA 25, 0
DATA 25, 2.5
DATA 0, 2.5
READ N1 !頂点の個数
DIM X1(N1),Y1(N1) !頂点の座標
FOR i=1 TO N1
READ X1(i),Y1(i)
NEXT i
CALL MOAofPolygon(N1,X1,Y1, Du1,Dd1,Dl1,Dr1, S1,Sx1,Sy1,Xg1,Yg1,Jx1,Jy1,Jxy1) !基本
CALL MOA_Print(Du1,Dd1,Dl1,Dr1, S1,Sx1,Sy1,Xg1,Yg1,Jx1,Jy1,Jxy1) !基本を表示する
PRINT
DATA 4 !頂点の個数 ※ウェブ
DATA 11.9, 2.5 !頂点の座標
DATA 13.1, 2.5
DATA 13.1, 47.5
DATA 11.9, 47.5
READ N2 !頂点の個数
DIM X2(N2),Y2(N2) !頂点の座標
FOR i=1 TO N2
READ X2(i),Y2(i)
NEXT i
CALL MOAofPolygon(N2,X2,Y2, Du2,Dd2,Dl2,Dr2, S2,Sx2,Sy2,Xg2,Yg2,Jx2,Jy2,Jxy2) !基本
CALL MOA_Print(Du2,Dd2,Dl2,Dr2, S2,Sx2,Sy2,Xg2,Yg2,Jx2,Jy2,Jxy2) !基本を表示する
PRINT
DATA 4 !頂点の個数 ※上フランジ
DATA 0, 47.5 !頂点の座標
DATA 25, 47.5
DATA 25, 50
DATA 0, 50
READ N3 !頂点の個数
DIM X3(N3),Y3(N3) !頂点の座標
FOR i=1 TO N3
READ X3(i),Y3(i)
NEXT i
CALL MOAofPolygon(N3,X3,Y3, Du3,Dd3,Dl3,Dr3, S3,Sx3,Sy3,Xg3,Yg3,Jx3,Jy3,Jxy3) !基本
CALL MOA_Print(Du3,Dd3,Dl3,Dr3, S3,Sx3,Sy3,Xg3,Yg3,Jx3,Jy3,Jxy3) !基本を表示する
PRINT
LET Du=MAX(MAX(Du1,Du2),Du3) !3つの形状を合わせる
LET Dd=MIN(MIN(Dd1,Dd2),Dd3)
LET Dl=MIN(MIN(Dl1,Dl2),Dl3)
LET Dr=MAX(MAX(Dr1,Dr2),Dr3)
LET S=S1+S2+S3
LET Sx=Sx1+Sx2+Sx3
LET Sy=Sy1+Sy2+Sy3
LET Xg=(Xg1*S1+Xg2*S2+Xg3*S3)/S
LET Yg=(Yg1*S1+Yg2*S2+Yg3*S3)/S
LET Jx=Jx1+Jx2+Jx3
LET Jy=Jy1+Jy2+Jy3
LET Jxy=Jxy1+Jxy2+Jxy3
CALL MOA_Print(Du,Dd,Dl,Dr, S,Sx,Sy,Xg,Yg,Jx,Jy,Jxy) !基本を表示する
CALL MOA_Print2(Du,Dd,Dl,Dr, S,Sx,Sy,Xg,Yg,Jx,Jy,Jxy, ALPHA) !その他
!●形状を描く
LET w=Dr-Dl !幅 ※多角形の大きさ
LET h=Du-Dd !高さ
LET t=MAX(w,h) !縦横の比率を合わせる
LET xx1=Dl-t*0.1
LET xx2=Dl+t*1.1
LET yy1=Dd-t*0.1
LET yy2=Dd+t*1.1
SET WINDOW xx1,xx2,yy1,yy2 !表示領域を設定する
IF t>=10 THEN
DRAW grid(INT(t/10),INT(t/10)) !座標を描く
ELSE
DRAW grid(t/10,t/10) !座標を描く
END IF
CALL gcDRAWPOLYGON(N1,X1,Y1) !多角形の形状を描く
CALL gcDRAWPOLYGON(N2,X2,Y2)
CALL gcDRAWPOLYGON(N3,X3,Y3)
CALL gcDRAWPOINT(Xg,Yg,"G") !図心位置
SET LINE COLOR 4 !赤色
LET L=TAN(ALPHA) !u軸 ※点(x1,y1)と通り、傾きαの直線は、Y-y1=tanα(X-x1)より
LET M=-1
LET N=-L*Xg+Yg
CALL gcDRAWLINE(L,M,N)
SET LINE COLOR 3 !緑色
LET A=-M !v軸 ※点(x1,y1)と通り、直線Lx+My+N=0に垂直な直線は、L(y-y1)=M(x-x1)より
LET B=L
LET C=-L*Yg+M*Xg
CALL gcDRAWLINE(A,B,C)
SET LINE COLOR 2 !青色
PLOT LINES: Dl,Dd; Dr,Dd; Dr,Du; Dl,Du; Dl,Dd !AABB(軸並行境界ボックス: Axis-Aligned Bounding Box)
END
※サブルーチン部分は省略します。
実行結果
上端= 2.5 下端= 0 左端= 0 右端= 25
断面積 S= 62.5
断面1次モーメント(原点からX軸方向)Sx= 781.25 (原点からY軸方向)Sy= 78.125
図心 Xg= 12.5 Yg= 1.25
断面2次モーメント(X軸回り)Jx= 130.208333333333 (Y軸回り)Jy= 13020.8333333333
断面相乗モーメント(原点回り)Jxy= 976.5625
上端= 47.5 下端= 2.5 左端= 11.9 右端= 13.1
断面積 S= 54
断面1次モーメント(原点からX軸方向)Sx= 675 (原点からY軸方向)Sy= 1350
図心 Xg= 12.5 Yg= 25
断面2次モーメント(X軸回り)Jx= 42862.5 (Y軸回り)Jy= 8443.98
断面相乗モーメント(原点回り)Jxy= 16875
上端= 50 下端= 47.5 左端= 0 右端= 25
断面積 S= 62.5
断面1次モーメント(原点からX軸方向)Sx= 781.25 (原点からY軸方向)Sy= 3046.875
図心 Xg= 12.5 Yg= 48.75
断面2次モーメント(X軸回り)Jx= 148567.708333333 (Y軸回り)Jy= 13020.8333333333
断面相乗モーメント(原点回り)Jxy= 38085.9375
上端= 50 下端= 0 左端= 0 右端= 25
断面積 S= 179
断面1次モーメント(原点からX軸方向)Sx= 2237.5 (原点からY軸方向)Sy= 4475
図心 Xg= 12.5 Yg= 25
断面2次モーメント(X軸回り)Jx= 191560.416666666 (Y軸回り)Jy= 34485.6466666666
断面相乗モーメント(原点回り)Jxy= 55937.5
断面2次モーメント(図心Xg軸回り)Jxg= 79685.416666666 (図心Yg軸回り)Jyg= 6516.8966666666
断面相乗モーメント(図心回り)Jxyg= 0
断面2次極モーメント(原点回り)Jd= 226046.063333333
断面2次極モーメント(図心回り)Jdg= 86202.3133333326
断面2次半径(X軸回り)Rx= 32.7134517517198 (Y軸回り)Ry= 13.8801024473113
断面2次半径(図心Xg軸回り)Rxg= 21.0990503462147 (図心Yg軸回り)Ryg= 6.03384155806714
断面2次半径(図心回り)Rxyg= 21.944866585604
断面係数(上端)Mu= 3187.41666666664 (下端)Md= 3187.41666666664
(左端)Ml= 521.351733333328 (右端)Mr= 521.351733333328
主軸の角度=-17.7300030228546 °
断面2次モーメント(主軸u軸回り)Ju= 209444.630641627 (v軸回り)Jv= 16601.4326917053
●例2
!座標法で図形(多角形)の断面性能を求める
!エ = □ - ロ - ロ
DATA 4 !頂点の個数 I型
DATA 0, 0 !頂点の座標 全体の矩形
DATA 25, 0
DATA 25, 50
DATA 0, 50
READ N1 !頂点の個数
DIM X1(N1),Y1(N1) !頂点の座標
FOR i=1 TO N1
READ X1(i),Y1(i)
NEXT i
CALL MOAofPolygon(N1,X1,Y1, Du1,Dd1,Dl1,Dr1, S1,Sx1,Sy1,Xg1,Yg1,Jx1,Jy1,Jxy1) !基本
CALL MOA_Print(Du1,Dd1,Dl1,Dr1, S1,Sx1,Sy1,Xg1,Yg1,Jx1,Jy1,Jxy1) !基本を表示する
PRINT
DATA 4
DATA 13.1, 2.5 !ウェブ右側 ※差の図形は右回り
DATA 13.1, 47.5
DATA 25, 47.5
DATA 25, 2.5
READ N2 !頂点の個数
DIM X2(N2),Y2(N2) !頂点の座標
FOR i=1 TO N2
READ X2(i),Y2(i)
NEXT i
CALL MOAofPolygon(N2,X2,Y2, Du2,Dd2,Dl2,Dr2, S2,Sx2,Sy2,Xg2,Yg2,Jx2,Jy2,Jxy2) !基本
CALL MOA_Print(Du2,Dd2,Dl2,Dr2, S2,Sx2,Sy2,Xg2,Yg2,Jx2,Jy2,Jxy2) !基本を表示する
PRINT
DATA 4
DATA 0, 2.5 !ウェブ左側 ※差の図形は右回り
DATA 0, 47.5
DATA 11.9, 47.5
DATA 11.9, 2.5
READ N3 !頂点の個数
DIM X3(N3),Y3(N3) !頂点の座標
FOR i=1 TO N3
READ X3(i),Y3(i)
NEXT i
CALL MOAofPolygon(N3,X3,Y3, Du3,Dd3,Dl3,Dr3, S3,Sx3,Sy3,Xg3,Yg3,Jx3,Jy3,Jxy3) !基本
CALL MOA_Print(Du3,Dd3,Dl3,Dr3, S3,Sx3,Sy3,Xg3,Yg3,Jx3,Jy3,Jxy3) !基本を表示する
PRINT
LET Du=Du1 !3つの形状を合わせる
LET Dd=Dd1
LET Dl=Dl1
LET Dr=Dr1
LET S=S1+S2+S3
LET Sx=Sx1+Sx2+Sx3
LET Sy=Sy1+Sy2+Sy3
LET Xg=(Xg1*S1+Xg2*S2+Xg3*S3)/S
LET Yg=(Yg1*S1+Yg2*S2+Yg3*S3)/S
LET Jx=Jx1+Jx2+Jx3
LET Jy=Jy1+Jy2+Jy3
LET Jxy=Jxy1+Jxy2+Jxy3
CALL MOA_Print(Du,Dd,Dl,Dr, S,Sx,Sy,Xg,Yg,Jx,Jy,Jxy) !基本を表示する
CALL MOA_Print2(Du,Dd,Dl,Dr, S,Sx,Sy,Xg,Yg,Jx,Jy,Jxy, ALPHA) !その他
!●形状を描く
LET w=Dr-Dl !幅 ※多角形の大きさ
LET h=Du-Dd !高さ
LET t=MAX(w,h) !縦横の比率を合わせる
LET xx1=Dl-t*0.1
LET xx2=Dl+t*1.1
LET yy1=Dd-t*0.1
LET yy2=Dd+t*1.1
SET WINDOW xx1,xx2,yy1,yy2 !表示領域を設定する
IF t>=10 THEN
DRAW grid(INT(t/10),INT(t/10)) !座標を描く
ELSE
DRAW grid(t/10,t/10) !座標を描く
END IF
CALL gcDRAWPOLYGON(N1,X1,Y1) !多角形の形状を描く
CALL gcDRAWPOLYGON(N2,X2,Y2)
CALL gcDRAWPOLYGON(N3,X3,Y3)
CALL gcDRAWPOINT(Xg,Yg,"G") !図心位置
SET LINE COLOR 4 !赤色
LET L=TAN(ALPHA) !u軸 ※点(x1,y1)と通り、傾きαの直線は、Y-y1=tanα(X-x1)より
LET M=-1
LET N=-L*Xg+Yg
CALL gcDRAWLINE(L,M,N)
SET LINE COLOR 3 !緑色
LET A=-M !v軸 ※点(x1,y1)と通り、直線Lx+My+N=0に垂直な直線は、L(y-y1)=M(x-x1)より
LET B=L
LET C=-L*Yg+M*Xg
CALL gcDRAWLINE(A,B,C)
SET LINE COLOR 2 !青色
PLOT LINES: Dl,Dd; Dr,Dd; Dr,Du; Dl,Du; Dl,Dd !AABB(軸並行境界ボックス: Axis-Aligned Bounding Box)
END
※サブルーチン部分は省略します。
実行結果
上端= 50 下端= 0 左端= 0 右端= 25
断面積 S= 1250
断面1次モーメント(原点からX軸方向)Sx= 15625 (原点からY軸方向)Sy= 31250
図心 Xg= 12.5 Yg= 25
断面2次モーメント(X軸回り)Jx= 1041666.66666667 (Y軸回り)Jy= 260416.666666667
断面相乗モーメント(原点回り)Jxy= 390625
上端= 47.5 下端= 2.5 左端= 13.1 右端= 25
断面積 S=-535.5
断面1次モーメント(原点からX軸方向)Sx=-10201.275 (原点からY軸方向)Sy=-13387.5
図心 Xg= 19.05 Yg= 25
断面2次モーメント(X軸回り)Jx=-425053.125 (Y軸回り)Jy=-200653.635
断面相乗モーメント(原点回り)Jxy=-255031.875
上端= 47.5 下端= 2.5 左端= 0 右端= 11.9
断面積 S=-535.5
断面1次モーメント(原点からX軸方向)Sx=-3186.225 (原点からY軸方向)Sy=-13387.5
図心 Xg= 5.95 Yg= 25
断面2次モーメント(X軸回り)Jx=-425053.125 (Y軸回り)Jy=-25277.385
断面相乗モーメント(原点回り)Jxy=-79655.625
上端= 50 下端= 0 左端= 0 右端= 25
断面積 S= 179
断面1次モーメント(原点からX軸方向)Sx= 2237.5 (原点からY軸方向)Sy= 4475
図心 Xg= 12.5 Yg= 25
断面2次モーメント(X軸回り)Jx= 191560.41666667 (Y軸回り)Jy= 34485.646666667
断面相乗モーメント(原点回り)Jxy= 55937.5
断面2次モーメント(図心Xg軸回り)Jxg= 79685.41666667 (図心Yg軸回り)Jyg= 6516.896666667
断面相乗モーメント(図心回り)Jxyg= 0
断面2次極モーメント(原点回り)Jd= 226046.063333337
断面2次極モーメント(図心回り)Jdg= 86202.313333337
断面2次半径(X軸回り)Rx= 32.7134517517202 (Y軸回り)Ry= 13.8801024473114
断面2次半径(図心Xg軸回り)Rxg= 21.0990503462152 (図心Yg軸回り)Ryg= 6.03384155806733
断面2次半径(図心回り)Rxyg= 21.9448665856046
断面係数(上端)Mu= 3187.4166666668 (下端)Md= 3187.4166666668
(左端)Ml= 521.35173333336 (右端)Mr= 521.35173333336
主軸の角度=-17.7300030228543 °
断面2次モーメント(主軸u軸回り)Ju= 209444.630641631 (v軸回り)Jv= 16601.432691706
|
|
|
投稿者:山中和義
投稿日:2011年12月16日(金)09時45分3秒
|
|
|
> No.1722[元記事へ]
扇形、円、半円、円管などの場合
!座標法で図形(扇形)の断面性能を求める
LET CX=20 !中心の位置
LET CY=10
LET R1=20 !内半径
LET R2=50 !外半径
LET AS=-20 !開始角(単位は度)
LET AE=120 !終了角
!たとえば、
!開始角=0、終了角=360なら、円管
!内半径=0、開始角=0、終了角=360なら、円
!内半径=0、開始角=θ、終了角=開始角+180なら、傾きθの半円
!内半径=0、開始角=θ、終了角=開始角+90なら、傾きθの1/4円
CALL MOAofFan(CX,CY,R1,R2,AS,AE, Du,Dd,Dl,Dr, S,Sx,Sy,Xg,Yg,Jx,Jy,Jxy) !基本
CALL MOA_Print(Du,Dd,Dl,Dr, S,Sx,Sy,Xg,Yg,Jx,Jy,Jxy) !基本を表示する
CALL MOA_Print2(Du,Dd,Dl,Dr, S,Sx,Sy,Xg,Yg,Jx,Jy,Jxy, ALPHA) !その他
!●形状を描く
LET w=Dr-Dl !幅 ※多角形の大きさ
LET h=Du-Dd !高さ
LET t=MAX(w,h) !縦横の比率を合わせる
LET xx1=Dl-t*0.1
LET xx2=Dl+t*1.1
LET yy1=Dd-t*0.1
LET yy2=Dd+t*1.1
SET WINDOW xx1,xx2,yy1,yy2 !表示領域を設定する
IF t>=10 THEN
DRAW grid(INT(t/10),INT(t/10)) !座標を描く
ELSE
DRAW grid(t/10,t/10) !座標を描く
END IF
CALL gcDRAWFAN(CX,CY,R1,R2,AS,AE) !扇形を描く ←←←
CALL gcDRAWPOINT(Xg,Yg,"G") !図心位置
SET LINE COLOR 4 !赤色
LET L=TAN(ALPHA) !u軸 ※点(x1,y1)と通り、傾きαの直線は、Y-y1=tanα(X-x1)より
LET M=-1
LET N=-L*Xg+Yg
CALL gcDRAWLINE(L,M,N)
SET LINE COLOR 3 !緑色
LET A=-M !v軸 ※点(x1,y1)と通り、直線Lx+My+N=0に垂直な直線は、L(y-y1)=M(x-x1)より
LET B=L
LET C=-L*Yg+M*Xg
CALL gcDRAWLINE(A,B,C)
SET LINE COLOR 2 !青色
PLOT LINES: Dl,Dd; Dr,Dd; Dr,Du; Dl,Du; Dl,Dd !AABB(軸並行境界ボックス: Axis-Aligned Bounding Box)
END
※サブルーチン 追加部分
!扇形
!●断面積(sectional area、断面0次モーメント) 単位: mm^2
! 中心(0,0)、内半径r1、外半径r2、開始角θ1、終了角θ2 とする。
! S=∫dS=(r2^2-r1^2)(θ2-θ1)/2
!
!以下、三角形の面積(2次元外積による)を基準に、
!
!●原点からX軸方向、原点からY軸方向の断面1次モーメント(statical moment of area) 単位: mm^3
! Sx=∫ydS=(r2^3-r1^3)(sinθ2-sinθ1)/3
! Sy=∫xdS=(r2^3-r1^3)(cosθ1-cosθ2)/3
!図心Xg軸回り、図心Yg軸回りの断面1次モーメント
! Sx=Sy=0
!
!●図心(centroid) 単位: mm ※荷重分布が均一なら、重心となる
! Xg=Sx/S
! Yg=Sy/S
!
!●X軸回り、Y軸回りの断面2次モーメント(moment of inertia of area) 単位: mm^4
! Jx=∫y^2dS=(1/16)(r2^4-r1^4)(2θ2-2θ1-sin(2θ2)+sin(2θ1))
! Jy=∫x^2dS=(1/16)(r2^4-r1^4)(2θ2-2θ1+sin(2θ2)-sin(2θ1))
!図心Xg軸回り、図心Yg軸回りの断面2次モーメント
! Jxg=Jx-S*Yg^2
! Jyg=Jy-S*Xg^2
!
!●原点回りの断面相乗モーメント(product of inertia of area) 単位: mm^4
! Jxy=∫xydS=(1/16)(r2^4-r1^4)(cos(2θ2)-cos(2θ1))
!図心回りの断面相乗モーメント
! Jxyg=Jxy-S*Xg*Yg
EXTERNAL SUB MOAofFan(CX,CY,R1,R2,AS,AE, Du,Dd,Dl,Dr, S,Sx,Sy,Xg,Yg,Jx,Jy,Jxy) !基本
LET Du=R2+CY !座標の最大値、最小値を探す ※円として把握する
LET Dd=-R2+CY
LET Dl=-R2+CX
LET Dr=R2+CX
IF AS>AE THEN LET AE=AE+360
LET TH1=RAD(AS)
LET TH2=RAD(AE)
LET S=(R2^2-R1^2)*(TH2-TH1)/2 !※中心(CX,CY)を基準とする
LET Sxc=(R2^3-R1^3)*(SIN(TH2)-SIN(TH1))/3
LET Syc=(R2^3-R1^3)*(COS(TH1)-COS(TH2))/3
LET Xgc=Sxc/S
LET Ygc=Syc/S
LET Jxc=(R2^4-R1^4)*(2*TH2-2*TH1-SIN(2*TH2)+SIN(2*TH1))/16
LET Jyc=(R2^4-R1^4)*(2*TH2-2*TH1+SIN(2*TH2)-SIN(2*TH1))/16
LET Jxyc=-(R2^4-R1^4)*(COS(2*TH2)-COS(2*TH1))/16
LET Xg=Xgc + CX !※XY軸へ換算する
LET Yg=Ygc + CY
LET Sx=Xg*S
LET Sy=Yg*S
LET Jxgc=Jxc-S*Ygc^2 !!!
LET Jygc=Jyc-S*Xgc^2
LET Jxygc=Jxyc-S*Xgc*Ygc
LET Jx=Jxgc + S*Yg^2 !=(Jxc-S*Ygc^2)+S*(Ygc+CY)^2=Jxc+2*S*CY*Ygc+S*CY^2=Jxc+S*CY*(2Ygc+CY)
LET Jy=Jygc + S*Xg^2
LET Jxy=Jxygc + S*Xg*Yg
END SUB
!作図ツール
EXTERNAL SUB gcDRAWCIRCLE(CX,CY,R,AS,AE) !円(円弧)を描く ※ASは開始角、AEは終了角
IF R<0 THEN
PRINT "R<0なので、円が成立しません。"; CX;CY;R
ELSE
IF AS>AE THEN LET AE=AE+360
FOR i=AS TO AE !折れ線でつなぐ
PLOT LINES: R*COS(RAD(i))+CX,R*SIN(RAD(i))+CY;
NEXT i
PLOT LINES !閉じる
END IF
END SUB
EXTERNAL SUB gcDRAWFAN(CX,CY,R1,R2,AS,AE) !扇形を描く
CALL gcDRAWCIRCLE(CX,CY,R1,AS,AE) !弧
CALL gcDRAWCIRCLE(CX,CY,R2,AS,AE)
LET co=COS(RAD(AS)) !開始
LET si=SIN(RAD(AS))
PLOT LINES: R1*co+CX,R1*si+CY; R2*co+CX,R2*si+CY
LET co=COS(RAD(AE)) !終了
LET si=SIN(RAD(AE))
PLOT LINES: R1*co+CX,R1*si+CY; R2*co+CX,R2*si+CY
CALL gcDRAWPOINT(CX,CY,"C") !中心
END SUB
実行結果
上端= 60 下端=-40 左端=-30 右端= 70
断面積 S= 2565.63400043167
断面1次モーメント(原点からX軸方向)Sx= 98426.4563459275 (原点からY軸方向)Sy= 81804.3522149674
図心 Xg= 38.3634050411583 Yg= 31.8846539300632
断面2次モーメント(X軸回り)Jx= 3324578.17994765 (Y軸回り)Jy= 4685919.41859888
断面相乗モーメント(原点回り)Jxy= 2589112.97383445
断面2次モーメント(図心Xg軸回り)Jxg= 716274.719600415 (図心Yg軸回り)Jyg= 909945.407034179
断面相乗モーメント(図心回り)Jxyg=-549180.52431792
断面2次極モーメント(原点回り)Jd= 8010497.59854653
断面2次極モーメント(図心回り)Jdg= 1626220.12663459
断面2次半径(X軸回り)Rx= 35.9973825930853 (Y軸回り)Ry= 42.7366087411558
断面2次半径(図心Xg軸回り)Rxg= 16.7086922681897 (図心Yg軸回り)Ryg= 18.8326015288029
断面2次半径(図心回り)Rxyg= 25.1763237518056
断面係数(上端)Mu= 25476.2903440237 (下端)Md= 9964.22296610457
(左端)Ml= 13310.4166839897 (右端)Mr= 28762.4318678414
主軸の角度= 37.6352029782081 °
断面2次モーメント(主軸u軸回り)Ju= 6682340.22156183 (v軸回り)Jv= 1328157.37698471
|
|
|
投稿者:SECOND
投稿日:2011年12月26日(月)18時39分37秒
|
|
|
!某サイト「考える葦」に掲示されている問題を、グラフ化したものです。
!実際的な確認ができます。数学的 証明の糸口に・・
!-------------------------------------------------------
!ベクトルの問題なんですが・・・ 返信 引用
!名前:・・・ 日付:2011/12/24(土) 11:10
!四角形 ABCD において、辺 AB,BC,CD,DA の中点を、それぞれ E,F,G,H とし、
!対角線 AC,BD の中点をそれぞれ I,J とする。
!このとき、線分 EG,FH,IJ は、1点で交わることを証明せよ。
!-------------------------------------------------------
OPTION ARITHMETIC COMPLEX
SET WINDOW -1.1, 1.1, -1.1, 1.1
SET POINT STYLE 7
!
LET a=COMPLEX(-.5, .5)
LET b=COMPLEX(-.7,-.7)
LET c=COMPLEX( .8,-.8)
LET d=COMPLEX( .4, .7)
DO
SET DRAW mode hidden
CLEAR
CALL gide(-1,1)
!
SET LINE width 1
SET LINE COLOR "black"
PLOT LINES: a;b;c;d;a
PLOT TEXT,AT a:"A"
PLOT TEXT,AT b:"B"
PLOT TEXT,AT c:"C"
PLOT TEXT,AT d:"D"
!
SET LINE COLOR "green"
LET e=(a+b)/2
LET f=(b+c)/2
LET g=(c+d)/2
LET h=(d+a)/2
PLOT LINES: e;f;g;h;e
PLOT POINTS: e;f;g;h
PLOT TEXT,AT e:"E"
PLOT TEXT,AT f:"F"
PLOT TEXT,AT g:"G"
PLOT TEXT,AT h:"H"
!
PLOT LINES: a;c
PLOT LINES: b;d
!
SET LINE width 2
SET LINE COLOR "red"
PLOT LINES: e; g
PLOT LINES: f; h
!
SET LINE COLOR "blue"
PLOT LINES: (a+c)/2;(b+d)/2
PLOT POINTS: (a+c)/2;(b+d)/2
PLOT TEXT,AT (a+c)/2:"I"
PLOT TEXT,AT (b+d)/2:"J"
!
SET DRAW mode explicit
mouse poll x,y,mlb,mrb
DO WHILE mlb=0 AND mrb=0
WAIT DELAY 0 !省電力(待機中のクロックアップ防止。)
mouse poll x,y,mlb,mrb
LET z=COMPLEX(x,y)
LET i$=""
LET i=MIN( MIN( MIN(ABS(z-a),ABS(z-b)),ABS(z-c)),ABS(z-d))
IF i<=1/6 THEN
IF i=ABS(z-a) THEN LET i$="a"
IF i=ABS(z-b) THEN LET i$="b"
IF i=ABS(z-c) THEN LET i$="c"
IF i=ABS(z-d) THEN LET i$="d"
END IF
LOOP
LET z=COMPLEX(x,y)
IF i$="a" THEN
LET a=z
ELSEIF i$="b" THEN
LET b=z
ELSEIF i$="c" THEN
LET c=z
ELSEIF i$="d" THEN
LET d=z
END IF
LOOP UNTIL 0< mrb
!------------
SUB gide(x,y)
PLOT TEXT,AT x,y:"左ボタン押下で、A, B, C, D 4点をドラッグ、自由に変形。"
PLOT TEXT,AT x,y-.07:"右ボタン終了。"
END SUB
!------------
END
|
|
|
戻る
|