Dreieck zeichnen, Katheden beschriften

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 50 Antworten in diesem Thema. Der letzte Beitrag () ist von MichaHo.

    Dreieck zeichnen, Katheden beschriften

    Hallo,
    ich hänge gerade an einer Einsendeaufgabe zum Fernstudium.
    Die Aufgabe lautet: Erstellen Sie ein Programm, mit dem dieses Dreieck (siehe Screenshot) gezeichnet werden kann. Mit dem Mauszeiger kann die Ecke B beliebig innerhalb des Formuars bewegt werden. A liegt in der Formularmitte. Die Bezeichnungen der Seiten a,b,c sind jeweils in der Höhe der Seitenmitte angezeigt.

    Ich bin soweit, das das Dreieck gezeichnet wird und die Ecken A,B,C beschriftet sind. Nun hänge ich aber seit Stunden an der Beschriftung der Katheden, also der Seiten selbst und komme nicht weiter. Kann mir bitte jemand erklären (bitte keinen fertigen Code) wie ich da vorgehen muss? Ich raffs einfach nicht.
    hier der entsprechnde Code, der das Dreieck zeichnet und die Ecken beschriftet.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) Handles Me.MouseMove
    3. Dim g As Graphics = CreateGraphics()
    4. Dim ptMitte As New PointF(CSng(ClientSize.Width / 2), CSng(ClientSize.Height / 2))
    5. Dim ptMaus As New PointF(e.X, e.Y)
    6. Dim ptKoord As New PointF(ptMaus.X - ptMitte.X, ptMitte.Y - ptMaus.Y)
    7. Dim pPen As New Pen(Color.Red)
    8. Dim bBrush As New SolidBrush(Color.Green)
    9. Dim fFont As New Font("Arial", 10.0)
    10. Dim gegenKathede As New PointF(ptMaus.X, ptMitte.Y)
    11. Dim anKathede As New PointF(gegenKathede.X, ptMitte.Y)
    12. Dim sAB As New Size(-15, -10)
    13. Dim sC As New Size(-10, 0)
    14. Dim sAnkathede As New Size(-10, CInt(anKathede.X / 2 + anKathede.Y / 2))
    15. 'Bildschirm löschen
    16. Refresh()
    17. 'Dreieck zeichnen
    18. g.DrawLine(pPen, ptMitte, ptMaus)
    19. g.DrawLine(pPen, ptMaus, gegenKathede)
    20. g.DrawLine(pPen, ptMitte, anKathede)
    21. 'Dreieck beschriften
    22. g.DrawString("A", fFont, bBrush, PointF.Add(ptMitte, sAB))
    23. g.DrawString("B", fFont, bBrush, PointF.Add(ptMaus, sAB))
    24. g.DrawString("C", fFont, bBrush, PointF.Add(anKathede, sC))
    25. g.DrawString("b", fFont, bBrush, PointF.Add(gegenKathede, sAnkathede))
    26. End Sub
    27. End Class

    anbei noch ein Bildle vom Dreieck.
    Ich Danke Euch
    Grüße
    Micha
    Bilder
    • forumDreieck.png

      3,74 kB, 207×138, 1.004 mal angesehen
    "Hier könnte Ihre Werbung stehen..."
    Hi,
    ich habe die Ecken beschriftet A,B und C. Ich muss die Seiten noch beschriften a, b und c. Diese Beschriftung soll immer in der Mitte der Seiten sein. Genauso wie auf dem Bild.
    DAS bekomme ich leider nicht hin und bräuchte einige Tips in die richtige Richtung...
    EDIT: im Anhang noch meine Form bei ausführung wie es im Moment aussieht.
    Bilder
    • forumForm.PNG

      5,19 kB, 330×336, 185 mal angesehen
    "Hier könnte Ihre Werbung stehen..."

    MichaHo schrieb:

    Tips
    Nimm die Ecken und berechne Dir die Mittelpunkte dieser, dann justierst Du sie so, dass es anständig aussieht.
    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!
    und genau da hänge ich... ich weis wie man die Hypothenuse, die Gegenkathede und Ankathede theoretisch berechnet, aber das in Programmcode umzusetzen, da steh ich aufm Schlauch.
    Die Hypothenuse also klein c berechne ich ja eigentlich nicht, sonder zeichne eine Linie von den Koordinaten der Mitte zu den Koordinaten der Maus. Und die beiden Katheden berechne ich ja auch nicht, sondern das sind ja PointF und damit kann ich nicht rechnen.
    Also müsste ich nochmal 3 Variablen nehmen und dann die einzelnen Seiten berechnen? da ich dann die Integer Varaiblen als Point fpr das DrawString nehmen kann?
    Ich blicks nicht, tut mir leid...
    "Hier könnte Ihre Werbung stehen..."

    MichaHo schrieb:

    Also müsste ich nochmal 3 Variablen nehmen
    Die sind doch schon da, Du musst sie nur zwischenspeichern.
    3 Punkte mit je 2 Koordinatenwerten.
    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 Ansatz ist ziemlich falsch, Painten soll man nur im Paint- und verwandten Events.
    Niemals mit CreateGraphics ein Graphics erstellen, um darauf zu painten!

    Ist eine ziemlich spezielle Aufgabe, und erstaunlich, dass im Studium nix über OwnerDrawing gelehrt wird, dann aber solche Aufgaben gestellt.

    Das Prinzip ist wie folgt: Erstell eine Klasse, die das 3-Eck repräsentiert, und die sich selbst zeichnen kann (inklusive Beschriftung), wenn man ihr ein Graphics gibt - ich nenne diese Klassen immer Figure.
    Ausserdem muss diese Klasse jederzeit ihr umschließendes Rechteck - die Bounds angeben können. Kapsel in dieser Klasse am besten ein GraphicsPath - Objekt, das ist eine Klasse, in der man Figuren vektor-orientiert speichern kann.
    Im genannten Paint-Event erhälst du in den PaintEventArgs das Graphics was du brauchst, damit rufst du die Zeichen-Methode der Figure.

    Vollkommen getrennt davon ist das Verändern dieser Figur, etwa in Reaktion auf ein MouseMove.
    Das geht in 3 Schritten:
    1. Rufe Control.Invalidate(rectangle) auf, und übergib die Bounds deiner Figur.
    2. Verändere die Figur - verschieben, verzerren, neuer Eckpunkt - whatever.
    3. nochmal Control.Invalidate(rectangle) aufrufen, und nochmal die (nun ja etwas geänderten) Bounds deiner Figur übergeben.
    Das ist alles - hier wird nicht gezeichnet.
    Das Neu-Zeichnen geht kurze Zeit später vom Betriebssystem aus, dann feuert das Control nämlich sein Paint-Event, und was darin zu geschehen hat, habich ja schon erzählt.

    Einfaches Beispiel ist vlt das DrawSimple-Projekt von ClockSample
    Sehr anspruchsvoll ist AdvancedPainting, aber dafür kann das auch Figuren sowohl komplett verschieben, als auch einzelne Eckpunkte, und hovern, selektieren etc, also was ernstgemeintes geht eiglich kaum unter diesem Niveau.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Hallo @ErfinderDesRades
    warum wusste ich, das das etwas komplizierter wird :)
    Danke für die Links, die werde ich mir anschauen und versuchen zu verstehen. Dann stelle ich die Aufgabe erstmal zurück.
    @RodFromGermany
    Ich hab ja nur 2 Variablen, die Gegenkathede und die Ankathede. die sind beide vom Typ PointF, damit kann ich nicht rechnen...
    also zum Beispiel gegenkathede / 2 denn die Beschriftung soll ja auch in der Mitte angezeigt werden, wenn ich das Dreieck mit der Maus verändere... ich glaub der Schlauch ist doch größer...
    "Hier könnte Ihre Werbung stehen..."

    MichaHo schrieb:

    Ich hab ja nur 2 Variablen, ... damit kann ich nicht rechnen...
    .X, .Y.
    Wie kannst Du ein Dreieck malen, ohne 3 Punkte zu haben?Wie kannst Du "A", "B", "C" dran schreiben, ohne 3 Punkte zu haben?
    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!
    Hallo @RodFromGermany, ich habs jetzt versucht, leider "hängt" dann das kleine a (Beschriftung für die Gegenkathede von B nach C) in der Luft (siehe Screenshot)
    Bitte sagt mir das ich mich "nur" Blöd anstelle...

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) Handles Me.MouseMove
    3. Dim g As Graphics = CreateGraphics()
    4. Dim ptMitte As New PointF(CSng(ClientSize.Width / 2), CSng(ClientSize.Height / 2))
    5. Dim ptMaus As New PointF(e.X, e.Y)
    6. Dim ptKoord As New PointF(ptMaus.X - ptMitte.X, ptMitte.Y - ptMaus.Y)
    7. Dim pPen As New Pen(Color.Red)
    8. Dim bBrush As New SolidBrush(Color.Green)
    9. Dim fFont As New Font("Arial", 10.0)
    10. Dim gegenKathede As New PointF(ptMaus.X, ptMitte.Y)
    11. Dim anKathede As New PointF(gegenKathede.X, ptMitte.Y)
    12. Dim sAB As New Size(-15, -10)
    13. Dim sC As New Size(-10, 0)
    14. Dim sKathedeA As New Size(10, 0)
    15. 'Bildschirm löschen
    16. Refresh()
    17. 'Dreieck zeichnen
    18. g.DrawLine(pPen, ptMitte, ptMaus) 'Hypothenuse (von A nach B)
    19. g.DrawLine(pPen, ptMaus, gegenKathede) 'Gegenkathede (Von B nach C)
    20. g.DrawLine(pPen, ptMitte, anKathede) 'Ankathede (Von A nach C)
    21. 'Dreieck beschriften
    22. g.DrawString("A", fFont, bBrush, PointF.Add(ptMitte, sAB))
    23. g.DrawString("B", fFont, bBrush, PointF.Add(ptMaus, sAB))
    24. g.DrawString("C", fFont, bBrush, PointF.Add(gegenKathede, sC))
    25. gegenKathede = New PointF(ptMaus.X / 2, ptMitte.Y / 2)
    26. g.DrawString("a", fFont, bBrush, PointF.Add(gegenKathede, sKathedeA))
    27. End Sub
    28. End Class
    Bilder
    • forumForm.PNG

      5,16 kB, 364×367, 210 mal angesehen
    "Hier könnte Ihre Werbung stehen..."
    Du hast Punkt A (ptMitte) und Punkt B (ptMaus). Beide haben X und Y Koordinaten.
    Der Verbindungsvektor AB berechnet sich aus (bx - ax | by - ay).
    Nimmt man nun die Hälfte dieses Vektors und addiert das zu A, hast du die Mitte.
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais

    MichaHo schrieb:

    Bitte sagt mir das ich mich "nur" Blöd anstelle...
    ok ;)

    Also in post#2 sagt Rod ja, du sollst den Mittelpunkt zweier Eckpunkte ermitteln, und das geht nicht, indem man iwelche Punkte zusammen-addiert.

    Sondern man muss den einen Punkt mit dem anderen addieren, und dann die Summe durch 2 teilen. Also ganz normale Mittelwert-Bildung, halt mit den X-/Y-Koordinaten.

    edit: zu spät :(
    das hab ich ja verstanden :( aber ich erhalte den Fehler, das ich bei PointF nicht / oder * oder + verwenden kann, das geht nur wenn ich dann wieder von den Points (ptMitte und ptMaus) die x und y koordinaten nehme.

    Also, ich hab ja in meinem Code oben bereits eine Variable ptKoord das ist ja quasi die Berechnung, die @ThePlexian beschrieben hat. aber ich kann mit ptKoord nicht weiter rechnen um dann zu sagen

    VB.NET-Quellcode

    1. gegenKathede = ptmitte + (ptkoord /2)

    ich glaub ich hör auf für heute und mach morgen weiter.... :(
    "Hier könnte Ihre Werbung stehen..."

    MichaHo schrieb:

    das geht nur wenn ich dann wieder von den Points (ptMitte und ptMaus) die x und y koordinaten nehme.
    ja, dann tu das halt.

    Ist richtig: Eigentlich sollte man in den Drawing-Klassen Point, Size, Rectangle, Point, SizeF, RectangleF etc. viel viel mehr Unterstützung für Vector-Rechnung, und auch zur Konvertierung der Typen untereinander erwarten.
    Gibts aber nicht, sondern muss man alles selber coden, und zwar eigens für jede Klasse (es sind ja Structures), also für Point, PointF, Size, SizeF, Rectangle, RectangleF.
    Weiters wünscht man sich auch allerlei Operationen für Rectangle / RectangleF (Mittelpunkt, Clipping etc.),... also meine größten Extension-Module überhaupt ärgern sich > 1000 Zeilen allein damit herum, den System.Drawing-Sch... einigermaßen für Programmierer umgänglich zu kriegen.

    MichaHo schrieb:

    das ich bei PointF nicht / oder * oder + verwenden kann,

    RodFromGermany schrieb:

    .X, .Y.
    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!
    Also irgenwie juckts mich da in den Fingern, wenn ich sowas lese. Das Problem ist fast trivial (ist ja offensichtlich eine Übungsaufgabe). Ich kann dir ohne weiteres einen Code in Vb3 liefern (immerhin bin ich ja Vb3-Guru ;) ). Vb6 krieg ich auch hin. Nur bei Vb.Net haperts ein bisschen. Also ein Dreieck interaktiv zeichnen, Beschriftung der Eckpunkte und der Achsen interaktiv, Bewegung der Eckpunkte durch Handles etc. Dass muss dann der Erfinder des Rades übersetzen.

    Interesse?

    Gruß,

    Klaus

    P.S. @Super-Moderatoren. Ich bin einer von der Konkurrenz, aber durchaus wohlgesonnen (meine Anerkennung für eine gelungene Vb-Site) und will euch keinesfalls ins Handwerk pfuschen :)
    Hallo und Guten Morgen,
    ich wollte erstmal kurz sagen, das ich schon weis, wie man die Seiten eines Dreiecks und auch die Mitte der Seiten berechnet... das Problem liegt nur an dem Übersetzen in VB-Net Code.
    Ich habe den Hinweis von @ThePlexian mal in Code umgesetzt:

    VB.NET-Quellcode

    1. Dim ptKoord As New PointF(ptMaus.X - ptMitte.X, ptMitte.Y - ptMaus.Y)
    2. Dim ptHypothenuse As New PointF((ptKoord.X / 2) + ptMitte.X, (ptKoord.Y / 2) + ptMitte.Y)

    So müsste ich doch die Mitte der Seite klein c berechnet haben, oder?
    @RodFromGermany gab ja auch schon den Hinweis das ich mit den x und y koordinaten rechnen muss, das habe ich auch versucht umzusetzen.
    Das Ergebnis ist allerdings komplett falsch :( siehe Screenshot

    @VB3-Guru: kannst Du gerne mal schicken...
    Bilder
    • forumForm.PNG

      36,97 kB, 782×422, 436 mal angesehen
    "Hier könnte Ihre Werbung stehen..."