反比例・2次関数のグラフ


前回の「1次関数のグラフ」を応用して、
・反比例のグラフ
・2次関数のグラフ
にチャレンジしてみます。

反比例のグラフ

前回の方眼紙バージョンのグラフ作成プログラムを改造してみます。
まず、反比例用のy = a/xの式を表示するテキストボックスを追加します。

GraphicsWindow.DrawText(10, 40, "x +")
GraphicsWindow.DrawText(80, 40, "/ x")

hanpirei = Controls.AddTextBox(40, 40)
Controls.SetSize(hanpirei, 30, 20)

変数「hanpirei」が反比例の定数になります。

グラフ作成ボタンは以下のように変更しました。

Graph = Controls.AddButton("Graph", 200, 10)
Graph2 = Controls.AddButton("Graph2", 200, 40)
Controls.ButtonClicked = OnTick

前回はボタンが一つだけだったので、ボタンに名前は付けませんでした。
ですが以降はボタンの数が増えるために、「Graph」「Graph2」という安易でわかりにくいボタン名を付けました。

そして、ボタンを押した時のサブルーチン「OnTick」は、「Controls.LastClickedButton」を使って、「最後に押したボタンが○○だったら××のグラフを書く」というIf構文にしてみます。
が、ひとつ注意しなければならないことがあります。
反比例の場合、x=0の時の解が存在しません。
1次関数のように「For i = -windowsize/2 To windowsize/2 Step 1」で計算すると、途中にゼロを挟むので、実行した途端にエラーが出ます。
この部分を直さなければなりませんね。
サブルーチン「OnTick」は以下のように直しました。

Sub OnTick
If Controls.LastClickedButton = Graph Then
a = Controls.GetTextBoxText(katamuki)
b = Controls.GetTextBoxText(seppen)
  For i = -windowsize/2 To windowsize/2 Step 1
    x = i
    y = -a * i - b
    GraphicsWindow.PenColor = "red"
    GraphicsWindow.DrawEllipse(x * 10 + windowsize/2, y * 10 + windowsize/2, 1, 1)
  EndFor
EndIf
  If Controls.LastClickedButton = Graph2 Then
    c = Controls.GetTextBoxText(hanpirei)
    For i = -windowsize/2 To -0.1 Step 0.1
    x = i
    y = -c / i
    GraphicsWindow.PenColor = "green"
    GraphicsWindow.DrawEllipse(x * 10 + windowsize/2, y * 10 + windowsize/2, 1, 1)
  EndFor
      For i = 0.1 To windowsize/2 Step 0.1
    x = i
    y = -c / i
    GraphicsWindow.PenColor = "green"
    GraphicsWindow.DrawEllipse(x * 10 + windowsize/2, y * 10 + windowsize/2, 1, 1)
  EndFor
EndIf
EndSub

最初の「If Controls.LastClickedButton = Graph Then」〜は、前回の1次関数の部分を「最後に押されたボタンがGraphボタンの時に実行する」に修正してあります。
次の「If Controls.LastClickedButton = Graph2 Then」〜が反比例用に付け足した部分です。
For i = -windowsize/2 To -0.1 Step 0.1」と、「For i = 0.1 To windowsize/2 Step 0.1」に分けました。
i=-0.1から+0.1まで計算させないようにした、ということです。
ということで、以下が完成形。

GraphicsWindow.Title = "Graph"
GraphicsWindow.BackgroundColor = "white"
windowsize = 600
GraphicsWindow.Width = windowsize
GraphicsWindow.Height = windowsize

For i = 1 To windowsize/20
GraphicsWindow.PenColor = "PowderBlue"
GraphicsWindow.DrawLine(0, windowsize/2 + i * 10, windowsize, windowsize/2 + i * 10)
GraphicsWindow.DrawLine(0, windowsize/2 - i * 10, windowsize, windowsize/2 - i * 10)
EndFor

For i = 1 To windowsize/20
GraphicsWindow.PenColor = "PowderBlue"
GraphicsWindow.DrawLine(windowsize/2 + i * 10, 0, windowsize/2 + i * 10, windowsize)
GraphicsWindow.DrawLine(windowsize/2 - i * 10, 0, windowsize/2 - i * 10, windowsize)
EndFor

GraphicsWindow.PenColor = "blue"
GraphicsWindow.DrawLine(0, windowsize/2, windowsize, windowsize/2)
GraphicsWindow.DrawLine(windowsize/2, 0, windowsize/2, windowsize)

GraphicsWindow.DrawText(10, 10, "x +")
GraphicsWindow.DrawText(75, 10, "x +")

katamuki = Controls.AddTextBox(40, 10)
Controls.SetSize(katamuki, 30, 20)

seppen = Controls.AddTextBox(100, 10)
Controls.SetSize(seppen, 30, 20)

GraphicsWindow.DrawText(10, 40, "x +")
GraphicsWindow.DrawText(80, 40, "/ x")

hanpirei = Controls.AddTextBox(40, 40)
Controls.SetSize(hanpirei, 30, 20)

Graph = Controls.AddButton("Graph", 200, 10)
Graph2 = Controls.AddButton("Graph2", 200, 40)
Controls.ButtonClicked = OnTick

Sub OnTick
If Controls.LastClickedButton = Graph Then
a = Controls.GetTextBoxText(katamuki)
b = Controls.GetTextBoxText(seppen)
  For i = -windowsize/2 To windowsize/2 Step 1
    x = i
    y = -a * i - b
    GraphicsWindow.PenColor = "red"
    GraphicsWindow.DrawEllipse(x * 10 + windowsize/2, y * 10 + windowsize/2, 1, 1)
  EndFor
