Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: [VB:NET] Käyrän piirto

Sivun loppuun

ErroR++ [26.09.2011 18:15:42]

#

Eli mitenkäs sais piirrettyä käyrän pictureboxiin? Pictureboxi pitää ensin Clearata mustaksi, jonka jälkeen sinne piirretään punainen käyrä. Mitenkä tuo onnistuisi helpoiten?

Grez [26.09.2011 20:02:47]

#

onPainttiin e.Graphics.DrawCurve(Pens.Red, points)

ErroR++ [26.09.2011 20:32:40]

#

Tai siis enemmänkin ehkä monimutkainen käyräkaavio.
Pohja:

'Formilla PictureBoxi PicCurve

Public Class frmCurve
Inherits System.Windows.Forms.Form
Dim curvePoints(25) as System.Drawing.Point
Dim g as Graphics
Private Sub frmCurve_Load(ByVal sender As System.Object, ByVal e as EventArgs) Handles MyBase.Load
Me.PicCurve.Image = New Bitmap(Me.PicCurve.Height, Me.PicCurve.Width)
g = Graphics.FromImage(Me.PicCurve.Image)
g.Clear(Color.Black)
curvePoints(0) = New Point(200, 500) 'Esim.
curvePoints(1) = New Point(500, 300)
'jne...
DrawCurve(g)
End Sub

Public Sub DrawCurve(ByVal g as Graphics)
Dim oldPoint, newestPoint As Point
oldPoint = New Point(0, 0) 'Aloituskoordinaatit
For i = 0 to curvePoints.Length
newestPoint = curvePoints(i)
If Not newestPoint.X <= oldPoint.X And newestPoint.Y <= oldPoint.Y Then
MsgBox("ERROR", 16, "ERROR") 'Käyrä ei saa kääntyä takaisin!
Exit Sub
End If
g.DrawLine(Pens.Red, oldPoint, newestPoint)
Next
End Sub
End Class

(ei testattu)

Grez [26.09.2011 20:35:58]

#

Siis nyt en ihan ymmärrä miksi kysyit "helpointa tapaa" ja sitten implementoit itse, kun graphicsissa on (.Net Framwork 4:ssä ainakin) tuo mainitsemani DrawCurve suoraan? Tekee vielä määriteltyjen pisteiden kautta kulkevan SPLinen eli käyrän eikä tuollaista monikulmiota kuten oma rutiinisi.

Tosin ilmeisesti halusit jonkun funktion kuvaajan etkä varsinaisesti käyrää päätellen tuosta "ei saa kääntyä takaisin" kommentista.

ErroR++ [27.09.2011 14:54:06]

#

Siis haluaisin sellaisen käyrän kuten esimerkiksi on Tehtävienhallinnassa Suorituskyky -välilehdellä. Mutta ehkä keksinkin jo... Testaan kohta.

User137 [05.10.2011 23:36:23]

#

Siis näin?

For i = 0 to curvePoints.Length-2
  g.DrawLine(Pens.Red, curvePoints(i), curvePoints(i+1))
Next

edit: Korjattu -2

jalski [06.10.2011 01:31:53]

#

User137 kirjoitti:

Siis näin? ...

Tuossa varmaan kannattaa muistaa pitää huolta, että pisteitä on parillinen määrä, jotta tuo i+1 ei aiheuta hankaluuksia? Löytyyköhän .NET:ille polyline funktiota?

jtha [06.10.2011 11:34:08]

#

Miksi parillinen määrä? Haittaako tuossa parittomuus oikeasti mitään?

Grez [06.10.2011 11:40:09]

#

Ei, yhtä huonosti toimii parillisellakin määrällä.

Sen pitäisi olla: to curvePoints.Length - 2

ErroR++ [06.10.2011 15:23:07]

#

'näin
Public Class frmCurve
Inherits System.Windows.Forms.Form
Dim curveStates(4) As System.Drawing.Point
Dim g As Graphics
Private Sub frmCurve_Load(ByVal sender As System.Object, ByVal e as EventArgs) Handles MyBase.Load
Me.BackgroundImage = New Bitmap(Me.PicCurve.Height, Me.PicCurve.Width)
g = Graphics.FromImage(Me.BackgroundImage)
g.Clear(Color.Black)
curveStates(0) = 86
curveStates(1) = 286
curveStates(2) = 386
curvestates(3) = 486
curveStates(4) = 15
DrawCurve(g)
End Sub

Public Sub DrawCurve(ByVal g as Graphics)
Dim oldPoint, newestPoint As Point
oldPoint = New Point(0, 0) 'Aloituskoordinaatit
For i = 0 to curveStates.Length - 1
newestPoint = New Point(i * 50, curveStates(i))
g.DrawLine(Pens.Red, oldPoint, newestPoint)
oldPoint = newestPoint
Next
End Sub
End Class

jalski [06.10.2011 17:00:56]

