• ベストアンサー

対数表示のグラフを書くには

Visual Basic 2008を使用する初心者です。グラフ表示のやりかたで教えてください。 例えばy=1/(a+x) aは定数、xが変数のような関数を表示させたいとします。 これのx軸をlogにして表示させたいとき、どのように記述すればよいでしょうか?

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

  • ベストアンサー
回答No.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の変換行列を使えば計算は不要かもしれませんが……。

kimbauer
質問者

お礼

Yune-Kichiさま これです!私が欲していたものは!非常に助かりました。このたびは誠にありがとうございました。

その他の回答 (2)

回答No.2

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軸が通常と向きが逆になっています。

参考URL:
http://msdn.microsoft.com/ja-jp/library/hd50b6h5.aspx
kimbauer
質問者

補足

Yune-Kichiさま コメントありがとうございます。イメージできました。 がしかし、logYとgrph.DrawLine関数をどう結びつけると線を引けるのかも理解しておりませんでした。 grph.DrawLine(Pens.Blue, x1, y1, x2, y2) 申し訳ありませんが、もう少しだけお付き合いください。

  • ShowMeHow
  • ベストアンサー率28% (1424/5027)
回答No.1

算数も、コンピューターも良く知らないのであてずっぽうですが、 10^(1/(a+x))のグラフを書けばよいのでは?

関連するQ&A