Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
|
Re: Verlauf mit "gewichteter" Farbe mittels Log?
5. Apr 2009, 10:33
Ich hab die die wichtigen Teile nochmal kommentiert
Code:
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
double pos = 0; // Position entlang der Paintbox/Picturebox im Intervall 0..1
double amount = 0; // Menge der ersten Farbe - soll also von links 1 (= 100%) nach rechts 0 werden
Color tempColor; // Wird die Farbe enthalten, an der Position an der wir gerade sind
Pen myPen = new Pen(col1); // Braucht man in Delphi nicht
for (int i = 0; i < pictureBox1.Width; i++)
{
pos = (double)i / (pictureBox1.Width - 1);
// pos errechnen. Wenn i = 0 dann pos = 0 Wenn i = (Width-1) dann pos = 1
amount = 1 - Math.Pow(pos, potenz);
// Menge der Farbe ausrechnen. Dazu potenzieren wir die Position (Intervall 0..1) mit der Potenz.
// Es kommt garantiert wieder etwas aus dem Intervall 0..1 raus.
// Da die Position von 0 nach 1 läuft, nehmen wir 1 - Math.pow() um die Menge der ersten Farbe rauszubekommen.
tempColor = MixColors(col1, col2, amount);
// Mischt die beiden Farben zusammen. Code siehe unten
myPen.Color = tempColor;
// Farbe merken
e.Graphics.DrawLine(myPen, new Point(i, 0), new Point(i, pictureBox1.Height - 1));
// Und eine vertikale Linie an der Position zeichnen an der wir gerade sind.
// (Wir bewegen uns horizontal und zeichnen dann immer eine 1px breite Linie von oben nach unten)
}
}
private Color MixColors(Color col1, Color col2, double amount)
{
if (amount < 0 || amount > 1)
throw new ArgumentOutOfRangeException("amount");
// Bitte tauschen Sie die FPU oder den Programmierer aus - einer von beiden macht Mist :-P
byte R = (byte)(col1.R * amount + col2.R * (1 - amount));
byte G = (byte)(col1.G * amount + col2.G * (1 - amount));
byte B = (byte)(col1.B * amount + col2.B * (1 - amount));
// Farben einzeln Mischen. Farbe := Farbe1 mal Menge + Farbe2 mal (1 - Menge)
return Color.FromArgb(R, G, B);
}
Ich hoffe das ist verständlich
|
|
Zitat
|