Bezier Kurvendiagramm in GDLib

Michael Engel

Erfahrenes Mitglied
Eine Frage an die Mathematiker unter uns, oder Leute mit Mathematik als LK ,)

Ich habe ein Problem mit Bezierkurven die ich gern berechnen würde. Es soll eine Glättung für ein Kurvendiagramm werden. Es funktioniert soweit auch einigermaßen, nur wie in der Grafik zu sehen gibts eben doch noch Kanten ,) vielleicht kann einer ja den Tip geben den mir irgendwie noch fehlt :|

Hier mal der Code :>

PHP:
<?php
// Werte zur Darstellung
$values = array(1,50,25,100,50,1,88,33,9,18,55,66);

header ("Content-type: image/png");
$im = @imagecreate(600, 100)
$background_color   = ImageColorAllocate ($im, 255, 255, 255);
$red            = ImageColorAllocate ($im, 233, 14, 91);
$gray           = ImageColorAllocate ($im, 210, 210, 210);
$green          = imagecolorallocate($im, 100,255,100);

// Horizontale Linien
for($i=0;$i<100;$i+=20){
    imageline($im,0,$i,600,$i,$gray);
}

// Eckige Linien
for ($i = 0; $i < count($values); $i++){
    $P1 = 100 - ($values[$i] - 1);
    $P2 = 100 - ($values[$i+1] - 1);

    imageline($im, $i*50,$P1, (($i+1)*50), $P2, $green);
}

// Bezier-Linien
for ($i = 1; $i < count($values); $i+=2){
    $P0 = ($values[$i-1]) - 1;
    $P1 = $values[$i] - 1;
    $P2 = ($values[$i+1]) - 1;

    for ($t=0;$t<=1;$t += 0.01){
        $p = pow(1-$t,2) * $P0 + 2 * $t * (1-$t) * $P1 + pow($t,2) * $P2;
        imagesetpixel($im, ($t * 100 + ($i-1)*50) ,99-$p, $red);
    }
}

ImagePNG ($im);
?>
 

Anhänge

  • diag.png
    diag.png
    1,5 KB · Aufrufe: 76
Schau mal bei Wikipedia rein, da ist ein fast fertiger Algorithmus sogar schon als Pseudocode angegeben, mit dem du eine Bezierkurve über n Punkte berechnen kannst. Du berechnest hier ja mehrere Kurven über 3 Punkte, daher hast du an den Ansatzstellen immer noch die Ecken drin.

Wenns nicht unbedingt die originale Bezierkurve sein muss, kannst du deinen Algorithmus vielleicht auch zwei mal um einen Punkt versetzt durchlaufen lassen, also ein mal mit $i = 1 und ein mal mit $i = 2 anfangen. Davon speicherst du dir alle p-Werte und zeichnest abschließend in einer weiteren Schleife die Pixel immer beim Mittelwert der beiden Durchläufe.
 
Zurück