none
Graphics方法的連線段問題 RRS feed

  • 問題

  •  For c = 1 To ds.Tables("4thTX").Rows.Count - 1

                    Dim x As Integer = 10 '間距
                    Dim y As Integer  '單位

                    Dim arr(ds.Tables("4thTX").Rows.Count) As Point
                    If CInt(ds.Tables(0).Rows(c).Item("price")) > CInt(ds.Tables(0).Rows(c - 1).Item("price")) Then
                        y = (CInt(ds.Tables(0).Rows(c).Item("price")) - CInt(ds.Tables(0).Rows(c - 1).Item("price"))) / 10
                        g.FillEllipse(brush, 100 + x * c, 100 - y, 10, 10)
                        Dim temp As Integer = 100 + x * c
                        'arr(c)=(temp,100-y)  error!
                        'x = 100 + x
                    Else

                        y = (CInt(ds.Tables(0).Rows(c - 1).Item("price")) - CInt(ds.Tables(0).Rows(c).Item("price"))) / 10
                        g.FillEllipse(brush, 100 + x * c, 100 + y, 10, 10)
                    End If


                Next

    table:4thTX


    date  |   name   |  price
    3/1   |    a     |   100
    3/2   |    b     |  200
    3/3   |    c     |    50

    我現在問題在於我點都畫好了

    現在我打算用陣列來存放我每一個點

    再由迴圈搭配Drawlines的方法來連線

    現在我卡在我不能把我點指向我的陣列來接收

    我程式該如何改寫

    或者還有別的方式可以做線段

     

    2006年5月11日 下午 05:37

解答

