プロが教えるわが家の防犯対策術!

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

「対数表示のグラフを書くには」の質問画像

A 回答 (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の変換行列を使えば計算は不要かもしれませんが……。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/03/11 07:49

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 …

この回答への補足

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

補足日時:2009/03/10 22:19
    • good
    • 0

算数も、コンピューターも良く知らないのであてずっぽうですが、


10^(1/(a+x))のグラフを書けばよいのでは?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!