- ベストアンサー
Tiny Basicでのグラフィック。。
適当な大きさのグラフィック画面に、横軸-2πから2π、縦軸-3から3までの範囲で、sin、cos、tanのグラフを書け Line (x1,y1)-(x2,y2),CやGLocate (x,y) を使うのはわかるんですが どうしてもできません。。 とりあえず僕はGScreenを(200,100)の大きさでやろうとおもってるんですがとりあえず、 ForeColor="Blue" Line (x1,y1)-(x2,y2),14 GScreen(200,100) ここまでしかできなくて。。 助言お願いします
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
線の色が黒と合わなかったので 背景を白にして白に合う色を探す。 軸について考える。 X軸に平行な軸は LINE(XMIN,Y)-(XMAX,Y) Y軸に平行な軸は LINE(X,YMIN)-(X,YMAX) のコマンドで書く。XとYはそれぞれForでXMINからXMAXまでXAXISUNIT間隔でひいていくことにしよう。(それぞれIとJでループをまわすけど) で、 座標もX=0,Y=0の時,表示する。(俺のプログラムには後述のバグあり) 使うのはGLOCATEとGPRINT 2πを表示したいが表示する方法がわからなかったので 軸の単位を設定し、2と表示することで誤魔化すことにした。 For I = XMIN to XMAX STEP YAXISUNIT LINE(I,YMIN)-(I,YMAX) GLOCATE(I,0) GPRINT I/XUNIT NEXT I For J = YMIN to YMAX LINE(XMIN,J)-(XMAX,J) GPRINT J/YUNIT NEXT J さらにグラフの凡例としてそれぞれ SIN COS TANを表示しておく GLOCATE(0,YMAX - 0.5 * YAXISUNIT) GPRINT "SIN" GLOCATE(0,YMAX - 1.5 * YAXISUNIT) GPRINT "COS" GLOCATE(0,YMAX - 2.5 * YAXISUNIT) GPRINT "TAN" 出来るだけ位置は相対的に指定することにした 尤も、 YMAX-0.5 * YAXISUNIT < YMIN とかだったりすると表示されないのだけれど。 ただ、先ほど述べたバグというのは X座標が0,Y座標が0の時に座標や文字列を表示しているので XMAX < 0とかYMAX < 0だったり XMIN > 0とかYMIN > 0だったりすると 画面外に行ってしまい表示されない。 その点を加味して修正した俺のコードは GLOCATE((XMAX + XMIN)/2,YMAX - 0.5 * YAXISUNIT) GPRINT "SIN" となっている。 あとは今までの内容を全て繋げて、一本のプログラムにするだけだ。 今までの話でXAXISUNITやXUNITは入っていないので、初期値の代入を最初に 追加して実行した、というわけ。
その他の回答 (4)
- himajin100000
- ベストアンサー率54% (1660/3060)
俺が普段使うVB.NETなんかだとそういうことはないんだけど, ちょっと怖かったからFor~Nextで使う変数やX1,X2,X3なんかが混在していてわかりにくいかもしれない。 閑話休題。これが製作側の視点。 ★例えば1cmしか幅がないところに10000個の異なる「点」を打ったとしようか 打ち終わった結果は人間の目には殆ど線しか見えない・・・よね、多分。 ★何?sin(X)のグラフだって?線になっているはずだから・・・ ええい、XMIN = -2πからXMAX = 2πまで点をXSPLITTER = 1000個打って線に見えるようにしてしまえっ! -2πから2πまでX座標が等間隔になるように1000個打つとすると #注意:実際には0から1000なので打っている点は1001個でした。ごめんなさい。) その時x座標はX1は X1 = - 2π + K * {2π - (-2π)} / 1000 ( K = 0,1,2・・・1000) 変数を使って式を書くなら X1 = XMIN + K * (XMAX - XMIN) / XSPLITTER ( K = 0,1,2・・・1000) このときのy座標はsin(X1) つまり (X1,sin(X1))に点を打つから ========================= FOR K = 0 to 1000 X1 = XMIN + K * (XMAX - XMIN) / XSPLITTER PSET(X1,sin(X1)) NEXT K =========================== をやれば達成できる。 #別にKでもNでも何でもいいです。 で、同様の手法でcos関数もtan関数も出来る。 #こういう方針なので描いたtan(x)グラフの+∞,-∞のところはかすれているはず。縦の移動量の増え方が半端じゃなく増えるからね。 グラフの色をそれぞれ変えたいから ForeColorをそれぞれの手前でセットしておこう。 で一番最初に各変数をセット。 ======================= XMIN = -2 * PI XMAX = 2 * PI YMIN = -3 YMAX = 3 XSPLITTER = 1000 ==================== んでもって設定を。 ================= GScreen (500,500) '(多分表示領域の大きさ) Window(XMIN,YMIN)-(XMAX,YMAX) '(表示領域にどういう座標を設定するか) MathGraph On '(グラフ描写) Backcolor = "BLACK" =================== を書く。全部つなげると以下のようになる。 ========================= XMIN = -2 * PI XMAX = 2 * PI YMIN = -3 YMAX = 3 XSPLITTER = 1000 Backcolor = "BLACK" GScreen (500,500) '(多分表示領域の大きさ) Window(XMIN,YMIN)-(XMAX,YMAX) '(表示領域にどういう座標を設定するか) MathGraph On '(グラフ描写) ForeColor="RED" FOR K = 0 to 1000 X1 = XMIN + K * (XMAX - XMIN) / XSPLITTER PSET(X1,sin(X1)) NEXT K ForeColor="GREEN" For L =0 to XSPLITTER X2 = XMIN + L * (XMAX - XMIN)/ XSPLITTER PSET(X2,cos(X2)) Next L ForeColor="PURPLE" For M =0 to XSPLITTER X3 =XMIN + M * (XMAX - XMIN)/ XSPLITTER PSET(X3,tan(X3)) Next M ========================= とりあえず描けたけど、なーんかさびしいんだよな・・・ 軸と座標がないからかなあ・・・、ということで軸を書くことに決めた。 #疲れたので続編は気が向いたら。明日には書くつもりだよ。 わかんないことがあったらガンガン聞いてね。結構質問者さんは勉強熱心なようだから。 ☆☆☆☆☆☆☆☆☆☆ #ところで,#3のコードは見る限り,0.1を1000回足している。 だから0.1 * 1000 = 100になる・・・・はずなんだけど 実行してみるとそうはならない。 99.9999999999999991 になるはずなんだ。 これは 『人間は数字を10進数,場合によっては,分数、根、複素数使って考えるけど,コンピュータが数字を2進数で管理する。 で10進数→2進数に変換できない数字がある。 なので記憶できる最も近い数字を記録するんだけど,このとき 10進数の数と2進数の数にはわずかに差が出るんだ。 この差が小さいうちはいいけど、1000回も足すと,その差が人間に認識しやすいレベルにまできちゃって,数字がずれるんだね。
- himajin100000
- ベストアンサー率54% (1660/3060)
'#2がどういうことかというのは以下のプログラムの結果を考えるとわかる sum = 0 For x = 1 to 1000 sum = sum + 0.1 Next x print sum
お礼
すごいです!! ちゃんとグラフがでました。 なんか、すごすぎです。 背景は白のままでちょうどよかったので(笑 やっぱり、難しいですね。。 いったいなにがどのような役割してるのか僕には難しいです^^; よかったらどのプログラムがどのような意味をもっているのかおしえてもらえませんか?
- himajin100000
- ベストアンサー率54% (1660/3060)
んー。小数の誤差が重なると目盛りの描写がうまくいかない・・・
- himajin100000
- ベストアンサー率54% (1660/3060)
'方眼情報 'X軸の単位 XUNIT = PI '補助線 XAXISUNIT = PI 'X軸の最大値と最小値 XMAX = 2 * PI XMIN = -2 * PI 'Y軸の単位 YUNIT = 1 'Y軸補助線 YAXISUNIT = 1 '縦軸の最大値と最小値 YMAX = 3 YMIN = -3 'グラフの細かさ XSPLITTER = 10000 '背景色 BackColor="WHITE" 'とりあえずサンプルにあったんで乗っけたが、良く調べてない GScreen(500,500) MathGraph On '方眼作成 Window(XMIN,YMIN)-(XMAX,YMAX) ForeColor="BLACK" 'Y軸に平行な線と座標 For I = XMIN to XMAX STEP XAXISUNIT LINE(I,YMIN)-(I,YMAX) GLOCATE(I,0) GPRINT I/XUNIT Next I 'X軸に平行な線と座標 For J = YMIN to YMAX STEP YAXISUNIT LINE(XMIN,J)-(XMAX,J) GLOCATE(0,J) GPRINT J/YUNIT Next J 'SIN関数 ForeColor="RED" For K =0 to XSPLITTER X1 = XMIN + K * (XMAX - XMIN)/ XSPLITTER PSET(X1,sin(X1)) Next K GLOCATE(0,YMAX - 0.5 * YAXISUNIT) GPRINT "SIN" 'COS関数 ForeColor="GREEN" For L =0 to XSPLITTER X2 = XMIN + L * (XMAX - XMIN)/ XSPLITTER PSET(X2,cos(X2)) Next L GLOCATE(0,YMAX - 1.5 * YAXISUNIT) GPRINT "COS" 'TAN関数 ForeColor="PURPLE" For M =0 to XSPLITTER X3 =XMIN + M * (XMAX - XMIN)/ XSPLITTER PSET(X3,tan(X3)) Next M GLOCATE(0,YMAX - 2.5 * YAXISUNIT) GPRINT "TAN" End '横軸の目盛りを2PIとか表示させたかったが, '数→文字列の変換方法がわからなかったので 'X/XUNITにして誤魔化してます。 '・・・・何か納得いかないが。 '使える色のリストを見ていなかったせいか '黒と相性のいい色が思いつかなかったので '背景を白にしてグラフと何のグラフを表すか(凡例)を記述した。 '変数の与え方に依存しないように出来る限り気をつけたつもりだが, '思いつかず,凡例だけ表示位置がいい加減である。 'よって環境によっては表示されない可能性がある
お礼
なんか、わかりやすくていいっすね(笑 とりあえず、問題はできたんで本当にありがとうございました^^
補足
すんません>< 書くとこなかったのでここに。。 今日、学校にもっていったんですがやっぱり他の人と比べるとつかってない文字列がありますね><; とりあえず、友達のをのせます BackColor = "White" GScreen(500,300) Window (-6.2831,-3)-(6.2831,3) MathGraph On ForeColor = "Black" GLocate (0.1,0) GPrint "0" GLocate (0.1,1) GPrint "1" GLocate (0,-1) GPrint "-1" GLocate (3.01,0.4) GPrint "π" GLocate (-3.4,0.4) GPrint "-π" Line (-6.2831,0)-(6.2831,0) Line (0,-3)-(0,3) ForeColor = "Red" GLocate (1.6,1.3) GPrint "Sin(θ)" For i=0 to 10000 x = -10 + 2*i/1000 y = Sin(x) PSet(x,y) Next i ForeColor = "Blue" GLocate (-1,1.3) GPrint "Cos(θ)" For j=0 to 10000 x0 = -10 + 2*j/1000 y0 = Cos(x0) PSet(x0,y0) Next j ForeColor = "Green" GLocate (-0.3,2) GPrint "Tan(θ)" For k=0 to 10000 x1 = -10 + 2*k/1000 y1 = Tan(x1) x2 = -10 + 2*(k+1)/1000 y2 = Tan(x2) Line(x1,y1)-(x2,y2) Next k End 教えてもらったのもこのくらい簡単にはできないものできないものですかね。。><