(無題)

 投稿者:南澤  投稿日: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を何処に挿入すれば良いのか分かりません。
最初の書き方では色は塗れないのでしょうか?
 

Re: (無題)

 投稿者:山中和義  投稿日: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

を最後に追加すれば目的は達成できます。
 

Re: (無題)

 投稿者:しばっち  投稿日: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秒
  ありがとうございました。
星形と言っても書き方は色々あるんですね…まだまだ分からないことだらけなので色々試してみます。
今日も質問したいのですが、円周率を出す公式は色々あると読んだのですが、大きい桁を出すにはどの方法が一番適しているのでしょうか?
幾つか教えていただきたいのですが、よろしくお願いします。
 

Re: (無題)

 投稿者:山中和義  投稿日:2012年 5月30日(水)11時49分59秒
  > No.1896[元記事へ]

南澤さんへのお返事です。

> 円周率を出す公式は色々あると読んだのですが、大きい桁を出すにはどの方法が一番適しているのでしょうか?

リンク集にまとめたサイトがあります。プログラムも掲載されています。
 KK62526のホームページ 内


個人的には、
・PCのベンチマーク(性能評価)に使われている
 マチンの公式 π/4=4*ArcTan(1/5)-ArcTan(1/239)
・収束が速い
 ガウス-ルジャンドル公式
でしょうか。
 

Re: (無題)

 投稿者:南澤  投稿日:2012年 5月30日(水)14時46分40秒
  > No.1897[元記事へ]

山中和義さんへのお返事です。

いつもありがとうございます。
円周率と言っても、ほんとに沢山あるんですね…
マチンの公式
ガウス-ルジャンドル公式
両方試してみたいと思います。
 

Re: (無題)

 投稿者:南澤  投稿日: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)を計算する…と言うのは、どう言った意味なのでしょうか?
 

Re: (無題)

 投稿者:山中和義  投稿日: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
 

Re: (無題)

 投稿者:南澤  投稿日:2012年 6月 8日(金)13時53分54秒
  > No.1904[元記事へ]

山中和義さんへのお返事です。

ありがとうございます。
sinθ=1/2となるθを求めるということです。(逆三角関数)
……此れを、逆三角関数を用いずに計算したいのですが、
此の場合はどうしたらいいのでしょうか?
 
 

Re: (無題)

 投稿者:山中和義  投稿日: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桁で出したいんですがどうしたらいいですか?  

Re: (無題)

 投稿者:山中和義  投稿日:2012年 6月 8日(金)18時45分28秒
  > No.1907[元記事へ]

奈央さんへのお返事です。

> 質問なんですが、x^2-a=0のaをだす方法が知りたいです。1000桁で出したいんですがどうしたらいいですか?

サンプルプログラム(Mathフォルダ内NEWTON.BAS)を1000桁モードで実行してください。
 

Re: (無題)

 投稿者:奈央  投稿日:2012年 6月 8日(金)19時21分56秒
  > No.1908[元記事へ]

山中和義さんへのお返事です。

ありがとうございます!
サンプルプログラム(Mathフォルダ内NEWTON.BAS)ってパソコンに入ってるんですか?
 

Re: (無題)

 投稿者:山中和義  投稿日: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
 

Re: (無題)

 投稿者:しばっち  投稿日: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
 

戻る