Hi, ich habe festgestellt, dass ich ein Leitstungsproblem habe. 20 Sekunden, bis die Sub durch ist. Dabei ist sie schon asynchron.
Worum geht's eigentlich?
Es geht um mein Kantendetektionsprogramm. Dieser Thread beschäftigt sich jedoch mit einem Schritt vorher. Und zwar zeichne ich freihand einen GraphicsPath um das auszuschneidende Objekt. Das Innere des Paths soll geweißt werden. Dafür holt sich mein Code die xmin-, xmax-, ymin- und ymax-Werte aus den GraphicsPath.PathPoints, um 2 For-Schleifen nutzen zu können, und fragt dann mit .IsVisible(x,y) ab, ob mein derzeitiges x und y innerhalb des Paths liegen.
Ich zeichne übrigens freihand, weil ich es unvorteilhaft fand, ein Rechteck um einen Kreis ziehen zu müssen.
Was möchte ich erreichen?
Hat jemand einen schnelleren Code? Es geht in diesem Beispiel um circa 800 Punkte.
Spoiler anzeigen
*Topic verschoben*
Worum geht's eigentlich?
Es geht um mein Kantendetektionsprogramm. Dieser Thread beschäftigt sich jedoch mit einem Schritt vorher. Und zwar zeichne ich freihand einen GraphicsPath um das auszuschneidende Objekt. Das Innere des Paths soll geweißt werden. Dafür holt sich mein Code die xmin-, xmax-, ymin- und ymax-Werte aus den GraphicsPath.PathPoints, um 2 For-Schleifen nutzen zu können, und fragt dann mit .IsVisible(x,y) ab, ob mein derzeitiges x und y innerhalb des Paths liegen.
Ich zeichne übrigens freihand, weil ich es unvorteilhaft fand, ein Rechteck um einen Kreis ziehen zu müssen.
Was möchte ich erreichen?
Hat jemand einen schnelleren Code? Es geht in diesem Beispiel um circa 800 Punkte.
VB.NET-Quellcode
- Private Async Sub Button_Bereich_waehlen_Click(sender As Object, e As EventArgs) Handles Button_Bereich_waehlen.Click
- Await Task.Run(Sub() Bereich_waehlen_und_weissen())
- End Sub
- Private Sub Bereich_waehlen_und_weissen()
- If Picture1 Is Nothing Then Return
- Me.Invoke(Sub() Button_Bereich_waehlen.BackColor = Color.FromArgb(255, 255, 0))
- Me.Invoke(Sub() Button_Bereich_waehlen.Enabled = False)
- Me.Invoke(Sub() Button_Kantenerkennung_professionell.Enabled = False)
- Dim xmin As Single = selbstgezeichneterPath.PathPoints.Min(Function(p) p.X)
- Dim xmax As Single = selbstgezeichneterPath.PathPoints.Max(Function(p) p.X)
- Dim ymin As Single = selbstgezeichneterPath.PathPoints.Min(Function(p) p.Y)
- Dim ymax As Single = selbstgezeichneterPath.PathPoints.Max(Function(p) p.Y)
- Dim gFd As Integer = gewaehlteFarbeDurchschnitt.ToArgb() 'Durchschnittsfarbe: wie man sieht, hat der Taschenrechner Licht- und Schattenseiten.
- For x As Integer = CInt(xmin) To CInt(xmax) Step 1
- For y As Integer = CInt(ymin) To CInt(ymax) Step 1
- If selbstgezeichneterPath.IsVisible(x, y) Then
- Dim aktuelle_Farbe As Integer = Picture1.GetPixel(x, y).ToArgb()
- If Not (CDbl(aktuelle_Farbe) <= CDbl(gFd * (1.0 + ProzentAbweichung / 100.0)) OrElse CDbl(aktuelle_Farbe) >= CDbl(gFd * (1.0 - ProzentAbweichung / 100.0))) Then
- Picture1.SetPixel(x, y, Color.White)
- End If
- End If
- Next
- Next
- Me.Invoke(Sub() Button_Bereich_waehlen.BackColor = Color.FromArgb(0, 200, 0))
- Me.Invoke(Sub() PictureBox1.Invalidate())
- Me.Invoke(Sub() Button_Bereich_waehlen.Enabled = True)
- Me.Invoke(Sub() Button_Kantenerkennung_professionell.Enabled = True)
- Me.Invoke(Sub() Application.DoEvents())
- End Sub
*Topic verschoben*
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()