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
Hallo Stu42,
wo ist das Problem?
Matrix m = (Matrix)b.Transform.Clone ();
// ...
b.Transform = m;
herbivore
dann ist meine Rotation aber wieder weg, ich will sie ja verschieben, und die Rotation beibehalten.
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
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.
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
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.
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
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 👍
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();
}
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
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
Hallo Stu42,
sollte alles über Pythagoras gehen. Wenn nicht über Trigonometrie.
herbivore
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.