グラフィックDrawLineメソッドについて

このQ&Aのポイント
  • グラフィックDrawLineメソッドについて教えてください。開いた線と閉じた線のグラフを描画する方法がありますが、閉じた線を描画する際に問題が発生しています。
  • グラフィックDrawLineメソッドについて、開いた線を描画する際は正しく描画されますが、閉じた線を描画する際には最後の点と最初の点が結ばれてしまいます。
  • 問題の原因は、mypoints(i)の値の計算方法にあります。ループ内で計算される値が予想と異なっており、最後の点と最初の点が結ばれてしまうことが原因です。
回答を見る
  • ベストアンサー

グラフィックDrawLineメソッドについて

グラフィックDrawLineメソッドについて教えてください。 下記のコードでは、開いた線になります。OK mypoints(0)=New Point(10,10) ,mypoints(1)=New Point(40,70) mypoints(2)=New Point(60,30) mypoints(3)=New Point(90,90) Dim g As Graphics = PictureBox3.CreateGraphics() g.DrawLines(New Pen(Color.Blue, 1), mypoints) ところが、下記のコードで、グラフが最後閉じられてしまいます。NG どうしてでしょうか? For i = 0 To 48 mypoints(i) = New Point((i * 0.35), (PdaOneData(N_OneDtNo).PicData(i) * 0.05)) Debug.WriteLine(mypoints(i)) Next Dim g As Graphics = PictureBox3.CreateGraphics() g.DrawLines(New Pen(Color.Blue, 1), mypoints) 上記のmypoints(i) のイミディエイトウィンドウ表示は下記のとおりです。 X=0,Y=40}{X=0,Y=40}{X=1,Y=39}{X=1,Y=39}{X=1,Y=39}{X=2,Y=38}{X=2,Y=38}{X=2,Y=37}{X=3,Y=37}   ・・・中省略・・・ {X=14,Y=43}{X=14,Y=43}{X=15,Y=43}{X=15,Y=43}{X=15,Y=44}{X=16,Y=44}{X=16,Y=43}{X=16,Y=42}

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

最後が閉じられると書いておられますが、ひょっとして 0,0 の位置に表示していませんか? mypoints 変数の宣言をどこでいくつ宣言していますか? 48 より多いとかないですか?

moretopspin
質問者

お礼

ありがとうございました。 配列は配列数で宣言するものという昔のC言語からの先入観でコードを作成していました。 それでおっしゃられるように、(0,0)の配列が最後に1個存在していました。 VBの配列宣言は最大値ということがわかり解決しました。

その他の回答 (1)

回答No.1

VB のバージョン等を含め肝心な事を書かないで質問されても期待される答えは得られないかと 思いますよ。 PdaOneData(N_OneDtNo).PicData(i) の中身がどうなっているか解らないので確認のしようが ありませんし。  ・・・中省略・・・ では、詳細が解らないし。 ご自分でどこまで確認したかも不明だし。 どこで閉じているのかも書いていないし。 For i = 0 To 48 のところを 48 → 24 にした場合はどうなるかとか? それでも閉じるなら、1 → 順に試してどこで閉じるとか試して見たら問題が少しは見えてくるのでは ないですか? コードを掲載されるのなら他人が確認できるような最低限のコードを作って投稿されると解決も 早いかと思います。

