Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Gedrehter Gradient im Rechteck (https://www.delphipraxis.net/187596-gedrehter-gradient-im-rechteck.html)

Medium 13. Dez 2015 07:29


Gedrehter Gradient im Rechteck
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich zweifle gerade an mir selbst. Ich möchte einfach nur einen linearen Farbverlauf in ein Rechteck zeichnen. So weit so einfach. Diesen will ich aber gerne in einem beliebigen Winkel zeichnen, und zwar so, dass die Farbe 0 und Farbe 1 immer irgendwo genau am Rand landen, der Verlauf aber das Rechteck genau ein mal ausfüllt. Ein Bild ist da weit aussagekräftiger als Text, daher bitte jetzt den Anhang ansehen. (Angegeben wird der Verlauf mittels zweier Punkte zwischen denen der Verlauf läuft, bei mir P0 und P1.)

(Ich warte so lange.)

Ok, am Bild sieht man, dass ich schon mal auf den Trick gestoßen bin, dass die Eckpunte um den Faktor Sqrt(2) weiter vom Zentrum entfernt sind als die Kantenmittelpunkte. Und für diese zwei Fälle (Drehung um Vielfache von 90° und Drehung um Vielfache von 45°) stimmt das Ergebnis auch. Leider aber für alles dazwischen nicht, wenn ich zwischen den Faktoren "1" und "Sqrt(2)" linear mit dem Winkel interpoliere. Dann laufen nämlich meine "Endkanten" des Verlaufs durch das Rechteck (ganz rechts im Bild gezeigt), und das sollen sie nicht.
In irgend einer Weise muss das mit der kleinsten umschließenden Ellipse zusammenhängen (daher kommt auch die Sqrt(2)), aber das in zwei Punkte in Abhängigkeit von Mittelpunkt, Breite, Höhe und Drehwinkel zu verpacken - da habe ich irgendwie eine Blockade. Auch Google half leider nur wenig, da viele offenbar nur die 90° oder 45° Fälle brauchen.

Für ein Quadrat allerdings funktioniert der gezeigte Weg schon! Aber das genügt leider nicht. Ich hoffe, dass hier jemand etwas Licht in mein Hirn bringen kann. Danke schon mal!

(Realisiert wird das ganze in C#, das sollte aber eher unerheblich sein. Wenn sich durch die Benutzung davon (also GDI+) einfachere Wege bieten als die P0 und P1 von Hand zu berechnen, wäre ich aber natürlich auch interessiert, weshalb ich das hier kurz erwähne.)

Dejan Vu 13. Dez 2015 09:59

AW: Gedrehter Gradient im Rechteck
 
Nennen wir deine beiden Eckpunkte E0 und E1. Deine gesuchten Punkte P0 und P1 liegen auf einer Geraden G durch C im gewünschten Neigungswinkel Phi des Gradienten verläuft.

P0 ist doch der Schnittpunkt der Senkrechte zu G, die durch E0 geht. Für P1 gilt das gleiche.

Namenloser 13. Dez 2015 10:18

AW: Gedrehter Gradient im Rechteck
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier noch mal als Skizze.

Medium 13. Dez 2015 16:56

AW: Gedrehter Gradient im Rechteck
 
Ok, so weit so gut. Ich habe jetzt einfach mal naiv den Schnitt gebildet:

S: Vektor (sin(φ) cos(φ))
K: Gerade durch C im Winkel φ
K': Senkrechter Vektor zu K (-Ky Kx)
N: Gerade durch E0, senkrecht zu K

Code:
    /sin(phi)\
S = |        |,
    \cos(phi)/


K = C - aS,

     /-Cy + a*cos(phi)\
K' = |                |,
     \ Cx - a*sin(phi)/

N = E0 + bK'

Ziel: N = K
(Das φ kennt die Code-Box leider nicht :( )

Ich habe das mal ausmultipliziert und nach b gelöst, und dies eingesetzt um nach a auflösen zu können. Aber irgend etwas passt da gewaltig nicht. Ich komme auf eine quadratische Gleichung für a, also 2 Lösungen! Das dürfte beim Schnitt von 2 Gerade doch überhaupt nicht sein. (Und der Term ist ein höllischer Rattenschwanz.)
Dazu kommt, dass "-Cy + a*cos(φ)" nicht 0 werden darf, und ich für den Fall auch noch die komplett anders herum aufgebaute Lösung brauche. (sin(φ)+cos(φ) darf auch nicht 0 werden, aber das sollte es ja nie.)

Ich befürchte hier grobe Denkfehler, die ich in 2 dicht beschriebenen DIN A4 Seiten mit Monster-Termen nicht mehr finde. Die Lösung muss vom Gefühl her viel einfacher sein.

Namenloser 13. Dez 2015 22:02

AW: Gedrehter Gradient im Rechteck
 
Eigentlich sollte der Schnittpunkt sich leicht finden lassen, indem du den Punkt C ganz einfach auf die Senkrechte projizierst. Die Lösung müsste dann P = E + (cos φ, sin φ)*(C-E) sein.

Ich muss aber zugeben, ich habe auch erst ein paar Minuten lang sinnlos Variablen auf dem Papier hin- und hergeschoben, bis ich darauf gekommen bin. :drunken: Hoffe, das stimmt jetzt auch. Aber müsste es eigentlich.

Medium 13. Dez 2015 23:01

AW: Gedrehter Gradient im Rechteck
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab das mal exemplarisch angewendet.

Gegeben ist ein Rechteck mit der oberen linken Ecke E bei (10,10) und einer Breite von 100 und Höhe von 30. Der Mittelpunkt C liegt dann bei (60,25).

Für φ = 0° ergibt sich korrekt der Punkt P=(60,10)
Für φ = 90° ergibt sich korrekt der Punkt P=(10,25)
Für φ = 45° ergibt sich falsch der Punkt P=(45.35,20.605) (Es sollte (10,10) sein)

Da schleicht sich auch wieder dieser blöde Faktor von Sqrt(2)/2 ein, da Sin(45°) ~= 0.707 = Sqrt(2)/2.

Die Menge der Punkte P müssten - wenn ich mir das richtig vorstelle - in etwa so wie im Anhang aussehen (rote Kurven). Die Frage ist dann aber, welche Formel gibt diese vor, bzw. sind das echt Halbkreise/-ellipsen, und wenn ja mit welchen radii?

Medium 14. Dez 2015 02:26

AW: Gedrehter Gradient im Rechteck
 
Ich hab's! Bloß nicht auf die Uhr gucken, morgen wird grausig. Aber das musste gelöst werden.

Ich hatte bei meinen Umformungen den super dämlichen Fehler gemacht, die Senkrechte der Geraden K zu bilden, aber das durfte natürlich nur ihr Richtungsvektor S sein! Autsch. Dadurch fällt auch das Quadrat in meinen Umformungen weg, und es gibt am Ende nichtmals mehr DivBy0-Fallen.
Der einzige kleine Vermutstropfen: Ich muss anhand des Winkels entscheiden, welchen Eckpunkt ich nun für die Rechnung her nehme. Okay, eine lästige Fallunterscheidung, aber dafür klappt es!

Der unschuldig aussende Term: (Statt sin(φ) und cos(φ) schreibe ich mal nur und sin und cos.)
Code:
    /sin\
S = |   |
    \cos/

P0 = C - a*S
P1 = C + a*S

E := Eckpunkt, in dessen grobe Richtung eine Gerade im Winkel phi vom Punkt C aus zeigt
    (Man bildet quasi Quadranten um C)

a = Cx*sin - Ex*sin + Cy*cos - Ey*cos
Danke euch nochmals!!

BUG 14. Dez 2015 02:31

AW: Gedrehter Gradient im Rechteck
 
Liste der Anhänge anzeigen (Anzahl: 1)
EDIT: Jetzt hab ichs geschrieben, jetzt poste ich es noch :stupid:

Du hast deine Gerade K = C - a*S. Wenn du du die Eckpunkte auf die Gerade projizierst, erhältst du Punkte auf der Gerade. Die beiden "äußeren" (minimales/maximales a) sollten die Punkte sein die du suchst.

Anhang 44434

Medium 14. Dez 2015 02:48

AW: Gedrehter Gradient im Rechteck
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ups, auch so ein Nachtschwärmer hm? :) Genau das verbirgt sich hinter meinen wilden Formeln jetzt. Danke dir trotzdem!

Im Anhang ein Bild davon, wie die Punkte P tatsächlich liegen. Meine Annahme von oben traf nicht ganz zu, aber Kreise sind es trotzdem - 4 davon sogar :D
(Und wenn man es sieht, erscheint es auch wundervoll logisch dass das so gehen muss.)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:28 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz