Linien in einer Grafik zusammenfassen

  • VB.NET

Es gibt 40 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Linien in einer Grafik zusammenfassen

    Hallo liebe user,

    habe ein kleines Problem:
    Wie kann ich mehrere gezeichnete Linien als "1ne Grafik" ablegen und diese dann im Paint-Ereignis über dem Bildschirm "laufen" lassen? Welcher Punkt wird dann mein Bezug?
    Die Anfang- bzw. Endpunkte für die verschiedenen Linien habe ich bereits in einer Prozedure berechnet.

    Wäre super, wenn mir jemand mit einem kleinen Beispiel weiterhelfen könnte!!! :D
    Im Voraus vielen Dank!

    LG
    Vielen Dank ErfinderDesRades,

    was mir aber einfach nicht klar wird, ist:

    Mit z.B. einer Ellipse kein Problem:

    VB.NET-Quellcode

    1. Dim g2 As GraphicsPath = New GraphicsPath
    2. g2.AddEllipse(pos_Einzelsatz)
    3. e.Graphics.DrawPath(Pens.Black, g2) 'zeichnen



    ... aber wie mache ich das???

    VB.NET-Quellcode

    1. Points_berechnen(e, P1x, P1y, P2x, P2y, P4x, P4y, P3x, P3y) 'Prozedur Punkte berechnen
    2. Dim points() As PointF = New PointF() {New Point(P1x, P1y), New Point(P2x, P2y), New Point(P4x, P4y), New Point(P3x, P3y)}
    3. ... '?
    4. ... '?
    5. ... '?


    Die Linien die später durch die Punkte gezogen werden (neue Grafik), sollen auf die selben Koordinaten (pos_Einzelsatz) ablaufen wie bei der Ellipse!
    Wie muss ich das aber programmieren?


    Kurze Erklärung:
    Die Ellipse (bzw. Kreis) läuft auf einer bestimmten "Bahn" ab. Diese Bahn berechne ich und kann beliebig aussehen. Ich möchte jetzt nur, dass an dieser Ellipse (Kreis) links und rechts eine Tangente weggeht. Diese Punkte der Tangenten berechne ich in der Prozedur und übergebe sie im Paint-Ereignis aus.

    LG

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Uwe_S“ ()

    g2.AddPoints oder .AddLine oder sowas.

    guck dir Klassen, die du noch nicht kennst, immer gründlich im ObjectBrowser an

    Wie man mittm OB umgeht ist bisserl hier gezeigt: VisualStudio richtig nutzen (Google ist nicht deine Mami)

    Tatsächlich muss man jede Klasse, die man benutzt immer wieder mal im OB angucken, denn wirklich kennen tut man keine.
    Wusstest du, dass ein String ca. 150 Methoden hat, und kennst du die alle, und kannst sie verwenden? Jaa, du hast bestimmt gedacht, String kennest du :thumbdown: .
    Ebenso isses mit Date, mit Timespan, mit List(Of T), Point, Rectangle, ...
    Wnn ich z.B. eine Ellipse (bzw. Kreis) auf eine Sinuskurve ablaufen lassen möchte heisst es:

    VB.NET-Quellcode

    1. Dim g2 As New GraphicsPath
    2. g2.AddEllipse(Koordinaten_Sin)
    3. e.Graphics.DrawPath(Pens.Black, g2) 'zeichnen


    Möchte ich aber eine Grafik die aus mehreren Linien besteht ablaufen lassen, wie setze ich da den Bezugspunkt? g2.AddEllipse geht da ja nicht!!! ;(
    LG
    Ich versuche mal es etwas zu verdeutlichen.
    Das Werkzeug (Kreis mit Dreieck) steht auf dem Anfangspunkt einer berechneten Werkzeugbahn.
    Drücke ich nun die RETURN-Taste fährt nur der Kreis auf dieser Werkzeugbahn weiter nicgt aber das Dreieck.

    Der Kreis habe ich wie folgt programmiert und läuft ohne Probleme auf dieser Werkzeugbahn ab.

    VB.NET-Quellcode

    1. Dim pos_Einzelsatz = New Rectangle(Me.line_Einzelsatz(Me.index_Einzelsatz), New Size(0, 0)) 'Position, Größe (mittig vom Kreis)
    2. pos_Einzelsatz.Inflate(Diamantradius * Faktor, Diamantradius * Faktor)
    3. Dim g2 As New GraphicsPath
    4. g2.AddEllipse(pos_Einzelsatz)
    5. e.Graphics.DrawPath(Pens.Black, g2) 'zeichnen


    Wie programmiere ich aber das dazugehörige Dreieck? Habe die Punkte dafür berechnet und will sie nun mit den selben Koordinaten wie der Kreis mitfahren lassen, das geht aber nicht.
    Ich wusste nicht wie man den Kreis zusammen mit dem Dreieck (in 1ner Grafik) programmiert, deshalb habe ich vorerst mal nur den Kreis auf der Werkzeugbahn simulieren lassen!

    LG

    PS.
    Habe mir die Methoden mal angesehen, muss aber zugeben, da steige ich nicht durch. ;(
    Bilder
    • Bild1.jpg

      111,93 kB, 1.680×1.050, 146 mal angesehen
    • Bild2.jpg

      118,78 kB, 1.680×1.050, 178 mal angesehen
    @Uwe_S Das hatten wir schon, gugst Du hier.
    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!
    Euch allen vielen Dank nochmals für eure Hilfe!
    Habe es hinbekommen!. Vielleicht habe ich es auf Umwegen programmiert, aber es funzelt! ;)
    Jetzt muss ich es nur noch die Grafik drehen lassen, aber da sehe ich kein Problem, reine Rechenroutine.
    Aber eine kleine Frage habe ich zum Schluß trotzdem noch:
    Habe beim Timer den Interval auf 1 gesetzt (1ne Millisekunde). Da ich jedes einzelne Pixel anfahren möchte läuft mir die Simulation etwas zu langsam ab. Da der Interval-Wert nicht unter 1
    sein darf und ich den "Pixel-Schritt" nicht unbedingt erhöhen möchte wollte ich fragen, ob es vielleicht noch eine andere Möglichkeit gibt, die Geschwindigkeit zu erhöhen.
    Vielen Dank!

    LG

    Uwe_S schrieb:

    die Geschwindigkeit zu erhöhen
    kannst Du erhöhen, indem Du
    1. den Takt schneller machst
      oder
    2. die Schrittweite pro Takt vergrößerst, also 1, 2, 3, ... Schritte pro Timertakt abarbeitest und nicht alles darstellst.
    1 ms ist suboptimal, da kann es passieren, dass Du in die Tick-Routine reinkommst, bevor Du sie verlassen hast.
    Teste dies mal.
    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!
    Ups, ein kleines Problemchen,

    ich verwende "Microsoft Visual Basic 2010 Express". Bei der Programmierung muss ich oft Texte suchen und evtl. ersetzen lassen.
    Das Seltsame ist nur, obwohl das Symbol dafür in der Leiste aktiviert ist, wird kein Suchfenster geöffnet! Auch der Short-Cut funktioniert nicht (ist aber in den Einstellungen richtig
    eingetragen!). Ist das ein Software-Problem von VB2010??

    Uwe_S schrieb:

    Software-Problem
    Solch ist nicht bekannt. Wenn, dann könnte das ein

    Uwe_S schrieb:

    Express
    -Problem sein, was ich mir allerdings nicht vorstellen kann.
    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, das Problem mit dem Timer erfolgreich behoben!
    Jetzt fehlt mir nur noch, dass ich dass Werkzeug auf der abzufahrenden Äquidistante noch zusätzlich drehen kann.
    Der Drehpunkt muss der Radiusmittelpunkt vom Diamant sein. Er ändert sich ja fortlaufend bis zum nächsten Element.
    Verstehe nicht, wie ich beim Drehen den Drehpunkt festlege. Der akt. Drehpunkt ist ja in der Variablen pos_Einzelsatz bestimmt. (diese X/Y-Koord. habe ich mit Start_X,Start_Y gleichgesetzt)


    VB.NET-Quellcode

    1. Private Sub frm_Simulation_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    2. Dim pos_Einzelsatz = New Rectangle(Me.line_Einzelsatz(Me.index_Einzelsatz), New Size(0, 0))
    3. pos_Einzelsatz.Inflate(Diamantradius * Faktor, Diamantradius * Faktor)
    4. Dim g2 As New GraphicsPath
    5. g2.AddEllipse(pos_Einzelsatz)
    6. e.Graphics.DrawPath(Pens.Black, g2) 'Diamanradius zeichnen
    7. '----------------------------------
    8. Diamant_zeichnen(index_Einzelsatz, Folgesatz, e, Start_X, Start_Y) 'Prozedur Punkte berechnen
    9. '----- Transform + Drehung ---- ?
    10. e.Graphics.TranslateTransform(Start_X_Pixel, Start_Y)
    11. e.Graphics.RotateTransform(-30)
    12. '--- Diamantwinkel ---
    13. Dim Stift1 As New Pen(Color.Black, 2) 'Dicke=2
    14. Dim Diamant1 As New GraphicsPath
    15. Diamant1.AddLines(Points_Diamant1)
    16. End Sub


    LG
    ich rate beim OwnerDrawing immer davon ab, die Graphics zu transformieren.
    Erstell dir ein Matrix-Objekt, und gib dem die nötigen Transformationen ein, und wende diese Matrix auf einen GraphicsPath an, der deinen Diamant oder whatever darstellt.

    Also um bildlich zu sprechen: Male mit dem Stift, nicht mit dem Zeichenbrett.
    beiner Matrix kann man RotateAt() aufrufen - das ist eine Rotation an einem best. Punkt.
    @ErfinderDesRades Jou.
    @Uwe_S Mach Dir eine ordentliche Diamant-Klasse, die selbst weiß, wie sie steht, wenn der Winkel vorgegeben ist.
    Mach Dir dazu ein kleines Testprojekt zur korrekten Darstellung des Diamanten mit all seinen Parametern, und wenn das fertrig ist, übernimmst Du die Diamant-Klasse in das Ziel-Projekt.
    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!
    vielen Dank, für die schnelle Antwort.
    Werde es versuchen es so hinzubekommen. Bin nur froh, dass bisher alles so läuft wie ich es mir vorgestellt habe. Aber es scheint tatsächlich so, dass ich es über eine Klasse programmieren muss. Habe ich damals nur nicht hinbekommen und war froh, dass es auch so funktionierte. Aber wie heißt es so schön? LEARNING BY DOING! :D
    Nochmals vielen Dank. Ohje, sind ja schon wieder 57 Beiträge! ;( Werde versuchen, es kurz zu halten. :(

    Uwe_S schrieb:

    Werde versuchen, es kurz zu halten.
    Öffne Threads zu ganz speziellen Problemen, mach da keinen Rundumschlag. Formuliere Deine Probleme exakt. Da kann Dur auch punktgenau geholfen werden.
    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!
    Wieder eine Frage!

    Wenn ich eine geometrische Figur aus Kreisen und Linien in einem Grafik-Obkekt ablege (z.B. über Punkte Array myPath.Addline(...)), sind sie ja quasi in
    einem Objekt zusammen. Auf dieses Grafik-Objekt kann ich später mit dem Namen vollständig darauf zugreifen.
    Kann ich dieses Grafik-Objekt aber nur mit 1ner Farbe füllen, oder besteht die Möglichkeit z.B. den Kreis mit einer anderen Farbe zu füllen?
    Wahrscheinlich muss ich dann ein 2. Objekt erstellen um es mit mehrere Farben darstellen zu können, oder?

    LG