gezeichnetes Bild rotieren bzw. neu zeichnen?!



  • Hallo zusammen,

    ich habe ein Problem, an dem ich selbst nicht weiterkomme.

    Ich habe die Aufgabe ein Programm zu schreiben, in welchem man ein Sektglas sieht, das automatisch gekippt wird. Zudem soll sich eine Flüssigkeit der Neigung anpassen und auslaufen, sobald sie die Kante des Glases erreicht. Auf dem Boden soll sich eine Pfütze bilden.

    Nun zu meinem Problem:
    Bisher habe ich das Glas samt Füllung gezeichnet (siehe angehängtes Bild).
    Ich finde aber leider keinen Ansatz, wie ich das Glas "kippen" kann und dabei auch noch die Flüssigkeit berücksichtige.
    Eine Rotation des ganzen Bildes hilft mir ja aufgrund der Flüssigkeit nicht weiter, zumal ich noch nicht einmal für die Rotation einen Ansatz habe außer ganz grob über Polarkoordinaten..

    Ich hoffe, ich konnte mein Problem verständlich darstellen.

    Ich benutze Visual C++ 6.0, da ich dieses von der Uni gestellt bekommen habe.

    Kann mir jemand helfen? (nicht unbedingt mit fertigem Quellcode, ich will ja auch wissen, was ich machen muss, aber ein "Fahrplan" mit evtl. kleinen Beispielen würde mir sehr helfen)

    Bild:
    http://img48.imageshack.us/img48/64/sektglasxp9.jpg



  • Hallo.

    Wenn Du alles in der WinApi berechnen willst, bleibt Dir quasi nur die Bildverarbeitung. Dazu solltest Du allerding kein JPEG nehmen, sondern eine 24-Bit-DIB (Device Independent Bitmap). 24-Bit bedeutet: 8 bit Red, 8 bit Green, 8 bit blue. Also RGB. Ein JPEG hat zu viele Redundanzen, die Dein Bild beim Kippen immer schlechter werden lassen. Ausserdem muss Du ständig codieren und decodieren ... Das geht auf die Performance.
    Vielleicht ahnst Du schon, was das unter WinApi bedeutet: Jedes Pixel muss zu Fuss berechnet werden. Immer schön fleissig mit sin und cos, vielleicht auch tan, während das Glas rotationssymmetrisch gekippt werden soll. Wenn dann die (Oberflächen-) Linie der Flüssigkeit das oberste Pixel des Sektglases überschreitet (Stichwort: Kollisionskontrolle), wird es erst interessant. Die Form des Ausfliessens berechnen, die Form der Pfütze berechnen (soll doch größer werden, oder?). Da kann ich Dich nur fragen: Bis wann soll das fertig sein? Mein Tipp (wie immer bei sowas): OpenGL (oder DirectX).

    Einfach gesagt muss Du das in WinApi mit einem Timer (typisch >50 Hz wegen Auge) so implementieren:

    1. passiven Frame berechnen
    2. aktiven Frame passiv machen
    3. passiven Frame aktiv machen (2. und 3. nennen sich "swap buffers" oder "doublebuffering" um Monitorflimmern zu vermeiden)
    4. aktiven Frame zeichnen
    5. goto 1.

    Und mach mal die Lupe auf das JPEG weg ... !

    Googelst Du hier:

    http://www.google.de/search?hl=de&q=nehe&btnG=Google-Suche&meta=

    Du ersparst Dir eine Menge Ärger respektive Arbeit und gewinnst Rechenleistung mit OpenGL.

    Gruss

    Lars



  • wie kommst du darauf, dass er ein jpeg rotieren will?
    das ganze glas wird doch von hand gezeichnet, so wie ich das verstanden habe.

    Deshalb braucht man das ganze auch nicht pixelweise rotieren, es reicht, wenn man die endpunkte der Linen nimmt.

    Wegen dem Doublebuffering:
    DAs hat eigendlich nix mit dem monitorflimmern zu tun.
    Das es flimmert liegt daran, dass du sequenziell die sachen zeichest, die dann auch so dargestellt werden.
    Das Zeichnen passiert zwar recht schnell, dennoch sieht man es flackern.

    Edit:
    ihr programmiert an der Uni doch nicht etwa mit VisualBasic???
    Sekt ist normalerweise nicht blau 🤡

    Wenn das auschütten funktioniert, kannst du ja als gimmik ein paar Kohlensäurebläschen einbauen.

    Und wenn man zuviel Zeit hat:
    Ich würd die Flüssigkeit pixelweise berechnen, sollte bei so einem Glas nicht zu rechenaufwendig werden.
    Jedes Pixel, ein eigenes Objekt mit Position und Geschwindigkeit.
    Dann werden die auch schneller beim aus dem Glas tropfen, und beim Aufprall, kannste du welche wegspritzen lassen.



  • Noch ne ergänzung.

    Da dein Hauptproblem scheinbar die Rotation ist, folgende Schritte zur Hilfe:

    Ich würde die Koordinaten deines Glases intern in einem anderen Koordinatensystem halten, bei dem der Ursprung das Rotationszentrum des Glases ist.

    Beispiel:
    untere spitze des Glases ist Rotationszentrum:
    Glas gerade:
    Line(0,0,-107, -100)
    Line(-107, -100, 107, -100)
    Line(107,-100, 0,0)

    So lässt sich das ganze recht gut rotieren.
    http://de.wikipedia.org/wiki/Koordinatentransformation#Drehung_.28Rotation.29

    Die wichtige formel ist diese:
    http://upload.wikimedia.org/math/6/1/6/616eb0d72edaeaa833830bb083d0be99.png
    hmm, mist img tags funktionieren nicht

    Rotation um 30°
    sin(30°) = 0.5
    cos(30°) = 0.86

    Neue Linien:
    Line(0,0, -42, -140.10)
    Line(-42, , 142.66 , -33.103)
    Line( 142.66, -33.103,0,0)

    Beim Zeichen musst du natürlich, dann die Koordinaten des Drehpunkt auf die Koordinaten draufsummieren.


Log in to reply