Grafikprogrammierung Füllen mit Farbe

  • VB.NET

Es gibt 99 Antworten in diesem Thema. Der letzte Beitrag () ist von Uwe_S.

    Grafikprogrammierung Füllen mit Farbe

    Hallo liebe User,bin neu hier, habe wenig Programmier-Erfahrung und hoffe, hier Hilfe zu finden. Es geht um folgendes:Aus einer Textdatei lese ich Koordinaten von Linien und Kreisbögen ein. nachdem ich in einer For-Next-Schleife die Endpunkte berechnet habe, lege ich diese in einem dynamischen Array ab.Mit Hilfe der DrawLine-Methode und der DrawArc-Methode gib ich dann diese zusammengesetzte Geometrie auf dem Bildschirm aus. Nachdem ich die Kontur geschlossen habe, versuchte ich die innenliegende Fläche der Geometrieelemente mit einer Farbe zu füllen, doch leider habe ich dafür noch keinen geeigneten Befehl gefunden! Mit "FillRectangle" oder ähnlichem komme ich nicht weiter, da die Geometrie eine X-beliebige sein kann. Die Anzahl der Elementen (Linie,Kreisbögen) können auch bis zu 500Stck. sein. Gibt es einen VB-Befehl bei dem ich solche Flächen mit Farbe füllen kann??? Wäre toll, wenn mir jemand weiterhelfen könnte! Danke im Voraus!
    LG Uwe_S
    Bilder
    • Simulation.jpg

      19,16 kB, 960×720, 257 mal angesehen
    @Uwe_S Willkommen im Forum. :thumbup:
    Pack all eine Konturelemente in einen GraphicsPath und stell ihn füllend dar:

    VB.NET-Quellcode

    1. Imports System.Drawing.Drawing2D
    2. Public Class Form1
    3. Private gp As GraphicsPath
    4. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    5. gp = New GraphicsPath()
    6. gp.AddLine(New Point(0, 0), New Point(100, 0))
    7. gp.AddLine(New Point(100, 0), New Point(100, 100))
    8. gp.AddLine(New Point(100, 100), New Point(0, 100))
    9. gp.AddLine(New Point(0, 100), New Point(0, 0))
    10. gp.CloseFigure()
    11. Me.Invalidate()
    12. Me.Update()
    13. End Sub
    14. Private Sub Form1_Paint(sender As System.Object, e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
    15. If gp IsNot Nothing Then
    16. e.Graphics.FillPath(Brushes.Black, gp)
    17. End If
    18. End Sub
    19. End Class

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Habe doch noch eine Frage!
    Wenn ich alle meine Konturelemente in ein GraphicsPath packe, muss ich dann unbedingt die Kreisbögen in Punkten zerlegen? ( ich glaube 4 muss man angeben)
    Da ich den Kreisbogen mit DrawCurve-Befehl gezeichnet habe, muss man die Rechteckkoordinaten,Radius,Startwinkel und Endwinkel angeben! Das bedeudet diese Berechnungen sind umsonst?!
    Ich müsste also von jedem Kreisbogen mind. 4 Punkte berechnen, oder?
    Kann ich eigentlich alle Punkte von den Elementen in ein dynamischen Array ablegen und später mit dem "Add-Befehl" einen GraphicsPath festlegen? Ich weiß ja vorher nicht wie viele Punkte es sind!

    Danke!

    Uwe_S schrieb:

    Wenn ich alle meine Konturelemente in ein GraphicsPath packe, muss ich
    zunächst mal die MSDN bemühen, die Du, wie oben schon gepostet, hier findest.
    Spart echt das Stellen diverser Fragen.
    Bilder
    • Add.png

      57,27 kB, 671×935, 247 mal angesehen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    So nun stehe ich leider vor einem nächsten Problem.
    Diese erzeugte Kontur möchte ich mit einem Werkzeug abfahren (simulieren) können.
    Muss ich da unbedingt jedes einzelne Pixel von jedem Element (Linie/Bogen) berechnen und dieses abfahren, oder kann ich solch eine Simulation ebenfalls über die DrawLine bzw. DrawArc -Methode realisieren?

    Danke!
    LG Uwe

    Uwe_S schrieb:

    und dieses abfahren
    Ein Werkzeug hat eine endliche Dimension, Du musst da die Abformung berücksichtigen (eine einfache Bohrung endlichen Durchmessers wäre da mit der Mittelachse äquivalent).
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Der GraphicsPath berechnet aus all den hinzugefügten Linien, Arcs, ... letztendlich auch nur ein Punktarray. Du müsstest mal nachschauen, aber es gibt sicher ne Möglichkeit, dieses Array zu bekommen.
    falls nicht, müsste ich die Punkte (jedes Pixel) berechnen! Ich habe ja über die Draw-Funktion die Möglichkeit dazu da ich ja die Geometrie der einzelnen Elemente kenne. Und wenn ich diese habe müsste ich die Äquidistante davon berechnen, denn das ist der tatsächliche Verfahrweg für die Kontur (Werkzeugmittelpunkt fährt auf Äquidistante). Und wenn ich das alles mal realisieren sollte muss ich das Werkzeug (Diamant) auch noch um diesen Radiusmittelpunkt drehen können. Auwaija, jetzt wird's kompliziert. Danke für die Antworten, vielleicht erhalte ich noch von jemandem Hilfe! Ich hoffe ich habe mein Vorhaben genau genug geschildert! Danke!

    LG Uwe

    Uwe_S schrieb:

    aussehen
    Das ist genau das, was ich Abformung nenne.
    Du kannst es im 1. Schritt (Werkzeug wird nicht gekippt) quasi grafisch lösen, indem Du das Minimum aller möglichen Abstände zwischen Werkzeugkontur und Werkstückkontur für jede Position beider zueinander ermittelst.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Uwe_S schrieb:

    versetzte Kontur
    ist das Resultat dieser Prozedur.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wenn ich die versetzte Kontur berechnet habe und den Radius eingezeichnet habe, kann ich dann von dort aus tangential meinen Winkel zeichnen?
    Gibt es die Möglichkeit das Werkzeug (Diamantradius mit Winkel) als "eigene Grafik" festzulegen. Vielleicht könnte ich das Werkzeug nur um den Radiusmittelpunkt (Äquidistante) drehen lassen???
    Ohje, ich glaube jetzt wird's kompliziert!

    Uwe_S schrieb:

    jetzt wird's kompliziert
    So isses.
    Rechne mit Daten.
    Deine Maschine weiß nix von Pixeln, sie hat einen Vorschub, eine Zustellung und einen Eingriffswinkel oder wie das bei Dir heißt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Sorry, aber ich verstehe dich nicht ganz. Wie soll ich Elemente abfahren, wenn nicht über Pixeln???
    Ich rechne die Länge der einzelnen Elemente in Pixeln um und setze so die Kontur zusammen. Die gesamte Kontur muss ich anschließend in Pixeln berechnen und das mit der Äquidistanten.
    Bin ich da so total falsch?

    Uwe_S schrieb:

    Wie soll ich Elemente abfahren
    Über Koordinaten.
    Trenne Daten und GUI!!!
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!