VB2010 2次関数のグラフ
投稿者 shu  (社会人)
投稿日時
2012/5/13 22:27:58
どこかの質問で載せたサンプルです。
x座標、y座標の最大、最小を指定してピクチャーボックスにフィットするように
x方向、y方向の拡大縮小率を計算しScaleTransformで拡大、縮小を行い
TransRateTransformで平行移動しています。フォントサイズは適当に調整して
みて下さい。
x座標、y座標の最大、最小を指定してピクチャーボックスにフィットするように
x方向、y方向の拡大縮小率を計算しScaleTransformで拡大、縮小を行い
TransRateTransformで平行移動しています。フォントサイズは適当に調整して
みて下さい。
Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
Dim g = e.Graphics
Dim maxx = 50.9!
Dim minx = -45.2!
Dim maxy = 60.3!
Dim miny = -20.3!
Dim fncy = Function(y As Single) (maxy - y)
Dim pen As New Pen(Brushes.Black, 0.1)
g.Clear(Color.White)
Dim xrate = g.VisibleClipBounds.Width / (maxx - minx)
Dim yrate = g.VisibleClipBounds.Height / (maxy - miny)
g.ScaleTransform(xrate, yrate)
g.TranslateTransform(-minx, 0)
g.DrawLine(pen, minx, fncy(0), maxx, fncy(0))
g.DrawLine(pen, 0.0!, fncy(miny), 0.0!, fncy(maxy))
Dim fncTest = Function(x As Single) 0.001225! * x * x * x
Dim x1 = minx
Dim y1 = fncTest(x1)
For x2 = minx To maxx Step 0.02!
Dim y2 = fncTest(x2)
g.DrawLine(pen, x1, fncy(y1), x2, fncy(y2))
x1 = x2
y1 = y2
Next
Dim fnt As New Font("MS ゴシック", 12 / xrate)
Dim sz = g.MeasureString("x", fnt)
g.DrawString("x", fnt, Brushes.Black, maxx - sz.Width, fncy(sz.Height))
g.DrawString("y", fnt, Brushes.Black, 0.0!, fncy(maxy))
fnt.Dispose()
pen.Dispose()
End Sub
投稿者 (削除されました)  ()
投稿日時
2012/5/15 14:39:23
(削除されました)
投稿者 Akane  (社会人)
投稿日時
2012/5/15 15:58:22
shuさん丁寧にご回答ありがとうございました。
投稿者 Akane  (社会人)
投稿日時
2012/5/15 17:03:50
私なりに作成したプログラムなのですが下のコードのPictureBoxの座標とグラフの座標を合わせるにはどのようにすればよろしいのでしょうか?どなたか教えてくださいお願いします。
↓
Public Class Form1
Public XMax, YMax As Single
Public Xa, Ya As Single
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim a, b, c As Double
Dim X1, X2, Y1, Y2 As Single
Dim mypen As New Pen(Color.Blue, 2)
Dim g As Graphics = PictureBox1.CreateGraphics
g.Clear(Color.White)
g.DrawLine(Pens.Black, 0, YMax / 2, XMax, YMax / 2)
g.DrawLine(Pens.Black, XMax / 2, YMax, XMax / 2, 0)
g.DrawRectangle(Pens.Black, 0, 0, XMax - 1, YMax - 1)
a = Val(TextBox1.Text)
b = Val(TextBox2.Text)
c = Val(TextBox3.Text)
For i = 0 To XMax
X1 = (Xa * 2 / XMax) * (i - (XMax / 2))
If sender.Text = Button1.Text Then
Y1 = a * X1 * X1 + b * X1 + c
End If
Y1 = -Y1 * YMax / Ya / 2 + (YMax / 2)
If i > 0 Then
End If
'
g.DrawLine(mypen, X2, Y2, i, Y1)
X2 = i
Y2 = Y1
Next
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
XMax = PictureBox1.Width
YMax = PictureBox1.Height
Xa = 6
Ya = 6
End Sub
End Class
↓
Public Class Form1
Public XMax, YMax As Single
Public Xa, Ya As Single
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim a, b, c As Double
Dim X1, X2, Y1, Y2 As Single
Dim mypen As New Pen(Color.Blue, 2)
Dim g As Graphics = PictureBox1.CreateGraphics
g.Clear(Color.White)
g.DrawLine(Pens.Black, 0, YMax / 2, XMax, YMax / 2)
g.DrawLine(Pens.Black, XMax / 2, YMax, XMax / 2, 0)
g.DrawRectangle(Pens.Black, 0, 0, XMax - 1, YMax - 1)
a = Val(TextBox1.Text)
b = Val(TextBox2.Text)
c = Val(TextBox3.Text)
For i = 0 To XMax
X1 = (Xa * 2 / XMax) * (i - (XMax / 2))
If sender.Text = Button1.Text Then
Y1 = a * X1 * X1 + b * X1 + c
End If
Y1 = -Y1 * YMax / Ya / 2 + (YMax / 2)
If i > 0 Then
End If
'
g.DrawLine(mypen, X2, Y2, i, Y1)
X2 = i
Y2 = Y1
Next
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
XMax = PictureBox1.Width
YMax = PictureBox1.Height
Xa = 6
Ya = 6
End Sub
End Class
投稿者 shu  (社会人)
投稿日時
2012/5/15 17:24:34
Xa,Yaというのは実座標1あたりのピクセル数でよいのでしょうか?
だとすると
Xn = XMax / Xa がピクチャーボックス内に配置できるx座標数になり
Yn = YMax / Ya がy座標数になります。
原点をピクチャーボックスの中心に持ってくると
(Xg, Yg) =(Xn / 2 * Xa, Yn / 2 * Ya)
が原点に対応します。
Transを使用しないと
座標(Xi , Yi)
は
(Xg + Xi * Xa, Yg - Yi * Ya)
に配置されることになります。
ピクチャーボックス上のX座標
XPi
は
実座標、(XPi - Xg) / Xa に対応することになります。
だとすると
Xn = XMax / Xa がピクチャーボックス内に配置できるx座標数になり
Yn = YMax / Ya がy座標数になります。
原点をピクチャーボックスの中心に持ってくると
(Xg, Yg) =(Xn / 2 * Xa, Yn / 2 * Ya)
が原点に対応します。
Transを使用しないと
座標(Xi , Yi)
は
(Xg + Xi * Xa, Yg - Yi * Ya)
に配置されることになります。
ピクチャーボックス上のX座標
XPi
は
実座標、(XPi - Xg) / Xa に対応することになります。
投稿者 Akane  (社会人)
投稿日時
2012/5/16 12:20:16
Xa,Yaはこのときグラフを描くときの倍率を表しています.
Xa=6は横の倍率,Ya=6は縦の倍率を表しています.
Xa=6は横の倍率,Ya=6は縦の倍率を表しています.
投稿者 shu  (社会人)
投稿日時
2012/5/16 13:27:38
> Xa,Yaはこのときグラフを描くときの倍率を表しています.
> Xa=6は横の倍率,Ya=6は縦の倍率を表しています.
何に対する倍率でしょうか?
1倍だと実座標1に対し何ピクセルでしょうか?
> Xa=6は横の倍率,Ya=6は縦の倍率を表しています.
何に対する倍率でしょうか?
1倍だと実座標1に対し何ピクセルでしょうか?
投稿者 とくま  (社会人)
投稿日時
2012/5/16 13:49:35
> Xa,Yaはこのときグラフを描くときの倍率を表しています.
> Xa=6は横の倍率,Ya=6は縦の倍率を表しています.
倍率???
解像度が変わったらディスプレイ上の長さが変わりますが、
プログラム上は同じ数値です。
倍率はどうなりますか?
基準の決まっていない倍率は意味がないのでは?
では、基準(1倍)はどう決めていますか?
質問者が決める必要のある、答えの決まっていない内容
ですので、それをまず示すべきかと。
そもそも
PictureBoxの座標はどんなものですか?
座標を合わせるとはどういうことをすることですか?
ちゃんと説明できれば、内容的には中学校の数学で
習ったであろう相似形の座標計算レベルの話です。
分からないのであれば、質問よりは学習するだけの話
ですが。
> Xa=6は横の倍率,Ya=6は縦の倍率を表しています.
倍率???
解像度が変わったらディスプレイ上の長さが変わりますが、
プログラム上は同じ数値です。
倍率はどうなりますか?
基準の決まっていない倍率は意味がないのでは?
では、基準(1倍)はどう決めていますか?
質問者が決める必要のある、答えの決まっていない内容
ですので、それをまず示すべきかと。
そもそも
PictureBoxの座標はどんなものですか?
座標を合わせるとはどういうことをすることですか?
ちゃんと説明できれば、内容的には中学校の数学で
習ったであろう相似形の座標計算レベルの話です。
分からないのであれば、質問よりは学習するだけの話
ですが。
おわかりいただける方はぜひ、教えてください!