einfache Grafik rotieren lassen // EDIT: GDI+



  • Ok, diese grobe Idee hatte ich auch, allerdings weiß ich "programmiertechnisch" nicht, wie ich anfangen soll.
    Das Bild als Grafikbereich definieren - wie funktioniert das? Bin ich da bei (in-)validaterect richtig?
    Dann denke ich muss ich diesen Bildbereich ja rotieren - nur wie? ich habe etwas über transformationmatrizen gelesen, nur blicke ich da leider nicht wirklich durch bzw. weiß nicht, wie ich die theorie im Programmtext anwenden kann..
    Und was ich auch nicht rausfinden konnte: Wie kann ich das fenster oder den bereich der füllung vor jedem neuzeichnen leeren?



  • Lukas284 schrieb:

    .
    Und was ich auch nicht rausfinden konnte: Wie kann ich das fenster oder den bereich der füllung vor jedem neuzeichnen leeren?

    Was für eine GUI nutzt du denn? Direkt die WinAPI? Die ist mit der MSDN eigentlich sehr gut dokumentiert.

    Und eine Frage: Musst Du das ganze als Vektorgrafik zeichnen? Sonst wäre die einfachste Alternative eine Sprite-Animation 😉

    Hast Du denn schon geschafft, dass sich das Glas dreht?



  • Zur Rotation:

    Wenn du den Ursprung deines Koordinatensystems in den Drehpunkt deines Glases verlegst (geht mittels WinAPI, ich glaube irgendwie mit SetViewPortOrg...oder irgendwas ähnlichem) kannst du doch die Punkte deines Glases mittels der Rotationsmatrix rotieren lassen:

    cos phi    -sin phi
    sin phi     cos phi
    

    phi ist hier der Drehwinkel des Glases (mathematisch negativ orientiert wenn ich mich richtig erinnere, d.h. mit phi = pi/2 würde eine Drehung um 90° im Uhrzeigersinn herauskommen).

    Das machst du mit einer Matrix-Vektor-Multiplikation (Jeder Punkt deines Glases ist ja im Prinzip ein Spaltenvektor mit 2 Zeilen weil wir uns im R2 befinden).
    Die Matrix wird einfach ein 2D-Array, die Multiplikation kannst du wahrscheinlich mit 2 verschachtelten Schleifen einfach implementieren, ansonsten gibt es wahrscheinlich sogar gratis Bibliotheken für lineare Algebra, dort könntest du dann den Vektor statt als POINT auch als Array angeben und eine Bibliotheksfunktion aufrufen, die dir den Vektor rotiert, so könntest du dir die Implementierung sparen.



  • @HansWurst:

    Ja WinAPI, allerdings hab ich davon bisher kaum ne Ahnung. Wir wurden mit der Aufgabe etwas überrumpelt und allein gelassen..
    Sprite-Animationen sind Flash? Oder? das würde wohl nicht akzeptiert.
    Habe noch nicht geschafft die Grafik zu drehen.

    Das Prinzip ist mir klar, nur weiß ich nicht wirklich, wie es zu implementieren ist.

    Ich werde mich da morgen nochmal intensiv mit auseinander setzen (Danke auch an DAVE_R) und dann weitersehen.

    Falls mir noch jemand ein paar Stichpunkte bzw. Schlagwörter zum Code geben kann, bitte posten 🙂 Also, welche Klassen/Funktionen/etc. mir weiterhelfen könnten..

    Danke &
    Gruß
    Lukas



  • SpriteAnimation:
    Mal die Bilder in Paint, lade sie ins programm und zeichne sie auf den bildschirm

    WinAPI-Only wird das aber ne verdammt rucklige Angelegenheit...



  • Die Darstellung ist der Aufgabenstellung doch angemessen und hinreichend.
    Da rein zweidimensional, ist das "Glas" ein Dreieck und die rotierten Schenkel dem Einheitskreis zu entnehmen.
    Berechne anhand des Flaecheninhalts (korrekter waere Kegelvolumen) wieviel Wasser das gedrehte Glas maximal beinhalten kann; der Rest kommt in die Pfuetze.



  • Danke für die Antworten.

    Ich habe mich jedoch ein wenig umorientiert und will jetzt die GDI+ für diese Aufgabe verwenden.
    Habe translatetransform und rotatetransform gefunden um die ausrichtung des koordinatensystems zu verändern. ich denke damit komme ich weiter, jedoch hab ich im moment noch probleme zu verstehen, wie genau ich diese beiden funktionen aufeinander abstimmte ,damit das KOS an einem festen Punkt sitzt, auch wenn ich per for-Schleife mehrmals immer um 1° rotiere und translatetransform anwende.
    Nehme ich translatetransform(0,0), dann wandert der Bildkontext nach unten links aus dem fenster.. kann ich die jeweils nötige verschiebung irgendwie berechnen? (sin/cos)?

    Kann mir da jemand weiterhelfen?



  • Hallo,

    dieses Thema kann geschlossen werden.
    Ich habe mit Hilfe der GDI+, aber auch mit einigen Anregungen aus diesem Thread, das Projekt erfolgreich erledigt.

    Dankeschön!


  • Mod

    freut mich dass man dir hier hilfreiche tipps geben konnte 🙂

    ich lass den thread weiter offen, da irgendwann vielleicht jemand mit aenlichem problem hier weitermachen will.

    thx



  • Jo ich hab nen ähnliches Problem:

    Ich bin gerade dabei, mir ne 2D-Engine zu programmieren und möchte nun meine Sprites auch um beliebige Winkel drehen können. Die DirectDraw-Methode klappt bei mir irgendwie nicht. Deshalb möchte ich es auch Pixel für Pixel machen.

    Ich habe noch nicht ganz verstanden, wie ich jetzt die Position der einzelnen Punkte berechnen kann. Über das GDI könnte ich es notfalls auch machen, was mir aber nicht passen würde, weil ich da jede Menge umprogrammieren müsste.
    Kann mir nochmal jemand erklären, wie ich nun die einzelnen Positionen berechnen kann (nur zur Info: Sinus und Kosinus beherrsche ich schon, ich hab nur nicht verstanden, wie ich das jetzt machen muss!)?



  • Lukas284 schrieb:

    @HansWurst:

    Ja WinAPI, allerdings hab ich davon bisher kaum ne Ahnung. Wir wurden mit der Aufgabe etwas überrumpelt und allein gelassen..
    Sprite-Animationen sind Flash? Oder? das würde wohl nicht akzeptiert.
    Habe noch nicht geschafft die Grafik zu drehen.

    Das Prinzip ist mir klar, nur weiß ich nicht wirklich, wie es zu implementieren ist.

    Ich werde mich da morgen nochmal intensiv mit auseinander setzen (Danke auch an DAVE_R) und dann weitersehen.

    Falls mir noch jemand ein paar Stichpunkte bzw. Schlagwörter zum Code geben kann, bitte posten 🙂 Also, welche Klassen/Funktionen/etc. mir weiterhelfen könnten..

    Danke &
    Gruß
    Lukas

    Danke für den Tipp...


Anmelden zum Antworten