Hallo Leute,
ich möchte eine Polyline in einem Image darstellen, was auch mit PathGeometry, PathFigure etc. kein Problem ist. Das schöne am Polylinesegment ist, dass es eine PointCollection besitzt und auf Veränderung sofort reagiert. Das bedeutet, ich brauche nur die Punkte ändern, wenn ich das Bild verändern will und muss es nicht komplett neu zeichnen.
Mein Problem ist jetzt, dass ich eine Datenquelle (Source) habe, welche ich irgendwie an diese PointCollection binden will. In der Datenquelle gibt es nur ein Array von Doubles. Dann habe ich auch schon die Routine zum Umwandeln der Werte in Points.
Zur Zeit habe ich die PointCollection noch global deklariert und mit der der Polyline verknüpft, damit man darauf zugreifen kann, wenn man die Werte verändern will. Ich bräuchte jetzt natürlich eine direkte Lösung ohne globale Deklaration, da es nicht nur um ein Array mit Werten und auch nicht nur um eine Source geht, sondern das Ganze variabel sein muss.
Ich hatte überlegt, die PointCollection und die Umwandlung der Werte in die Source zu verlagern, aber eigentlich sollte das Source-Object nur die Daten halten, nicht verarbeiten.
Hier mal der bisherige Code:
Class Window1
Private mSource As New Source
Private mPoints As New PointCollection
Private mMin As Double = 0
Private mMax As Double = 1
Private Sub Window1_Loaded(ByVal sender As System.Object, ByVal e As _
System.Windows.RoutedEventArgs) Handles MyBase.Loaded
Dim dg As New DrawingGroup
Using dc As DrawingContext = dg.Open
Dim pen As New Pen(Brushes.DarkBlue, 2)
Dim geo As New PathGeometry
Dim fig As New PathFigure
Dim pl As New PolyLineSegment
pl.Points = mPoints
pl.IsStroked = True
fig.Segments.Add(pl)
geo.Figures.Add(fig)
dc.DrawGeometry(Brushes.Transparent, pen, geo)
dc.DrawRectangle(Brushes.Transparent, New Pen(Brushes.Black, 4), _
New Rect(0, 0, 1000, 500))
End Using
Draw()
Image1.Source = New DrawingImage(dg)
End Sub
Public Sub Draw()
With mSource
mPoints.Clear()
Dim points As Point() = ConvertValuesToPoints(mSource.Values, 1000, _
500, mMin, mMax)
For Each p As Point In points
mPoints.Add(p)
Next
End With
End Sub
Private Function ConvertValuesToPoints(ByVal values As Double(), ByVal solX _
As Double, ByVal solY As Double, ByVal min As Double, ByVal max As _
Double) As Point()
Dim points As New List(Of Point)
Dim intervalX As Double = solX / values.Length
For i As Integer = 0 To values.Length - 1
If values(i) > min And values(i) < max Then
Dim abstandOben As Double = max - values(i)
points.Add(New Point(i * intervalX, (abstandOben / (max - min)) _
* solY))
End If
Next
Return points.ToArray
End Function
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _
System.Windows.RoutedEventArgs) Handles Button1.Click
mMin += 0.1
mMax += 0.1
Draw()
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As _
System.Windows.RoutedEventArgs) Handles Button2.Click
mMin -= 0.1
mMax -= 0.1
Draw()
End Sub
End Class
Public Class Source
Private mValues As Double()
Public Property Values() As Double()
Get
Return mValues
End Get
Set(ByVal value As Double())
mValues = value
End Set
End Property
Public Sub New()
Dim r As New Random
Dim lst As New List(Of Double)
For i As Integer = 0 To 100
lst.Add(r.Next(0, 100) / 100)
Randomize()
Next
mValues = lst.ToArray
End Sub
End Class Danke im Voraus
Maas
Beitrag wurde zuletzt am 11.11.09 um 17:16:28 editiert. |