EndIf
  If Controls.LastClickedButton = Graph2 Then
    c = Controls.GetTextBoxText(hanpirei)
    For i = -windowsize/2 To -0.1 Step 0.1
    x = i
    y = -c / i
    GraphicsWindow.PenColor = "green"
    GraphicsWindow.DrawEllipse(x * 10 + windowsize/2, y * 10 + windowsize/2, 1, 1)
  EndFor
      For i = 0.1 To windowsize/2 Step 0.1
    x = i
    y = -c / i
    GraphicsWindow.PenColor = "green"
    GraphicsWindow.DrawEllipse(x * 10 + windowsize/2, y * 10 + windowsize/2, 1, 1)
  EndFor
EndIf
EndSub

実行結果は以下のとおり。

グラフ1

2次関数のグラフ

2次関数の式はy = ax2 + bx + cですね。
(中学校だとb = 0かつc = 0の場合しか習わないけど)
反比例のようにエラーが出る数字がないので簡単です。
下がプログラム全体ですが、太字部分が2次関数として追加したところです。
変数の名前がどんどん適当になっていますが、気にしないでください。

GraphicsWindow.Title = "Graph"
GraphicsWindow.BackgroundColor = "white"
windowsize = 600
GraphicsWindow.Width = windowsize
GraphicsWindow.Height = windowsize

For i = 1 To windowsize/20
GraphicsWindow.PenColor = "PowderBlue"
GraphicsWindow.DrawLine(0, windowsize/2 + i * 10, windowsize, windowsize/2 + i * 10)
GraphicsWindow.DrawLine(0, windowsize/2 - i * 10, windowsize, windowsize/2 - i * 10)
EndFor

For i = 1 To windowsize/20
GraphicsWindow.PenColor = "PowderBlue"
GraphicsWindow.DrawLine(windowsize/2 + i * 10, 0, windowsize/2 + i * 10, windowsize)
GraphicsWindow.DrawLine(windowsize/2 - i * 10, 0, windowsize/2 - i * 10, windowsize)
EndFor

GraphicsWindow.PenColor = "blue"
GraphicsWindow.DrawLine(0, windowsize/2, windowsize, windowsize/2)
GraphicsWindow.DrawLine(windowsize/2, 0, windowsize/2, windowsize)

GraphicsWindow.DrawText(10, 10, "x +")
GraphicsWindow.DrawText(75, 10, "x +")

katamuki = Controls.AddTextBox(40, 10)
Controls.SetSize(katamuki, 30, 20)

seppen = Controls.AddTextBox(100, 10)
Controls.SetSize(seppen, 30, 20)

GraphicsWindow.DrawText(10, 40, "x +")
GraphicsWindow.DrawText(80, 40, "/ x")

hanpirei = Controls.AddTextBox(40, 40)
Controls.SetSize(hanpirei, 30, 20)

GraphicsWindow.DrawText(10, 70, "x +")
GraphicsWindow.DrawText(75, 70, "x +")
GraphicsWindow.DrawText(131, 70, "x +")
GraphicsWindow.DrawText(79, 65, "2")

nijoua = Controls.AddTextBox(40, 70)
Controls.SetSize(nijoua, 30, 20)

nijoub = Controls.AddTextBox(100, 70)
Controls.SetSize(nijoub, 30, 20)

nijouc = Controls.AddTextBox(155, 70)
Controls.SetSize(nijouc, 30, 20)

Graph = Controls.AddButton("Graph", 200, 10)
Graph2 = Controls.AddButton("Graph2", 200, 40)
Graph3 = Controls.AddButton("Graph3", 200, 70)
Controls.ButtonClicked = OnTick

Sub OnTick
If Controls.LastClickedButton = Graph Then
a = Controls.GetTextBoxText(katamuki)
b = Controls.GetTextBoxText(seppen)
  For i = -windowsize/2 To windowsize/2 Step 1
    x = i
    y = -a * i - b
    GraphicsWindow.PenColor = "red"
    GraphicsWindow.DrawEllipse(x * 10 + windowsize/2, y * 10 + windowsize/2, 1, 1)
  EndFor
EndIf
  If Controls.LastClickedButton = Graph2 Then
    c = Controls.GetTextBoxText(hanpirei)
    For i = -windowsize/2 To -0.1 Step 0.1
    x = i
    y = -c / i
    GraphicsWindow.PenColor = "green"
    GraphicsWindow.DrawEllipse(x * 10 + windowsize/2, y * 10 + windowsize/2, 1, 1)
  EndFor
      For i = 0.1 To windowsize/2 Step 0.1
    x = i
    y = -c / i
    GraphicsWindow.PenColor = "green"
    GraphicsWindow.DrawEllipse(x * 10 + windowsize/2, y * 10 + windowsize/2, 1, 1)
  EndFor
EndIf
If Controls.LastClickedButton = Graph3 Then
d = Controls.GetTextBoxText(nijoua)
e = Controls.GetTextBoxText(nijoub)
f = Controls.GetTextBoxText(nijouc)
  For i = -windowsize/2 To windowsize/2 Step 0.1
    x = i
    y = -d * i * i - e * i - f
    GraphicsWindow.PenColor = "red"
    GraphicsWindow.DrawEllipse(x * 10 + windowsize/2, y * 10 + windowsize/2, 1, 1)
  EndFor
EndIf
EndSub

グラフ2

次:アナログ時計


▲TOPへ戻る