所有回覆

  • ?

    沒看到你建立 Point() 陣列也沒看到你呼叫 DrawLines...

    2006年5月12日 下午 01:38
    版主
  •   Private Sub form1_paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
            Dim g As Graphics = e.Graphics


            Dim brush As SolidBrush = New SolidBrush(Color.Red)
       
            Try
                Dim objcon As OleDbConnection
                Dim ds As DataSet = New DataSet '

                Dim da As OleDbDataAdapter '
                Dim c As Integer


                objcon = New OleDbConnection(strDBcon)
                objcon.Open()
                da = New OleDbDataAdapter("select * from 4thTX", objcon) '
                da.Fill(ds, "4thTX")

                For c = 1 To ds.Tables("4thTX").Rows.Count - 1

                    Dim x As Integer = 10 '間距
                    Dim y As Integer  '單位

                    Dim arr(ds.Tables("4thTX").Rows.Count) As Point
                    If CInt(ds.Tables(0).Rows(c).Item("price")) > CInt(ds.Tables(0).Rows(c - 1).Item("price")) Then
                        y = (CInt(ds.Tables(0).Rows(c).Item("price")) - CInt(ds.Tables(0).Rows(c - 1).Item("price"))) / 10
                        g.FillEllipse(brush, 100 + x * c, 100 - y, 10, 10)
                        Dim temp As Integer = 100 + x * c
                        arr(c)=(temp,100-y)  error!
                      Else

                        y = (CInt(ds.Tables(0).Rows(c - 1).Item("price")) - CInt(ds.Tables(0).Rows(c).Item("price"))) / 10
                        g.FillEllipse(brush, 100 + x * c, 100 + y, 10, 10)
                    End If


                Next

                objcon.Close()
            Catch ex As Exception
                MsgBox(ex.Message.ToString)
            End Try

        End Sub

     

    以上我point的程式碼

    我還沒有drawline的方法是因為我還辦法把陣列宣告出來

    再程式碼裡有一段

    Dim arr(ds.Tables("4thTX").Rows.Count) As Point

    ........

     Dim temp As Integer = 100 + x * c
                        'arr(c)=(temp,100-y)  error!這裡發生錯誤

    2006年5月14日 下午 01:23
  • 1. 請把完整錯誤訊息貼出來..

    2. VB.NET 內建構子不是這樣玩的~

    若不使用建構函數,你可以用

    arr(c).x = temp

    arr(c).y = 100 - y

    若你打算使用建構函數

    arr(c) = New Point(temp, 100 - y)

    你的

    'arr(c)=(temp,100-y)  error!這裡發生錯誤

    本來語法就是錯的。

    2006年5月15日 上午 02:01
    版主
  • 感謝指正

    沿用璉璉的用法

     Dim temp As Integer = 100 + x * c

     arr(c).X = temp  

     arr(c).Y = 100 - y

     

    把座標給陣列接收後

    Dim lines As Pen = New Pen(Color.Gray)

    g.DrawLine(lines, arr(c - 1).X, arr(c - 1).Y, arr(c).X, arr(c).Y)

    c是從1開始我這樣想不知道是否正確?

    連線出來的結果

    是變成從左上角為起始連到每一個圓形上

    http://0rz.net/161m9  

    如上圖這樣

    2006年5月15日 上午 11:38
  • 通常陣列從 0 開始

    For i = 1 To UBound(arr)

       g.DrawLine(lines, arr(0).X, arr(0).Y, arr(i).X, arr(i).Y)

    Next

    註:我假定你要畫你網址顯示的圖。另圖檔請存為 PNG ,bmp 很浪費網路頻寬。包含所有看圖的人。

    2006年5月15日 下午 12:04
    版主
  • 非常感謝您的教導

    我並沒把我的目標說得很完整

    導致還得再次請教

    我是要把我每個點都串連起來

    看起來像是一條折線

    以目前的情況圖形變成所以的點以(0,0)為起始分別連到每個圓形上面

    這並不是目標的圖形

    我把我在迴圈裡的程式貼上來

     For c = 1 To ds.Tables("4thTX").Rows.Count - 1

                    Dim x As Integer = 10 '間距
                    Dim y As Integer  '單位
                    Dim temp As Integer = 100 + x * c
                    Dim arr(ds.Tables("4thTX").Rows.Count) As Point


                    If CInt(ds.Tables(0).Rows(c).Item("price")) > CInt(ds.Tables(0).Rows(c - 1).Item("price")) Then
                        y = (CInt(ds.Tables(0).Rows(c).Item("price")) - CInt(ds.Tables(0).Rows(c - 1).Item("price"))) / 10
                        g.FillEllipse(brush, 100 + x * c, 100 - y, 10, 10)

                        arr(c).X = temp
                        arr(c).Y = 100 - y
                      

                    Else

                        y = (CInt(ds.Tables(0).Rows(c - 1).Item("price")) - CInt(ds.Tables(0).Rows(c).Item("price"))) / 10
                        g.FillEllipse(brush, 100 + x * c, 100 + y, 10, 10)
                        arr(c).X = CInt(temp)
                        arr(c).Y = CInt(100 - y)
                        

                    End If

                    g.DrawLine(lines, arr(0).X, arr(0).Y, arr(c ).X, arr(c ).Y)
                  
                   
                Next

    我試著把點的座標印出來

    me.text=arr(3).X.toString

    顯示出來是空白的

    感覺數值並沒有給陣列做接收

    可是卻又能連到圓形上但沒串連

    請問需要整個程式碼嗎?

    2006年5月15日 下午 04:41
  • ... 這在幾何圖學有專門的名詞,叫做 PolyLine ,或是多重折線。

    在 .Net 類別中,對應 Windows API DrawPolyLine 的是 Graphics.DrawLines

    假定你的點已經在迴圈內完成指定給 arr 陣列,可在 Next 後面用

    g.DrawLines(lines. arr)

    即可。

    註:MultiPolyLine 叫做複合多重折線

    2006年5月16日 上午 05:41
    版主
  • 請問我要import什麼嗎?

    因為我g.DrawLines(lines. arr)的話

    會變成我arr沒宣告

    因為我的值跟定義都在迴圈裡

     

    2006年5月16日 下午 02:28
  • 應該是我打錯了吧,括號裡面是用 , 分隔參數,打成 . 了

    g.DrawLines(lines, arr)

    2006年5月16日 下午 02:45
    版主
  • 錯誤 1 多載解析失敗,因為沒有可存取的 'DrawLine' 接受此引數數

    我擺在迴圈內會產生以上錯誤?

     

     

    迴圈外則是

    錯誤 1 名稱 'arr' 未宣告

     

    抱歉

    我不知道該寫入哪裡最合適



     

    2006年5月16日 下午 04:57
  • 1. 你的

     Dim arr(ds.Tables("4thTX").Rows.Count) As Point

    應該搬到迴圈上面,你每座一個迴圈重新宣告一次,一方面效能差,一方面每次重新宣告就代表你的資料被清空,只會保存最後一筆而已。

    2. 你到底要用 DrawLines 還是 DrawLine 請明確說明清楚,因為兩個參數是不同的,你若是把 DrawLines 的參數給 DrawLine ,就會發生你的錯誤 1 。我是建議你直接使用 DrawLines ,因為這個是包 API 的 DrawPolyLine ,效能會比你一段一段畫好,DrawLine 是包 API MoveTo 跟 LineTo ,呼叫一次 API 跟呼叫 2 * 迴圈數 的 API 哪個快?此外, Windows 校能現在大部分受螢幕顯示影響而快不起來,所以 GDI 函數呼叫次數越少,效能越高,這兩個速度差影響會比 API 呼叫 2 * 迴圈數還大~

    2006年5月17日 上午 01:40
    版主
  • 忘了說, VB.NET 的變數生命週期是以區塊分,當你這個變數是在

    For Next / If End If / Do Loop / Select End Select / With End With 等區塊宣告時,再此區塊外都不能使用該變數,因為生命週期被終結了。

    細節請參考 線上手冊 相關說明。

    2006年5月17日 上午 01:43
    版主
  • 感謝璉璉

    我現在的線可以連成折線了

    問題是我有些點根本沒有連到

    所以我想問你我先用中斷點去觀察我的陣列的座標

    我忘記說怎麼讓中斷點一值往下

    我記得可以按一個鍵按一次往下一段程式走

    請問要按哪一個鍵?

    2006年5月17日 上午 10:04
  • 感謝璉璉

    我已經可以正常連線了

    現在我有一個問題是說

    因為我的paint的sub都是我一讀取到這個form就自動畫了

    那我現在是想要把它封裝成一個方法

    當我呼叫他的時候才幫我畫

    那我該如何改寫一開始宣告的部份

    我原先是

        Private Sub form1_paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint

     

    'code......................

     

      End Sub

     

    2006年5月18日 上午 06:14
  • 你的關鍵問題是不會創建 Graphics 還是不會搬移到其他副程式?

    創建 Graphics 可參考:

    http://msdn2.microsoft.com/zh-tw/library/5y289054(VS.80).aspx

    2006年5月18日 上午 07:52
    版主
  • 感謝 璉璉

    這個主題應該到這邊就結束

    我從msdn有看到我要的解答了

     

    2006年5月18日 上午 08:21