関連するQ&A

  • VB.NETのグラフィック描画について

    グラフィック描画ですが、引数を持たないサブルーチンプロシージャ(固定的な 目盛り等)は、PictureBox_paint(***イベントプロシージャ内に記述すればグラフィック描画ができます(e.Graphicsでグラフィックスオブジェクトを取得できる為)が、 X、Y座標を引数としたサブルーチンプロシージャを作り、その中でLineDraw(*****で描画させたい場合サブルーチンプロシージャ内に dim g As Graphics=pictureBox1.CreateGraphics() でグラフィックオブジェクトを生成しても 描画できないのですがどのようにすれば解決できるでしょうか(イメージがわかり難いかもしれませんのでサンプルを書きました) よろしくお願いします (1)private sub pictureBox1_paint(Byval sender as Object, Byval e as system****** e.Graphics.DrawLine(****** (これは描画できる) End Sub (2)private sub zahyou() ' 座標を生成するサブルーチンプロシージャ dim i as integer for i=0 to 10 hyouji( i , i*5 ) End Sub private sub hyouji( x as integer, y as integer) ’直線を引くサブルーチンプロシージャ dim g As Graphics=pictureBox1.CreateGraphics() g.DrawLine(***,x,y**** (これは描画できない)

  • VB.NETのグラフィック描画で困っています

    VB.NETでのグラフィックの記述方法ですが 何かをクリックすると描画させるのではなく 単にあるsubプロシージャ内でグラフィックを描画させる記述する方法として pictureBox1.Image=New Bitmap(PictureBox1.width,pictureBox1.Height) Dim g As Graphics = Graphics.FromImage(PictureBox1.Image) を教えていただきました。そこで private sub xy_keisan() '座標を計算させるプロシージャ disp_x() 'x座標に目盛りを表示させるプロシージャ disp_Y() 'xの目盛り数によってY座標の位置を変えて表示させるプロシージャ end sub private sub disp_x() pictureBox1.Image=New Bitmap(PictureBox1.width,pictureBox1.Height) Dim g As Graphics = Graphics.FromImage(PictureBox1.Image) g.DrawLine(****** end sub private sub disp_y() pictureBox1.Image=New Bitmap(PictureBox1.width,pictureBox1.Height) Dim g As Graphics = Graphics.FromImage(PictureBox1.Image) g.DrawLine(****** end sub のような記述(引数とか細かい所は端折っています)ですとdisp_yは描画されていますが,disp_xは消えてしまいます。 pictureBox1.Image=New Bitmap(PictureBox1.width,pictureBox1.Height) が消えてしまう原因だとおもって宣言場所を変えてみましたが同じです 逆にこれが無いと描画させることが出来なくなります。 これの意味も今ひとつ判りません よろしくお願い致します

  • vb2005で四角

    vb2005でformのload時に四角形を書く処理をしたいのですが ボタンの中にコードを書かないと作画しないのですが なにか方法がありますか。 現在のロジック form1.load Dim g As Graphics = PictureBox1.CreateGraphics() Dim p As New Pen(Color.Black, 1) g.DrawRectangle(p, 10, 20, 100, 80) p.Dispose() g.Dispose() end sub

  • PictureBoxの描画について

    VB2005を使用してPictureBoxに線を描きました。  Dim g As Graphics = PictureBox1.CreateGraphics()  g.DrawLine(p, X1, Y1, X2, Y2) 線は上手く描けたのですが、表示している画面(Form)を最小化して再度最大化すると、描いた線が消えてしまいます。FormをHideしてもう一度Showしても同じです。 この描画を消さないようにするには、どうすればよいでしょうか?

  • 描画した後での塗りるぶし VB

    丸を描画後にColorDialogで指定された色で丸の範囲だけ塗りつぶすというプログラムを作っているのですが、なかなかうまくいきません。 丸は、このように描画するようにしています。 Private Sub PictureBox1_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove If (e.Button = MouseButtons.Left) Then Dim g As Graphics = PictureBox1.CreateGraphics() Dim ePos As MouseEventArgs PictureBox1.Refresh() g.DrawEllipse(New Pen(Color.Black, 2), Spos.X, Spos.Y, e.X - Spos.X, e.Y - Spos.Y) ePos = e g.Dispose() End If End Sub Private Sub PictureBox1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown If (e.Button = System.Windows.Forms.MouseButtons.Left) Then Spos = e End If End Sub VB2010を使っています。 どなたか教えていただけるとありがたいです。よろしくお願いします。

  • VB2010にて、文字を上下鏡反転したいのですが、どなたか教えていただ

    VB2010にて、文字を上下鏡反転したいのですが、どなたか教えていただけないでしょうか。 マトリックスでピクチャーボックスの左下を原点としてグラフ描画できましたが、 文字が逆さまになってしまいました。 ピクチャーボックスに、グラフィクスオブジェクトを使い ビットマップイメージで描画して文字を上下反転しようと試みています。 以下のコードで、 Me.PictureBox1.Image.RotateFlip(RotateFlipType.RotateNoneFlipY) の部分がエラーとなってしまいます。 どう修正すればよいか教えていただけませんでしょうか。 どうぞよろしくお願いいたします。 Dim myPen As New Pen(Color.Red, 1) Dim myFont As New Font("MS UI Gothic", 20) Dim myMatrix As New Matrix 'Dim g As Graphics = Me.PictureBox1.CreateGraphics Dim Image2 As New Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height) Dim pg As Graphics = Graphics.FromImage(Image2) Dim px, py As Long px = Me.PictureBox1.Width py = Me.PictureBox1.Height myMatrix.Scale(1, -1) '拡大縮小(y軸のみ正負の方向を逆にする) myMatrix.Translate(0, -py) '平行移動(ピクチャーボックスの高さ分,下へ平行移動) 'g.Transform = myMatrix pg.Transform = myMatrix 'g.DrawLine(myPen, 0, 0, 200, 200) pg.DrawLine(myPen, 0, 0, 200, 200) 'g.DrawString("text", myFont, Brushes.Red, 100, 100) pg.DrawString("text", myFont, Brushes.Red, 100, 100) '"text"を上下反転する 'Me.PictureBox1.Image = Image.FromFile("C:\☆test.bmp") Me.PictureBox1.Image.RotateFlip(RotateFlipType.RotateNoneFlipY) Me.PictureBox1.Refresh()

  • VB6.0にて、ワールド変換(ピクチャーボックスの左下を原点にする)を

    VB6.0にて、ワールド変換(ピクチャーボックスの左下を原点にする)をしたいのですが、 下記のコードを記述するとエラーとなります。 どこが駄目なのかわかりませんので、どなたか教えていただけませんでしょうか? お手数をおかけしますがどうぞよろしくお願いします。 PictureBox1のGraphicsオブジェクトを取得 Dim g As Graphics = Form1.PictureBox1.CreateGraphics() g.TranslateTransform(0, Form1.picturebox1.Height - 1) g.ScaleTransform(1, -1) g.Dispose()

  • VB2010で、ピクチャーボックスに左下原点でグラフ描画したいのですが

    VB2010で、ピクチャーボックスに左下原点でグラフ描画したいのですが、 以下のコードで描画されません。 あれこれ調べて記述したコードですが、どこかが間違っているのでしょうか。 ピクチャーボックスのサイズはpx,pyともに約300です。 わかる方どうぞ教えてください。よろしくお願いします。 Dim myPen As New Pen(Color.Black, 1) Dim myFont As New Font("MS UI Gothic", 20) Dim myMatrix As New Matrix Dim g As Graphics = ChildForm(jj).PictureBox1.CreateGraphics Dim px, py As Long px = ChildForm(jj).PictureBox1.Width py = ChildForm(jj).PictureBox1.Height myMatrix.Translate(0, -py) '平行移動(ピクチャーボックスの高さ分,下へ平行移動) myMatrix.Scale(1, -1) '拡大縮小(y軸のみ正負の方向を逆にする) 'myMatrix.Rotate(180) '回転 g.Transform = myMatrix g.DrawLine(myPen, 0, 0, 200, 200) g.DrawString("TEST", myFont, Brushes.Black, 100, 100)

  • 画像転送(ワールド変換行列)について

    Dim g As Graphics = PictureBox1.CreateGraphics() Dim img As Image = Image.FromFile("○○.jpg") For i = 1 To 10 g.TranslateTransform(+10, 0) g.DrawImage(img, New Rectangle(0, 0, img.Width, img.Height)) Next i 上記のような感じで画像を左から右へとスムーズに 動かしたいのですが、移動毎の残像が残ってしまいます。 毎回Refreshするとちらつきが出てしまいますし……。 どうしたら残像が残らず画像を移動出来るでしょうか。

  • 式はメソッドではありませんと表示されます。

    特定の文字を検出すうrと、それに応じた画像が表示されるように プログラムしたのですが、タイトルのようにエラーが出ます。 宣言をしないと「宣言が必要」で、宣言をするとタイトルのように。 正直、全くの初心者なのでタイトルが何を言っているのか全く分かりません。 ネットでも調べましたが、詳しくは分からず……。 ここならばと思い、投稿しました。 問題部分は下記の「DrawFadedImage」部分です。 エラー修正オプションをしても同じように出ます。 ElseIf InStr(Mainlabel.Text, "テスト") Then Mainlabel.Text = Replace(Mainlabel.Text, "テスト", "") Savepic = 51 'PictureBox1のGraphicsオブジェクトを取得 Dim g As Graphics = PicC.CreateGraphics() '画像を読み込む Dim img As Image = Image.FromFile("Data\Pic\132.ELS") 'フェードイン Dim i As Integer For i = 1 To 10 Console.WriteLine((i * 0.1F)) DrawFadedImage(g, img, i * 0.1F) System.Threading.Thread.Sleep(1) PicC.Image = img Next i

専門家に質問してみよう