#

ErroR++ kirjoitti:

Public Sub DrawCurve(ByVal g as Graphics)
   Dim oldPoint, newestPoint As Point

   oldPoint = New Point(0, 0) 'Aloituskoordinaatit

   For i = 0 to curveStates.Length - 1
      newestPoint = New Point(i * 50, curveStates(i))
      g.DrawLine(Pens.Red, oldPoint, newestPoint)
   Next
End Sub

Pitikös tuossa piirtää aina uusi suora nolla pisteestä, vai unohditko päivittää OldPoint muuttujan arvoa silmukassa?

Täytyy muuten sanoa, että omaa silmää Component Pascalin syntaksi miellyttää VB:tä enemmän...

Grez [06.10.2011 17:21:17]

#

Mielestäni tuossa tilapäiseen muuttujaan laittamisessa ei muutenkaan ole mitään järkeä verrattuna taulukkoarvojen käyttämiseen suoraan.

Jos tuo olisi edes tehty foreach -silmukassa, niin jotain perustetta tuollaiselle voisi olla.

Eli joko

g.DrawLine(Pens.Red, New Point(0, 0), curvePoints(0)) 'Jos oikeasti tarvitaan??
For i = 0 to curvePoints.Length-2
  g.DrawLine(Pens.Red, curvePoints(i), curvePoints(i+1))
Next

tai

Dim oldPoint = New Point(0, 0) 'Aloituskoordinaatit
For Each point In curvePoints
    g.DrawLine(Pens.Red, oldPoint, point)
    oldPoint = point
Next

Mutta ei tuollaista epäsikiötä.

Tai ehkä olemme väärässä ja tarkoitus oli sittenkin piirtää kaikki viivat lähtemään 0,0:sta.

jalski kirjoitti:

Täytyy muuten sanoa, että omaa silmää Component Pascalin syntaksi miellyttää VB:tä enemmän...

No ei kai se mikään ihme ole, kun VB.Net on Basicin näköiseksi väännettyä C#:a :D Itsekin koodaan paljon mieluummin C#:lla vaikka omaankin hyvin pitkän basic-taustan.

jtha [07.10.2011 00:16:33]

#

kumpi on ihan oikein - ja miksi?
(kysyn kun kumpikin esiintyy)

1.
"For i = 0 to curvePoints.Length-2"

2.
"For i = 0 to curvePoints.Length-1"

-tossu- [07.10.2011 00:33:59]

#

Ensimmäinen on oikein, koska curvePoints:n indeksit alkavat nollasta eli viimeinen on curvePoints.Length-1. Käyrän viimeinen osa taas on viiva toiseksi viimeisestä pisteestä viimeiseen.

Grez [07.10.2011 05:29:58]

#

Sehän riippuu käytetäänkö siellä curvePoints(i+1):tä vai vain curvePoints(i):tä.

Jos käytetään curvePoints(i+1):tä, niin silloin on oikein:
For i = 0 to curvePoints.Length-2

Jos käytetään vain curvePoints(i):tä, niin silloin on oikein:
For i = 0 to curvePoints.Length-1

User137 [07.10.2011 15:39:23]

#

Jos sulla on 3 pistettä ja niistä piirretään graafi niin se tarkottaa kahta viivaa. Eli viivojen määrä on curvePoints.Length-1, mutta kun aloitetaan nollasta eikä ykkösestä niin väli on 0 to curvePoints.Length-2. Korjasin oman virheen.

Grez [07.10.2011 15:57:01]

#

Joo, mutta ErroR+:n virityksessä on yksi piste, (0,0), josta piirretään viivat kaikkiin pisteisiin. Siinä tapauksessa se -1 on ihan oikein.

Viitaten siis tähän "on esiintynyt kahta tapaa, kumpi on oikein?"

Sinänsä mielestäni ei lupaa hirveän hyvää koodaamiseen jos ei oikeaa vaihtoehto kuhunkin tilanteeseen saa pähkäiltyä itse muutaman minuutinkaan miettimisellä.

neau33 [07.10.2011 17:01:56]

#

Heippa taas!

käy se For...Next silmukassa ilman 'miinusteluakin'...

For i As Integer = 0 To CurvePoints.GetUpperbound(0)
   Try
      g.DrawLine(Pens.Red, CurvePoints(i), CurvePoints(i + 1))
   Catch ex As Exeption
   End Try
Next

jalski [07.10.2011 17:21:51]

#

neau33 kirjoitti:

   käy se For...Next silmukassa ilman 'miinusteluakin'...

For i As Integer = 0 To CurvePoints.GetUpperbound(0)
   'jne.
Next

   -Nea-

Jeps... Tässä tosin oli bonuksena tilanne, että piti varmistaa arrayn indeksin pysyvän rajoissa ( curvePoints(i+1) ei siis saisi mennä yli ).


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta