Rotation von einer Bitmap

  • Mit OpenGL als Textur auf eine Fläche zeichnen und diese drehen vielleicht…

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Hey Marco,


    ich hab jetzt einen relativ guten weg gefunden über Canvas den ich garnicht gewusst hab. ^^
    Aber ein kleines Problem gibt es trotzdem ich hab ein knick im Bild siehe Anhang.


    Hier der Code Snipped wie ich das Bild anpasse.





  • Der Knick scheint von oben links (topLeftX/topLeftY) nach unten rechts (bottomRightX/bottomRightY) zu gehen.


    Kannst Du das Ganze mal mit einer vernünftigen Dummy-Grafik machen?
    Beispielsweise von so einer Art Karopapier.
    Erst einmal quadratisch und dann vielleicht noch in einem Rechteck.


    Da lassen sich sicherlich bessere Annahmen zur Fehlerursache treffen.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Okay, wenn ich mir das Resultat in Verbindung mit der Dokumentation so ansehe, dann sieht das 'richtig' aus…


    Zitat von "Canvas.drawBitmapMesh(…)"

    A more general version of this method is drawVertices().


    Zitat von "Canvas.drawVertices(…)"

    Draw the array of vertices, interpreted as triangles (based on mode).


    Du nimmst ein 2D Bild von sagen wir 5,68cm Höhe und 3,20cm Breite.
    Jetzt möchtest Du das auf sagen wir 4,75cm Höhe (links), 2,78cm Breite (oben), 5,32cm Höhe (rechts) und 3,02cm Breite (unten) skalieren.
    Dein Ansatz macht Folgendes: aus den vier Punktpaaren schnibbelt es sich zwei Rechtecke und skaliert sie entsprechend.
    Stumpf gesagt hast Du jetzt ein Dreieck mit spitzem 72° Winkel und einer Schenkellänge von 2,78cm x 5,32cm.
    Sowie ein Dreieck mit einem stumpfen 98° Winkel und einer Schenkellänge von 3,02cm x 4,75cm.
    Auf diese Dreiecke werden jetzt die ausgeschnittenen Dreiecke projiziert: 3,20 x 5,68 mit 90° auf 2,78 x 5,32 mit 72°; 3,20 x 5,68 mit 90° auf 3,02 x 4,75 mit 98°
    Daher hast Du diesen Knick, der bei Linien stark auffallend sichtbar ist. (Andererseits hat eine solche Transformation bei reinen Farben wenig Sinn…)


    Die von Dir benutzte Methode teilt Dein Mesh in flächenmäßig ungefähr gleich große Dreiecke und projiziert über jedes Dreieck einen Ausschnitt Deines Ursprungsbildes.
    Das ist so eine Art simuliertes 3D, bei dem ja auch einzelne Texturen auf einzelne Dreiecksflächen gepackt werden. Und wie bei 3D gilt: je mehr und dadurch kleiner die Dreiecke, desto besser das Ergebnis.


    Du könntest also dem Canvas einfach statt 4 Ecken (oben links, oben rechts, unten links, unten rechts) auch 9 Ecken geben (oben links, oben mitte, oben rechts, mitte links, mitte, mitte rechts, unten links, unten mitte, unten rechts). Du kannst das meinetwegen auch auf 64 Ecken aufblähen. Die Qualität wird immer besser, die Berechnungszeit immer höher.


    Eine Alternative wäre natürlich, direkt ein OpenGL View mit einer entsprechend vorbereiteten Szene bereit zu stellen, auf der Du dann jeweils die Textur darstellst.
    Fakt ist: einfach mal so lässt sich das nicht umsetzen.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Kurze frage am Rande mit dem Koordinaten, ich hab die jetzt so angeordnert ist das soweit korrekt? Weil ich wüsste jetzt nicht wie ich die anders anordnen soll Ich bekomme da solch ein gebilde raus :/





    Code
    topLeftX, topLeftY,
    topMidX, topMidY,
    topRightX, topRightY,
    midLeftX, midLeftY,
    midMidX, midMidY,
    midRightX, midRightY,
    bottomLeftX, bottomLeftY,
    bottomMidX, bottomMidY,
    bottomRightX, bottomRightY
  • Die Anordnung scheint gemäß Dokumentation (von oben links nach unten rechts) richtig.
    Interessant müssten die Werte sein.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • das sind die einzelnen Werte (ja das ist sehr große koordinaten soll ja auch fullhd sein das bild ;) )



  • Davon ausgehend, dass oben links 0,0 ist, sieht das zumindest richtig aus…


    Ich würde jetzt einmal nur einzelne Viertel anzeigen, also zuerst topLeftX,topLeftY;topMidX,topMidY;midLeftX,mitLeftY;midMidX,midMidY;
    Dann mal gucken, was daraus gemacht wird.


    Dann das Viertel topMid->topRight->midMid->midRight und so weiter.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Sieht auf jeden Fall richtig aus.


    Nun mal die Hälften probieren: obere Hälfte, untere Hälfte, linke Hälfte, rechte Hälfte, aber mit den jeweils 6 Koordinaten.


    Also für die obere Hälfte:
    topLeftX, topLeftY;
    topMidX, topMidY;
    topRightX, topRightY;
    midLeftX, midLeftY;
    midMidX, midMidY;
    midRightX, midRightY;

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Ausgezeichnet, da läuft also irgendwas schief. =)


    Offenbar hat die Doku irgendwo gelogen. Es sieht für mich so aus, als würde Deine Eingabe nicht von oben links nach unten rechts aufgelöst, sondern total willkürlich.


    Snippet 1 geht von topLeft -> topMid -> midLeft;
    Snippet 2 geht von topMid -> topRight ->midLeft;


    Alle Weiteren werden stumpf ignoriert.


    Zurück zur Dokumentation:

    Zitat

    verts Array of x,y pairs, specifying where the mesh should be drawn. There must be at least (meshWidth+1) * (meshHeight+1) * 2 + vertOffset values in the array

    Das ist gegeben. Also weiter im Text.

    Zitat

    meshWidth The number of columns in the mesh. Nothing is drawn if this is 0
    meshHeight The number of rows in the mesh. Nothing is drawn if this is 0


    Das bedeutet wohl, Du musst die Angaben in Breiten und Höhe gemäß Deiner Koordinaten anpassen.

    Java
    // also statt
    canvas.drawBitmapMesh(screenshot, 1, 1, mPoints, 0, null, 0, null);
    // Bedeutet: erzeuge mir eine Zeile und eine Spalte; also ein einziges Feld.
    
    
    // lieber
    canvas.drawBitmapMesh(screenshot, 2, 2, mPoints, 0, null, 0, null);
    // Bedeutet: erzeuge mir zwei Zeilen und zwei Spalten; also vier Felder.


    Je detaillierter Du das Bild darstellen willst, desto mehr Zeilen und Spalten musst Du auch zusätzlich zu den Punkten definieren.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Gern.


    Irgendwann steht der Rechenaufwand aber vermutlich in keinem Verhältnis mehr zum Resultat.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!