PictureBoxに多角形を描画


あおい  2013-06-19 16:33:44  No: 148172  IP: 192.*.*.*

VisualStudio2010を使用しております。
pictureboxに多角形(長方形)を描画しようとしております。
通常は左上の角が座標値(0,0)なのですが、開始点の座標値が(-21700,50000)(この数値は与えられた数値のため変更不可)
 Dim ps As Point() = {New Point(-21700, 50000), _
  New Point(-21700,   50250), New Point(-21350, 50250), _
  New Point(-21350, 50000)}

  g.DrawPolygon(Pens.Black, ps)

とした場合エラーにはなりませんが、何も描画されませんでした。

  上記の座標位置に多角形をpictureboxめいいっぱいに描画することは可能でしょうか?

編集 削除
コータロー  2013-06-19 17:08:36  No: 148173  IP: 192.*.*.*

> g.DrawPolygon(Pens.Black, ps)

のgは何のGraphicsですか?
あと、座標値(-21700,50000)は何に対する座標値ですか?
あと、この数値の単位は何ですか?
もし単位がピクセルなら、描画されないのは当然でしょう。

編集 削除
あおい  2013-06-19 17:30:46  No: 148174  IP: 192.*.*.*

gは以下のように宣言しております。

 Dim canvas As New Bitmap(PictureBox1.Width, PictureBox1.Height)
 Dim g As Graphics = Graphics.FromImage(canvas)

この数値は公共座標値であり、単位はメートルです。

編集 削除
魔界の仮面弁士  2013-06-19 17:55:16  No: 148175  IP: 192.*.*.*

Graphics オブジェクトの原点座標や単位系を変更していますか?

変更していない場合、PictureBox の左上を (0,0) として、
右向きX軸、下向きY軸となるピクセル単位系となりますので、
マイナス座標は、PictureBox の範囲外になってしまうでしょう。

Graphics の単位系を変更したり、X,Y軸の向きを変更したい場合には
下記の記事を参照してみてください。
http://dobon.net/vb/dotnet/graphics/pageunit.html
http://dobon.net/vb/dotnet/graphics/transform.html

編集 削除
魔界の仮面弁士  2013-06-19 17:57:17  No: 148176  IP: 192.*.*.*

…ぉっと。PictureBox ではなく Bitmap でしたね。

Bitmap も、標準では左上が原点となっておりますので、
先の URL の記事などを参考にして座標系を変更してみてください。

編集 削除
shu  2013-06-20 11:55:22  No: 148177  IP: 192.*.*.*

Transformを使用しないで計算する例
x座標の最小値、y座標の最大値を画像の(0,0)に合わせ
拡大、縮小は縦横比をかえず両方が収まるように計算


        Dim ps As Point() = {New Point(-21700, 50000), _
                              New Point(-21700, 50250), New Point(-21350, 50250), _
                              New Point(-21350, 50000)}

        g.Clear(Color.White)

        Dim gw = PictureBox1.Width - 1 'g.VisibleClipBounds.Width - 1
        Dim gh = PictureBox1.Height - 1 ' g.VisibleClipBounds.Height - 1

        Dim NotSet As Boolean = True
        Dim minx As Integer
        Dim maxx As Integer
        Dim miny As Integer
        Dim maxy As Integer

        For Each pt In ps
            If NotSet OrElse minx > pt.X Then
                minx = pt.X
            End If
            If NotSet OrElse maxx < pt.X Then
                maxx = pt.X
            End If
            If NotSet OrElse miny > pt.Y Then
                miny = pt.Y
            End If
            If NotSet OrElse maxy < pt.Y Then
                maxy = pt.Y
            End If
            NotSet = False
        Next

        Dim scx = gw / (maxx - minx)
        Dim scy = gh / (maxy - miny)
        Dim sc = Math.Min(scx, scy)

        Dim psf = (From pt In ps Select New PointF(CSng((pt.X - minx) * sc), CSng((-pt.Y + maxy) * sc))).ToArray


        g.DrawPolygon(Pens.Black, psf)

編集 削除
あおい  2013-06-20 19:08:00  No: 148178  IP: 192.*.*.*

みなさま貴重なアドバイスありがとうございます。
参考に試して、また報告させていただきます。

編集 削除