投稿者:南澤
投稿日:2012年 5月28日(月)13時33分14秒
|
|
|
ベーシックで星形を書き、中に色を塗りたいのですが…
REM 角度をDEGREE(度)に指定
OPTION ANGLE DEGREES
SET WINDOW 0,400,0,400
CLEAR
REM cx=中心X,cy=中心y,r=大きさ
LET cx=200
LET cy=200
LET r=200
LET px=cx+sin(0)*r
LET py=cy+cos(0)*r
PLOT LINES: px,py;
DO
INPUT PROMPT "3以上の奇数を入力してください ":n
LET n=INT(n)
LOOP WHILE n<3 OR INT(n/2)=(n/2)
FOR i=1 TO n
LET px=cx+SIN(360/n*i*2)*r
LET py=cy+COS(360/n*i*2)*r
PLOT px,py;
NEXT i
END
此れで星形は書いてみました。しかし、色を塗ることが出来ません…。
赤で塗るのならば
SET AREA COLOR "red"
paint 1,1
だと思うのですが、星形がわかれているため
paint 1,1を何処に挿入すれば良いのか分かりません。
最初の書き方では色は塗れないのでしょうか?
|
|
|
投稿者:山中和義
投稿日:2012年 5月29日(火)10時08分23秒
|
|
|
> No.1891[元記事へ]
南澤さんへのお返事です。
> ベーシックで星形を書き、中に色を塗りたいのですが…
> 赤で塗るのならば
> SET AREA COLOR "red"
> paint 1,1
> だと思うのですが、星形がわかれているため
> paint 1,1を何処に挿入すれば良いのか分かりません。
FULL BASIC仕様なら、paint文はありませんので、
!星型多角形
SET WINDOW 0,400,0,400
LET N=5 !星型n角形
LET CX=200 !中心
LET CY=200
LET R=200 !半径
LET R2=120 !0<R2<R
DIM PX(0 TO 2*N-1),PY(0 TO 2*N-1) !正n角形の頂点列 ※正2n角形と考える
FOR i=0 TO N-1 !凸側
LET K=2*i
LET T=2*PI*K/(2*N)
LET PX(K)=CX+SIN(T)*R !※X軸とY軸を入れ替える
LET PY(K)=CY+COS(T)*R
NEXT i
FOR i=0 TO N-1 !凹側
LET K=2*i+1
LET T=2*PI*K/(2*N)
LET PX(K)=CX+SIN(T)*R2
LET PY(K)=CY+COS(T)*R2
NEXT i
SET AREA COLOR "RED"
MAT PLOT AREA, LIMIT 2*N: PX,PY
END
とするのが良いでしょう。簡易図形描画の手法です。
FULL BASIC仕様なら、塗り潰しは、閉領域を使って行います。
!星型多角形
!円をn等分し、その頂点からm進んだ頂点へ線分を引いていき、
!元の頂点に戻るまで繰り返したときにできる形を正(n/m)角形とする。
!ただし、2*m<nの自然数とする。
!m≡1 (mod n)なら、通常の正n角形
!m≡2 (mod n)なら、星型正n角形(その1)
!m≡3 (mod n)なら、星型正n角形(その2)
! :
! :
SET WINDOW 0,400,0,400
LET N=5 !正(n/m)角形
LET M=2
LET CX=200 !中心
LET CY=200
LET R=200 !半径
DIM PX(0 TO N-1),PY(0 TO N-1) !正n角形の頂点列
LET S=0
FOR i=0 TO N-1
LET T=2*PI*S/N
LET PX(i)=CX+SIN(T)*R !※X軸とY軸を入れ替える
LET PY(i)=CY+COS(T)*R
LET S=MOD(S+M,N) !m間隔
NEXT i
SET AREA COLOR "RED"
MAT PLOT AREA, LIMIT N: PX,PY
END
となります。
内部の正n角形の大きさを計算するのは、簡単にはいかないようです。
ただ、FULL BASIC仕様以外なら、
SET LINE COLOR "RED"
SET AREA COLOR "RED"
paint CX,CY
を最後に追加すれば目的は達成できます。
|
|
|
投稿者:しばっち
投稿日:2012年 5月29日(火)20時39分24秒
|
|
|
> No.1892[元記事へ]
山中和義さんへのお返事です。
> 内部の正n角形の大きさを計算するのは、簡単にはいかないようです。
対象とする図から直線2本を選び出し
直線の方程式から交点を求める
LET N=7
LET X1=COS(PI/2) !'半径1とする 頂点1番
LET Y1=SIN(PI/2)
LET X2=COS(PI/2+2*PI/N) !'頂点2番
LET Y2=SIN(PI/2+2*PI/N)
LET X3=COS(PI/2+2*PI/N*2) !'頂点3番
LET Y3=SIN(PI/2+2*PI/N*2)
LET XN=COS(PI/2+2*PI/N*(N-1)) !'頂点N番
LET YN=SIN(PI/2+2*PI/N*(N-1))
!'頂点1と頂点3を結ぶ直線,頂点2と頂点Nを結ぶ直線との交点
CALL CROSS(X1,Y1,X3,Y3,X2,Y2,XN,YN,XX,YY)
LET RR=SQR(XX^2+YY^2) !'原点からの距離(比率)
SET WINDOW 0,400,0,400
LET CX=200 !中心
LET CY=200
LET R=200 !半径
LET R2=R*RR
DIM PX(0 TO 2*N-1),PY(0 TO 2*N-1) !正n角形の頂点列 ※正2n角形と考える
FOR i=0 TO N-1 !凸側
LET K=2*i
LET T=2*PI*K/(2*N)
LET PX(K)=CX+SIN(T)*R !※X軸とY軸を入れ替える
LET PY(K)=CY+COS(T)*R
NEXT i
FOR i=0 TO N-1 !凹側
LET K=2*i+1
LET T=2*PI*K/(2*N)
LET PX(K)=CX+SIN(T)*R2
LET PY(K)=CY+COS(T)*R2
NEXT i
SET AREA COLOR "RED"
MAT PLOT AREA, LIMIT 2*N: PX,PY
END
EXTERNAL SUB CROSS(X1,Y1,X2,Y2,X3,Y3,X4,Y4,X,Y)
!'点(X1,Y1)と点(X2,Y2)を結ぶ直線
!'点(X3,Y3)と点(X4,Y4)を結ぶ直線
!'との交点(X,Y)を求める
LET A=(Y2-Y1)/(X2-X1)
LET B=(Y4-Y3)/(X4-X3)
LET X=(Y3-Y1+A*X1-B*X3)/(A-B)
LET Y=A*X+Y1
END SUB
|
|
|
投稿者:南澤
投稿日:2012年 5月30日(水)10時54分0秒
|
|
|
ありがとうございました。
星形と言っても書き方は色々あるんですね…まだまだ分からないことだらけなので色々試してみます。
今日も質問したいのですが、円周率を出す公式は色々あると読んだのですが、大きい桁を出すにはどの方法が一番適しているのでしょうか?
幾つか教えていただきたいのですが、よろしくお願いします。
|
|
|
投稿者:山中和義
投稿日:2012年 5月30日(水)11時49分59秒
|
|
|
> No.1896[元記事へ]
南澤さんへのお返事です。
> 円周率を出す公式は色々あると読んだのですが、大きい桁を出すにはどの方法が一番適しているのでしょうか?
リンク集にまとめたサイトがあります。プログラムも掲載されています。
KK62526のホームページ 内
個人的には、
・PCのベンチマーク(性能評価)に使われている
マチンの公式 π/4=4*ArcTan(1/5)-ArcTan(1/239)
・収束が速い
ガウス-ルジャンドル公式
でしょうか。
|
|
|
投稿者:南澤
投稿日:2012年 5月30日(水)14時46分40秒
|
|
|
> No.1897[元記事へ]
山中和義さんへのお返事です。
いつもありがとうございます。
円周率と言っても、ほんとに沢山あるんですね…
マチンの公式
ガウス-ルジャンドル公式
両方試してみたいと思います。
|
|
|
投稿者:南澤
投稿日:2012年 5月31日(木)13時50分18秒
|
|
|
> No.1897[元記事へ]
山中和義さんへのお返事です。
ガウス-ルジャンドル公式が上手く行きません。
1000まで出そうとすると、エラーが出てしまいます。
どうしてなのでしょうか…?
|
|
|
投稿者:南澤
投稿日:2012年 6月 7日(木)11時37分43秒
|
|
|
自分でもまだ問題の意味から模索している状態なのですが…
三角関数のプログラミングで質問なのですが、
与えられたd∈[-1,1]に大してsin^-1d(=arcsin d)を計算するプログラムで、
sin^-1(1/2)を計算する…と言うのは、どう言った意味なのでしょうか?
|
|
|
投稿者:山中和義
投稿日:2012年 6月 7日(木)12時41分15秒
|
|
|
> No.1903[元記事へ]
南澤さんへのお返事です。
> sin^-1(1/2)を計算する…と言うのは、どう言った意味なのでしょうか?
sinθ=1/2となるθを求めるということです。(逆三角関数)
ちなみに、これを使って円周率を求めると、
ArcSin(x)のマクローリン展開にx=1/2を代入する方法
sin30°=sinπ/6=1/2なので、π/6=ArcSin(1/2)となる。
右辺をマクローリン展開して、π=6 Σ[n=0,∞](2n)!/(2^(4n+1)(n!)^2(2n+1))
OPTION ARITHMETIC DECIMAL_HIGH !1000桁
LET A=0.5
LET S=0
LET N=0
DO WHILE A>=1E-1000 !誤差が十分小さいなら、終了する
LET S=S+A !n項目を加算する
LET N=N+1 !次へ
LET A=A*(2*N-1)*(2*N-1)
LET A=A/(8*N*(2*N+1))
LOOP
PRINT N; S*6
END
|
|
|
投稿者:南澤
投稿日:2012年 6月 8日(金)13時53分54秒
|
|
|
> No.1904[元記事へ]
山中和義さんへのお返事です。
ありがとうございます。
sinθ=1/2となるθを求めるということです。(逆三角関数)
……此れを、逆三角関数を用いずに計算したいのですが、
此の場合はどうしたらいいのでしょうか?
|
|
|
投稿者:山中和義
投稿日:2012年 6月 8日(金)14時34分26秒
|
|
|
> No.1905[元記事へ]
南澤さんへのお返事です。
> sinθ=1/2となるθを求めるということです。(逆三角関数)
> ……此れを、逆三角関数を用いずに計算したいのですが、
> 此の場合はどうしたらいいのでしょうか?
!ArcSin(x)のテイラー展開
! ArcSin(x)
!=Σ[n=0,∞](2n)!/{(n!)^2(4^n)(2n+1)}x^(2n+1)
!=Σ[n=0,∞]{(-1)^nC(-1/2,n)/(2n+1)}x^(2n+1)
FOR x=-1 TO 1 STEP 0.1
LET S=0
FOR n=0 TO 200
LET S=S+(-1)^n*COMB(-1/2,n)*x^(2*n+1)/(2*n+1)
NEXT n
PRINT STR$(x);": "; S; ASIN(x)
NEXT x
END
|
|
|
投稿者:奈央
投稿日:2012年 6月 8日(金)15時57分8秒
|
|
|
質問なんですが、x^2-a=0のaをだす方法が知りたいです。1000桁で出したいんですがどうしたらいいですか?
|
|
|
投稿者:山中和義
投稿日:2012年 6月 8日(金)18時45分28秒
|
|
|
> No.1907[元記事へ]
奈央さんへのお返事です。
> 質問なんですが、x^2-a=0のaをだす方法が知りたいです。1000桁で出したいんですがどうしたらいいですか?
サンプルプログラム(Mathフォルダ内NEWTON.BAS)を1000桁モードで実行してください。
|
|
|
投稿者:奈央
投稿日:2012年 6月 8日(金)19時21分56秒
|
|
|
> No.1908[元記事へ]
山中和義さんへのお返事です。
ありがとうございます!
サンプルプログラム(Mathフォルダ内NEWTON.BAS)ってパソコンに入ってるんですか?
|
|
|
投稿者:山中和義
投稿日:2012年 6月 8日(金)19時39分52秒
|
|
|
> No.1909[元記事へ]
奈央さんへのお返事です。
> サンプルプログラム(Mathフォルダ内NEWTON.BAS)ってパソコンに入ってるんですか?
十進BASICをインストールすると、通常、CドライブのBASICw32フォルダに入ります。
その中にMathフォルダもあります。
見つからなかった場合のために、、、
! ニュートン法によって平方根を求める。
DEF f(x)=x^2-a
DEF g(x)=2*x ! g(x)=f'(x)
INPUT a
LET x=a
LET E=EPS(1)*10
DO
LET x1=x-f(x)/g(x)
PRINT x1
IF ABS((x1-x)/x)<E THEN EXIT DO
LET x=x1
LOOP
END
|
|
|
投稿者:しばっち
投稿日:2012年 6月10日(日)17時45分31秒
|
|
|
南澤さんへのお返事です。
> ……此れを、逆三角関数を用いずに計算したいのですが、
> 此の場合はどうしたらいいのでしょうか?
f(x)=sin(x)-t としてニュートン法などで求めることができます。
下記ではbailey法(halley法)を用いています。ニュートン法よりも速く、3次収束します。
http://poset.jp/orfm/node3.html
PUBLIC NUMERIC T
INPUT PROMPT "ASIN(X) 0<X<1 X=":T
LET XX=T
DO
LET X=XX
LET XX=X-F(X)/(DIFF1(X)-.5*DIFF2(X)*F(X)/DIFF1(X))
LOOP UNTIL X=XX
PRINT X,ASIN(T)
END
EXTERNAL FUNCTION F(X)
LET F=SIN(X)-T
END FUNCTION
EXTERNAL FUNCTION DIFF1(X)
LET DIFF1=COS(X)
END FUNCTION
EXTERNAL FUNCTION DIFF2(X)
LET DIFF2=-SIN(X)
END FUNCTION
また∫1/√(1-x*x)dx=Arcsin(x)より数値積分でも求められます。
INPUT PROMPT "ASIN(X) 0<X<1 X=":X
PRINT INTEGRAL4(0,X,100),ASIN(X)
END
EXTERNAL FUNCTION INTEGRAL4(A,B,N)
LET N=N*3
LET H=(B-A)/N
FOR K=0 TO N/3-1
LET S=S+3/8*H*F(A+H*3*K)+9/8*H*F(A+H*(3*K+1))+9/8*H*F(A+H*(3*K+2))+3/8*H*F(A+H*(3*K+3))
NEXT K
LET INTEGRAL4=S
END FUNCTION
EXTERNAL FUNCTION F(X)
LET F=1/SQR(1-X*X)
END FUNCTION
更に下記の方法でも求めることができます。
INPUT PROMPT "ASIN(X) 0<X<1 X=":X
LET S = X
LET C = SQR(1 - S * S)
DO WHILE ABS(1 - C) > 1E-10
LET C = SQR((1 + C) / 2)
LET S = S / C
LOOP
PRINT S, ATN(X / SQR(1 - X * X))
END
|
|
|
戻る