Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

VB.net Γραφική Παράσταση (Ευθεία/Καμπύλη)

Îåêßíçóå áðü ôï ìÝëïò AlKiS. Τελευταία δημοσίευση από το μέλος Libra Storm στις 29-05-2011, 22:09. Υπάρχουν 8 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  27-05-2011, 09:48 66025

    VB.net Γραφική Παράσταση (Ευθεία/Καμπύλη)

    Καλημέρα,

    Ασχολούμαι με τον προγραμματισμό ως χόμπι για πολλά χρόνια τώρα πια, δυστυχώς όσο κιαν μου αρέσει, λόγω σχολείο παλιότερα και λόγω σχολής τώρα, δεν είχα το χρόνο να μάθω τόσο καλό προγραμματισμό.

    Θέλω να φτιάξω ένα πρόγραμμα, αυτή τη φορά, το οποίο θα του δίνουμε κάποια σημεία, και θα μας κάνει την γραφική παράσταση


    Αν και κάθε άλλη φορά που ζήτησα βοήθεια είχα κάτι ήδη σχεδόν τελειωμένο έχοντας μόνο μια απορία - αυτή τη φορά δεν έχω ιδέα πως να αρχίσω καν.

    Ευχαριστώ πολύ όποιον με καθοδηγήσει στο να μάθω να κάνω άξονες Χ'Χ/Υ'Υ και καμπύλες/ευθείες πάνω στους άξονες, σε VB.NET 2010.


  •  27-05-2011, 16:15 66030 σε απάντηση της 66025

    Απ: VB.net Γραφική Παράσταση (Ευθεία/Καμπύλη)

    Αν ψάξεις στο CodeProject θα βρεις αρκετά άρθρα που καταπιάνονται με τη δημιουργία τέτοιου είδους components, όπως αυτό και αυτό. Δυστυχώς, είναι γραμμένα σε c# και δε γνωρίζω αν υπάρχει κάτι δημοσιευμένο σε vb.net. Ακόμα κι αν δε σου αρέσει η c# ή/και δε θέλεις να γράφεις σ' αυτήν, τουλάχιστον μάθε να τη "διαβάζεις" γιατί θα σου λύσει τα χέρια.

    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  28-05-2011, 16:19 66037 σε απάντηση της 66025

    Απ: VB.net Γραφική Παράσταση (Ευθεία/Καμπύλη)

    Με την υπόθεση ότι ξέρεις VB και μαθηματικά, κάπως έτσι θα άρχιζε κανείς ένα τέτοιο πρόγραμμα.
    Έχεις μία συνάρτηση y=f(x) και θέλεις να την απεικονίσεις στην οθόνη.
    Το κύριο πρόβλημα (όπου θα χρειαστείς αλγόριθμο) είναι ότι τα Χ και Υ είναι δεκαδικοί αριθμοί, και η οθόνη σου αποτελείεται από pixel, που είναι θετικοί ακέραιοι.
    Έστω ότι το Χ της συνάρτησης έχει τιμές μεταξύ -2.5 και +2.5 και σταθερό Δχ = 0.1
    Έστω ότι το παράθυρο (ή control παρόμοιου τύπου) έχει συντεταγμένες οριζόντιου άξονα από 10 ώς 510, δηλαδή width = 500 pixel
    Άρα έχεις να απεικονίσεις (xmax - xmin)/Δχ = 50 τιμές σε 500 pixel. Άρα 10 pixel κενό ανάμεσα σε 2 συνεχόμενες τιμές. Αν τα χ είναι αποθηκευμένα σε ένα πίνακα χ[50], τότε θες ένα βρόχο που κάνει περίπου το εξής:

    x_left = 10
    dx = 10
    για καθε i, από 0 ώς 49 :
    
        x_coordinate_next = x_left + dx * i
        draw_point (x_coordinate_next)

    Το ίδιο περίπου και για τα Υ, και για τα Υ(Χ)
    Η δουλειά σου είναι να κάνεις τον ψευδοκώδικα VB.NET κώδικα, αφού βρεις και τις συναρτήσεις που ζωγραφίζουν (εδώ τη λέω draw_point απλά για να σου δείξω πού γίνεται το ζωγράφισμα)

    Αν δεν ήταν αυτό που ζητούσες, διευκρίνισε τι ακριβώς σε δυσκολεύει.

    Panagiotis Georgiadis
    HBM Netherlands B.V.
    www.twitter.com/HimWithCurls
  •  28-05-2011, 18:42 66038 σε απάντηση της 66037

    Απ: VB.net Γραφική Παράσταση (Ευθεία/Καμπύλη)

    Αυτό είναι που θέλω, ναί.

    Ωστόσο δεν έχω ιδέα πως θα κάνω το draw. και πού??? στην ίδια τι φόρμα? σε picturebox? ή υπάρχει κάτι ειδικά γι αυτό???


    Απο μαθηματικά δεν υπάρχει πρόβλημα, ξέρω απο πρόσθεση μέχρι μετασχηματισμούς laplace και σειρές fourie...

    Το θέμα είναι -που- και -πως- να "ζωγραφίσω" τα points και πως να τα ενώσω σε ευθεία ή καμπύλη


  •  28-05-2011, 20:44 66044 σε απάντηση της 66038

    Απ: VB.net Γραφική Παράσταση (Ευθεία/Καμπύλη)

    ALKI

    Αν δουλέυεις με VS 2010 αυτό θα σε βοηθήσει

    http://archive.msdn.microsoft.com/mschart

    υπάρχουν αρκερά παραδείγματα που δείχνουν πώς να χρησιμοποιήσεις τα chart controls

     



    View Παναγιώτης Χαραλάμπους's profile on LinkedIn
    Coding at Mediterranean Acoustics
  •  28-05-2011, 21:20 66048 σε απάντηση της 66044

    Απ: VB.net Γραφική Παράσταση (Ευθεία/Καμπύλη)

    ευχαριστώ, θα το ψάξω :)
  •  29-05-2011, 15:42 66049 σε απάντηση της 66025

    Απ: VB.net Γραφική Παράσταση (Ευθεία/Καμπύλη)

    Στο namespace System.Drawing έχει κλάσεις που μπορείς να χρησιμοποιήσεις γιά να ζωγραφίσεις. Μία από αυτές είναι η Class Graphics (System.Drawing.Graphics). Έχεις δύο τρόπους να την χρησιμοποιήσεις.  Από το Paint Event ενός control ή από το Protected OnPaint. Μπορείς ακόμα να δημιουργήσεις δικό σου Graphics object όποτε το χρειαστείς. Δες το ακόλουθο Link γιά να ξεκινήσεις. http://msdn.microsoft.com/en-us/library/da0f23z7.aspx 

    Γενικά υπάρχουν δύο τρόποι γιά να δημιουργήσεις γραφικές παραστάσεις. Ένας τρόπος είναι να ενώσεις μικρές γραμμές και ο άλλος είναι να κάνεις SetPixel σε Bitmap.Διάβασε αν θέλεις και τον παρακάτω κώδικα που έχει μικρά παραδείγματα . Φτιάξε μία φόρμα και βάλε 3 command button απάνω της.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
     
    Option Strict On
    
    Public Class Form1
        ' Μπορείς να ζωγραφίσεις είτε στο paint event παίρνωντας το Graphics Object
        Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
            Dim ctn As New Cartesian(e.Graphics)
            ''Dim X As Single
            ''Dim Y As Single
    
            ctn.Origin = New PointF(200, 200)
    
            e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.HighSpeed
    
            ctn.DrawAxes()
    
            e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
    
            ''For X = -10 To 50 Step 0.5!
            ''    Y = CType((Math.Sin(X)), Single)
    
            ''    ctn.Draw(New PointF(X, Y))
            ''Next
    
            ' Αν σε μπερδεύει το Delegate κάνε uncomment το προηγούμενο block
            ctn.Draw(AddressOf aFunction)
        End Sub
    
        ' Είτε στο OnPaint αν θές να κληρονομείται
        Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
            ' Μπλα Μπλα
            MyBase.OnPaint(e)
        End Sub
    
        ' Νπορείς επίσης να δημιουργήσεις Graphics Object όποτε το χρειάζεσαι.
        Private Sub cmdBitMap_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdBitMap.Click
            Dim g As System.Drawing.Graphics = Me.CreateGraphics
    
            Me.BitmapPlot(g)
            g.Dispose()
        End Sub
    
        Private Sub cmdClear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdClear.Click
            Dim g As Drawing.Graphics = Me.CreateGraphics
    
            g.Clear(Me.BackColor)
            g.Dispose()
        End Sub
    
        Private Sub BitmapPlot(ByVal graphics As Drawing.Graphics)
            Dim bmp As New Bitmap(255, 255)
    
            ' Plot, Αν θές απόλυτο έλεγχο ανά pixel
            ' Δες και παράδειγμα με Lockbits αν θες καλύτερο perfomance
            ' http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.lockbits.aspx
    
            For i As Integer = 0 To bmp.Width - 1
                For n As Integer = 0 To bmp.Height - 1
                    bmp.SetPixel(i, n, Color.FromArgb(255, 255 - i, i, i))
                Next
            Next
    
            graphics.DrawImage(bmp, 0, 0)
            bmp.Dispose()
        End Sub
    
        Private Sub cmdPaint_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdPaint.Click
            Me.Invalidate(False)
        End Sub
    
        Private Function aFunction(ByVal X As Single) As Single
            Return CType((Math.Sin(X)), Single)
        End Function
    End Class
    
    Public Class Cartesian
        Public Property Origin As PointF
        Public Property Graphics As System.Drawing.Graphics
    
        Private _PreviousPoint As PointF
        Private _bFirstTime As Boolean
    
        Public Sub New(ByVal graphics As System.Drawing.Graphics)
            Me._Graphics = graphics
            Me._bFirstTime = True
        End Sub
    
        Public Sub DrawAxes()
            Dim fnt As New Font("Arial", 8.0!)
    
            _Graphics.DrawLine(Pens.LightGray, 0, Origin.Y, 1000, Origin.Y)
            _Graphics.DrawLine(Pens.LightGray, Origin.X, 0, Origin.X, 1000)
            _Graphics.DrawString("(0,0)", fnt, Brushes.Orange, Origin)
    
            fnt.Dispose()
        End Sub
    
        Public Sub Draw(ByVal point As PointF)
            point.X *= 10 ' Ζουμαρε λίγο
            point.Y *= 10
    
            point = PointF.Add(point, New SizeF(Origin.X, Origin.Y - 2 * point.Y))
    
            If _bFirstTime Then
                _bFirstTime = False
                _PreviousPoint = point
                Return
            End If
    
            Dim pen As New Pen(Drawing.Color.Black, 1.6!)
    
            _Graphics.DrawLine(pen, _PreviousPoint, point)
            pen.Dispose()
    
            _PreviousPoint = point
        End Sub
    
        Public Sub Draw(ByVal MyFunction As Func(Of Single, Single))
            Dim X As Single
            Dim Y As Single
    
            For X = -10 To 50 Step 0.6!
                Y = MyFunction(X)
                Me.Draw(New PointF(X, Y))
            Next
    
            Me._bFirstTime = True
        End Sub
    End Class

     

     

     

     

  •  29-05-2011, 16:44 66050 σε απάντηση της 66049

    Απ: VB.net Γραφική Παράσταση (Ευθεία/Καμπύλη)

    Νομίζω οτι αυτό είναι ακριβώς αυτό που ζητάω.

    Αν και το κουμπί "paint" δεν κάνει τίποτα για κάποιο λόγο, το bitmap ζωγραφίζει πάνω στην φόρμα!

    Οπότε θα κάτσω να διαβάσω τον κώδικά σου για να καταλάβω τι κάνεις.

    Σε ευχαριστώ πάρα πολύ φίλε! έχεις και επεξηγήσεις μέσα, θα σου πήρε χρόνο.

    Ευχαριστώ, είσαι φοβερός!


  •  29-05-2011, 22:09 66052 σε απάντηση της 66050

    Απ: VB.net Γραφική Παράσταση (Ευθεία/Καμπύλη)

    Νά σαι καλά! Πρέπει να αλλάξεις κάποια πράγματα(κια) μόνος σου γιά να δουλέψει όπως πρέπει.

    Κατ' αρχήν πρέπει να βρεις έναν τρόπο να βγάλεις το boolean _bFirstTime. Επειδή είναι α) κακό να έχεις private flags τέτοιου τύπου και β) το function καλείται χιλιάδες φορές και ο παραμικρός έλεγχος καθυστερεί το πρόγραμμά σου. (Δοκίμασε να αλλάξεις το method από DrawLine σε DrawLines που παίρνει σαν παράμετρο array από points και να δεις έτσι τι perfomance gain έχεις).

    Βγάλε τα Hard Coded νούμερα και φτιάξε το Class με τέτοιον τρόπο που να παίρνει εύρος τιμών από το visible area της φόρμας αφού θα πρέπει ο χρήστης να μπορεί με το mouse να κάνει scroll και zoom (με το ctrl + mouse wheel ίσως) σε όποιο σημείο της  παράστασης επιθυμεί.

    Φτιάξε ένα control και βάλε τον κώδικα εκεί γιά να μπορείς να το χρησιμοποιείς παντού.  (Άλλαξε το Step σε 0.001 και δες ότι μόλις ξεκινάει το πρόγραμμα κάθε φορά που προστίθεται ένα control στην φόρμα (Command button) ξαναζωγραφίζεται η παράσταση από την αρχή. Με το Control θα το γλυτώσεις αυτό εύκολα).

    To invalidate καλεί το OnPaint method το οποίο με την σειρά του "σηκώνει" το paint event. Πάτα το button που ζωγραφίζει το bitmap και μετά το button paint. αλλοιώς γιά να ξαναδείς την γραφική παράσταση θα πρέπει να κάνεις κάποια κίνηση που να το καλέσει όπως π.χ. minimize και restore.

    Ρίξε μιά ματιά στο microsoft math αν θέλεις γιά να πάρεις ιδέες.

    Καλή επιτυχία και καλό λυώσιμο.Smile 

Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems