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めいいっぱいに描画することは可能でしょうか?
> g.DrawPolygon(Pens.Black, ps)
のgは何のGraphicsですか?
あと、座標値(-21700,50000)は何に対する座標値ですか?
あと、この数値の単位は何ですか?
もし単位がピクセルなら、描画されないのは当然でしょう。
gは以下のように宣言しております。
Dim canvas As New Bitmap(PictureBox1.Width, PictureBox1.Height)
Dim g As Graphics = Graphics.FromImage(canvas)
この数値は公共座標値であり、単位はメートルです。
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
…ぉっと。PictureBox ではなく Bitmap でしたね。
Bitmap も、標準では左上が原点となっておりますので、
先の URL の記事などを参考にして座標系を変更してみてください。
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)
みなさま貴重なアドバイスありがとうございます。
参考に試して、また報告させていただきます。
ツイート | ![]() |