VB2010 2次関数のグラフ

タグの編集
投稿者 Akane  (社会人) 投稿日時 2012/5/13 19:01:14
VB2010でPictureBox内に2次関数のグラフを描画したいのですが、PictureBox内の座標とグラフの座標を合わせるためにはどのようにすればよろしいのでしょうか?
おわかりいただける方はぜひ、教えてください!
投稿者 shu  (社会人) 投稿日時 2012/5/13 22:27:58
どこかの質問で載せたサンプルです。

x座標、y座標の最大、最小を指定してピクチャーボックスにフィットするように
x方向、y方向の拡大縮小率を計算しScaleTransformで拡大、縮小を行い
TransRateTransformで平行移動しています。フォントサイズは適当に調整して
みて下さい。
    Private Sub PictureBox1_Paint(ByVal sender As ObjectByVal 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
投稿者 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 に対応することになります。
投稿者 Akane  (社会人) 投稿日時 2012/5/16 12:20:16
Xa,Yaはこのときグラフを描くときの倍率を表しています.
Xa=6は横の倍率,Ya=6は縦の倍率を表しています.
投稿者 shu  (社会人) 投稿日時 2012/5/16 13:27:38
> Xa,Yaはこのときグラフを描くときの倍率を表しています.
> Xa=6は横の倍率,Ya=6は縦の倍率を表しています. 
何に対する倍率でしょうか?
1倍だと実座標1に対し何ピクセルでしょうか?
投稿者 とくま  (社会人) 投稿日時 2012/5/16 13:49:35
> Xa,Yaはこのときグラフを描くときの倍率を表しています.
> Xa=6は横の倍率,Ya=6は縦の倍率を表しています. 
倍率???
解像度が変わったらディスプレイ上の長さが変わりますが、
プログラム上は同じ数値です。
倍率はどうなりますか?
基準の決まっていない倍率は意味がないのでは?
では、基準(1倍)はどう決めていますか?
質問者が決める必要のある、答えの決まっていない内容
ですので、それをまず示すべきかと。

そもそも
PictureBoxの座標はどんなものですか?
座標を合わせるとはどういうことをすることですか?
ちゃんと説明できれば、内容的には中学校の数学で
習ったであろう相似形の座標計算レベルの話です。
分からないのであれば、質問よりは学習するだけの話
ですが。