• ベストアンサー

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) ここまでしかできなくて。。 助言お願いします

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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)

回答No.4

俺が普段使う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回も足すと,その差が人間に認識しやすいレベルにまできちゃって,数字がずれるんだね。

famituu
質問者

お礼

なんか、わかりやすくていいっすね(笑 とりあえず、問題はできたんで本当にありがとうございました^^

famituu
質問者

補足

すんません>< 書くとこなかったのでここに。。 今日、学校にもっていったんですがやっぱり他の人と比べるとつかってない文字列がありますね><; とりあえず、友達のをのせます 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 教えてもらったのもこのくらい簡単にはできないものできないものですかね。。><

全文を見る
すると、全ての回答が全文表示されます。
回答No.3

'#2がどういうことかというのは以下のプログラムの結果を考えるとわかる sum = 0 For x = 1 to 1000 sum = sum + 0.1 Next x print sum

famituu
質問者

お礼

すごいです!! ちゃんとグラフがでました。 なんか、すごすぎです。 背景は白のままでちょうどよかったので(笑 やっぱり、難しいですね。。 いったいなにがどのような役割してるのか僕には難しいです^^; よかったらどのプログラムがどのような意味をもっているのかおしえてもらえませんか?

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

んー。小数の誤差が重なると目盛りの描写がうまくいかない・・・

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

'方眼情報 '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にして誤魔化してます。 '・・・・何か納得いかないが。 '使える色のリストを見ていなかったせいか '黒と相性のいい色が思いつかなかったので '背景を白にしてグラフと何のグラフを表すか(凡例)を記述した。 '変数の与え方に依存しないように出来る限り気をつけたつもりだが, '思いつかず,凡例だけ表示位置がいい加減である。 'よって環境によっては表示されない可能性がある

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 数学の質問

    次の問題について教えてください。 (1)sinθ+cosθ=1/2のときtanθ-1/tanθの値を求めよ。 (2)関数y=2x^3-12x-16のグラフ上の点(x、y)が常に不等式xy≧kを満たすように実数kの値を求めよ。 (1)はtan=sin/cosに変形し解けるかなと思いましたが、sin^2-cos^2が出てきてそこの処理の仕方がわかりません。 (2)は微分してグラフから判断するのかなと思いましたが、そこからさっぱりです。 よろしくお願いします。

  • MS-EXCELのグラフの描き方

    MS-EXCELのグラフの描き方について教えてください. 例えば、投資について、配当性向(x1)と配当性向+ロイヤルティ(x2)に対する投資回収年限(y1)および(y2)の関係を x1(%) 60  70  80  90 y1(年) 6.1 5.3 4.4 3.8 x2(%) 60  70  80  90 y2(年) 5・4 4.6 3.2 2.9 という関係とし、xを縦軸に、yを横軸にした2つの折れ線を示す一つのグラフに表現したいのですが、うまく表現できません。 xを縦軸に、yを横軸にすると折れ線グラフが1つで、y軸の数値がy1とy2の二段に分かれて表示されてしまいます。 どうすればよいか教えてください。

  • 三角比で質問です。助けてください!

    sin,cos,tanの0℃、90℃、180℃、270℃、360℃が公式(sin=r分のy,cos=r分のx,tan=x分のy)に当てはめてもよくわかりませし、答えを導き出せません。 どう考えたらよいでしょうか? 教えてください。 解き方は関数のグラフにして出しています。 お願いします。

  • 三角関数について…

    三角関数のグラフの問題について質問です。 y=sinΘ y=cosΘ y=tanΘ のグラフは書けるのですが、問題で例えば y=cos(Θ-π/6)のグラフを書けなど言われたとき、グラフが平行移動するのは分かりますが、メモリが分かりません。どのような計算で出てきますか? (sin,tanの時でも) よろしくお願いします!

  • 数学の得意な方、答えを教えてください。

    1、直線x+2y-3=0と直線x-2y+2=0との交点と点(-3,0)を通る直線 2、直線3x+4y-6=0と直線2x-5y+2=0との交点と点(1,2)を通る直線 3、0≦θ≦180°のとき、次の不等式を満たすθの範囲を求めよ。 (1)sinθ>√2/2 (2)cosθ≦1/2 (3)tanθ>1 (4)sinθ<1/2 (5)cosθ>-√3/2 (6)tanθ≦√3 (7)sinθ≧√3/2 (8)cosθ<-1/2 (9)tanθ≦0 (10)√2sinθ-1≦0 (11)cosθ+1≦0 (12)√3tanθ+1≧0 お願いします。

  • 三角関数

    授業中すごいうるさくて何も聞こえないんです。 この間の上地が出てた番組の教室みたいな笑 更に、黒板見えないしみたいな感じで。 もうノートも適当なので、何書いてるんだか全然分かりませんし。 先生も生徒になめられるって言うか‥ それで質問ですが、 三角関数のグラフが訳分かりません。 y=sinx y=2sinx y=1/2sinx y=sin1/2x あとsinの所がcosになってる、cos版もやりました。 tanはやってないですが。

  • 微積(微分方程式)

    下記の問題の解き方を教えてください。 1.一般解を求めよ y' + 2y tan x = sin x (答え:y = cos x + C cos^2 x)・・・(1) <自分の解いたやり方(間違っています)> y' + 2y tan x=0 y'= -2y tan x ∫(1/ (2y)) dy = -∫(sin x / cos x) dx log |y| = 2log |cos x| + 2C y/cos^2 x = ±e^2C(=Aとおく) y = u cos^2 x y' = (u'cos^2 x )-2u cos x sin x=(u'cos^2 x )-u sin 2x これを(1)へ代入 u' cos^2 x = sin x u'=(1-cos^2 x)/cos^2 x ∫du = ∫((1/cos^2 x) - 1) dx u=tan x - x + C y=u cos^2 x = cos^2 x(tan x - x + C) // よろしくお願いします。

  • 散布図を縦に2個並べて出力したい

    Excelを使い始めたばかりなのですが、使い方がわからず困っているため質問させていただきます。 例として以下のようなデータがあるときに x y_1 y_2 1 3 9 2 7 2 3 2 3 4 8 6 5 3 1 xの値を横軸にとって縦軸にy_1とy_2の値を取ると 1つのグラフに2つの系列のグラフができると思うんですが、これを1つの系列ごとにグラフにして出したいです。 横軸は揃えて、縦軸は10~0を2回繰り返すようなグラフです。 説明がわかりにくいかもしれませんが、このようなグラフの作り方を教えていただきたいです。 よろしくお願いします。

  • どこが間違えているのでしょうか。

    極座標から直交座標への変換で 媒介変数を用いて、 中心は原点、半径1の円を表すと x=cosθ-(1) y=sinθ-(2) となります。 (1)にsinθを、(2)にcosθをかけると、 x sinθ=sinθcosθ y cosθ=sinθcosθ 右辺が等しいから x sinθ=y sinθ sinθで割って y=sinθ/cosθ x y=tanθx でもこれはtanθが傾きなので、明らかに直線の方程式ですよね? どこで間違えたのでしょうか。

  • 三角関数の微分

    三角関数の微分が解けません。 三角関数の法則を利用して答えは纏めた形になるのですが、上手く纏める方法が思いつきません。 1. y=sin^2xcos^3(2x) y'=2sinxcosx*cos^3(2x)+sin^2x*(-6)cos^2xsinx Ans:y'=sin2xcos^2(2x)*{1-8sin^2(x)} 2sinxcosxを2倍角の公式を利用したりして纏めましたが答えにたどり着けません。 また、 2. y=sinx/1+tan^2(x) y'=cosx{1+tan^2(x)}-sinx*2tanx{1/cos^2(x)} Ans:y'=cosx{1-3sin^2(x)} 纏め方について助言お願いします。