対数軸はY軸ではなくX軸でしたね。
なので,
Dim logY As Double
logY = Math.Log(y, 10)
は
Dim logX As Double
logX = Math.Log(x, 10)
と読み替えてください。
で,グラフですが,今回の場合だと,y = f(x)の形式ですから,
xを変化させながら(logX, y)をDrawLineで結んでいけばよいことになります。
画面は方眼紙だと思って,まずは方眼紙に自分でグラフを書くことを考えてください。
ただし,DrawLineを使う場合はフリーハンドではなく,定規で線を結ぶことになります。
さて,方眼紙には最初から座標が振ってあります。
この座標は印刷されていて,変更できない物と考えてください。
ここに自分でグラフを書くなら,その座標と書きたい座標の対応を考えますよね。
それと同じ事を,コードで書くことになります。
で,言葉で説明しようと思っていたのですが,チェック用にコードを書いたので手抜きして載せてしまいます。
Const a As Double ' a
Dim width As Integer ' Control.ClientSize.WidthやImage.Width等から得られる描画領域の幅
Dim height As Integer ' Control.ClientSize.HeightやImage.Height等から得られる描画領域の高さ
Dim g As Graphics ' 出力先のGraphicsオブジェクト
Dim previousLogX As Double = Math.Log(1, 10.0) ' 一つ前の点のLog Xの値
Dim previousY As Double = 1 / (1 + a) ' 一つ前の点のYの値
Dim scaleX As Double = 2 ' スケーリング用。Log Xの最大値
Dim scaleY As Double = previousY ' スケーリング用。Yの最大値
For x As Integer = 2 To 100 ' 1は計算済み
Dim logX As Double = Math.Log(x, 10)
Dim y As Double = 1 / (x + a)
' 座標を計算する
Dim prevPosX As Integer = CType(Math.Floor(width * previousLogX / scaleX), Integer)
Dim prevPosY As Integer = height - CType(Math.Floor(height * previousY / scaleY), Integer) ' Y軸は座標が逆
Dim posX As Integer = CType(Math.Floor(width * logX / scaleX), Integer)
Dim posY As Integer = height - CType(Math.Floor(height * y / scaleY), Integer)
g.DrawLine(Pens.Blue, prevPosX, prevPosY, posX, posY)
' 前の値を覚えておく
previousLogX = logX
previousY = y
Next
あくまでチェック用のテストコードなので無駄も多いですし,
Graphicsの変換行列を使えば計算は不要かもしれませんが……。
お礼
Yune-Kichiさま これです!私が欲していたものは!非常に助かりました。このたびは誠にありがとうございました。