- ベストアンサー
対数表示のグラフを書くには
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
対数軸は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の変換行列を使えば計算は不要かもしれませんが……。
その他の回答 (2)
- Yune-Kichi
- ベストアンサー率74% (465/626)
Logの算出方法がわからない,ということでしょうか。 そうであれば,System.MathクラスのLogメソッドを使います。 Const a As Double = *** Dim x As Double Dim y As Double Dim logY As Double y = 1 / (a + x) logY = Math.Log(y, 10) あとは,左上を原点として右下方向に値が増加する座標系であると言うことに注意して,線を引いていけばよいです。 # Y軸が通常と向きが逆になっています。
補足
Yune-Kichiさま コメントありがとうございます。イメージできました。 がしかし、logYとgrph.DrawLine関数をどう結びつけると線を引けるのかも理解しておりませんでした。 grph.DrawLine(Pens.Blue, x1, y1, x2, y2) 申し訳ありませんが、もう少しだけお付き合いください。
- ShowMeHow
- ベストアンサー率28% (1424/5027)
算数も、コンピューターも良く知らないのであてずっぽうですが、 10^(1/(a+x))のグラフを書けばよいのでは?
お礼
Yune-Kichiさま これです!私が欲していたものは!非常に助かりました。このたびは誠にありがとうございました。