Laden...

LiniarGradientBruh Transformieren

Erstellt von Stu42 vor 16 Jahren Letzter Beitrag vor 16 Jahren 2.179 Views
S
Stu42 Themenstarter:in
506 Beiträge seit 2006
vor 16 Jahren
LiniarGradientBruh Transformieren

Hallo,

in meinem Programm kann man einen Farbverlauf auswählen. Doch damit der Farbverlauf so aussieht, wie man in gewählt hat, muss er Skaliert werden, da er sonst an einer Stelle einfach von vorne Anfangen würde.

Zum skalieren mache ich folgendes:

public static void ScaleLinarGradientBrush(LinearGradientBrush b, RectangleF Border)
        {
            //scale the LinearGradientBrush

            try
            {
                b.ResetTransform();
                b.TranslateTransform(Border.Left, Border.Top);
                b.ScaleTransform(Border.Width / b.Rectangle.Width,
                                                                Border.Height / b.Rectangle.Height);
            }
            catch (Exception) { }
        }

Funktionert auch, bis auf ein Detail. Wenn ich einen gedrehten Verlauf erstelle (über den Konstruktorparameter) dann wird der Verlauf intern über die Transformatiosmatrix gedreht.

Damit mein Verlauf aber nicht immer größer wird, mache ich vor jeder meine Scalierung:

b.ResetTransform();

Damit wird aber leider auf die Rotation resettet.

Erben, um den Winkel zu speichern geht auch nicht, da der Brush sealed ist.

Gibt es eine Möglichkeit, die Matrix vor meinen Transformationen zu speichern, und nach meinen Transformationen wieder so einzurechnen, das die Ursprungs Rotation noch vorhanden ist?

Also die Ursprungmatrix speicher, und gegen ende wieder einrechnen mit "multiply" geht nicht, das habe ich schon probiert.

Gruß Stu

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Stu42,

wo ist das Problem?


Matrix m = (Matrix)b.Transform.Clone ();
// ...
b.Transform = m;

herbivore

S
Stu42 Themenstarter:in
506 Beiträge seit 2006
vor 16 Jahren

dann ist meine Rotation aber wieder weg, ich will sie ja verschieben, und die Rotation beibehalten.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Stu42,

wenn die Rotation in b.Transform vor dem Sichern der Matrix enthalten ist, ist sie auch noch nach dem Wiederherstellen der Matrix da.

herbivore

S
Stu42 Themenstarter:in
506 Beiträge seit 2006
vor 16 Jahren

ja ich will es aber Gedreht transformiert haben. Es bringt mir ja nichts, wenn die größe von dem Verlauft stimmt, aber die Drehung weg ist.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Stu42,

also in deinem Code sehe ich keine Rotation. Das heißt doch, dass sie schon vorher in b.Transform drin ist, oder? Und wen sie vorher drin ist, ist sie auch in der geklonten Matrix. Und wenn sie dort drin ist, ist sie auch nach b.Transform = m wieder/weiter da.

b.ResetTransform(); musst du natürlich weglassen.

herbivore

S
Stu42 Themenstarter:in
506 Beiträge seit 2006
vor 16 Jahren

ja die Rotation kommt ja mit dem Erstellen des Verlaufes. Die Drehung ist da ein Paremter, welcher dann schon vorher die Matrix transformiert.

Ich könnte natürlich, wie du es gesagt hast, die Matrix speichern. Dann müsste ich aber: Transformeiren, Zeichen, Zurücksetzen.

Meine Urpsrungsfrage war ja, ob es nicht einen weg gibt, irgentwie ++nur ++meine Transformation zurück zu setzen.

Aber ich sehe schon, ich werd es wohl doch , wie du gesagt hast, mit dem clonen machen müssen.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Stu42,

Dann müsste ich aber: Transformeiren, Zeichen, Zurücksetzen.

das ist genau die Abfolge, die du jetzt schon benutzt. 🙂 An der Abfolge ändert sich durch meinen Vorschlag nichts. Nur die Art des Zurücksetzens ist ein bisschen anders.

Ich sehe keine Grund, warum das nicht ok sein sollte. Im Gegenteil, wenn du die Transformationen durch die "Gegenoperation" wieder rückgängig machen würdest, gäbe es nur unnötige Rundungprobleme.

Und dass die Transformationen nicht einzeln gespeichert werden, dürfte auch klar sein. Sie werden eben als Matrix gespeichert, in die sie alle zusammen eingerechnet sind.

herbivore

S
Stu42 Themenstarter:in
506 Beiträge seit 2006
vor 16 Jahren

ja du hast ja recht =)

Aber da ich diese Skalierungfunktion schon X-mal im code benutze, wäre es halt einfacher, alles nur in der Funktion machen, sprich mit einer Gegegoperation.

Aber ich werd dann in den sauren Apfel beißen, und die Transformation nach dem ändern in die Urpsrungsmatrix zurück setzen.

Danek für deine Hilfe 👍

S
Stu42 Themenstarter:in
506 Beiträge seit 2006
vor 16 Jahren

mhh, da gibts noch nen weitere Problem. Nach meinen Transformation ist der verlauf irgentwie falsch verschoben.

Siehe rechtes Bild.

Woher kann das kommen? Ich Verschiebe und scaliere doch eine gedrehte matrix...

public static Matrix ScaleLinarGradientBrush(LinearGradientBrush b, RectangleF Border)
        {
            Matrix Base;
            try
            {
                Base = (Matrix) b.Transform.Clone(); 
                b.TranslateTransform(Border.Left, Border.Top);
                b.ScaleTransform(Border.Width / b.Rectangle.Width,
                                                                Border.Height / b.Rectangle.Height);
               return Base;
            }
            catch (Exception) {
            }
            return new Matrix();
        }
49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Stu42,

ja, eben. 🙂 Erst gedreht und dann verschoben/skaliert. Finde ich ein nachvollziehbares Ergebnis.

Wenn du es anderes haben willst, musst du die Auswirkung der Drehung beim Verschieben/Skalieren entsprechend berücksichtigen.

herbivore

S
Stu42 Themenstarter:in
506 Beiträge seit 2006
vor 16 Jahren

das ist ja der Horror. So wie ich das hier sehe, sind die Auswirkungen der Drehung nicht mal irgentwie nen Offset, sondern irgent ein anderen Zusammenhang.

Das ist mir alles zu blöde, ich speicher mir einfach stumpf den Winkel ab, und erzeug mir nen neuen Verlauf

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Stu42,

sollte alles über Pythagoras gehen. Wenn nicht über Trigonometrie.

herbivore

S
Stu42 Themenstarter:in
506 Beiträge seit 2006
vor 16 Jahren

ja sollte 🤔

aber ich habs nun schon so anderst gelöst...

außerdem weiß ich nicht, wohin das Koordinaten systen transformiert wird.... und eher ich mich da einarbeite, löse ich es lieber schnell und einfach.