poniedziałek, 12 listopada 2012

Zabawa z widmami cz2

Pora na udoskonalenie skryptu. Do zdobienia są dwie rzeczy: odwrócenie kolorów oraz uwzględnienie intensywności linii. Odwrócenie kolorów to czystko kosmetyczna operacja mająca na celu umieszczenie niebieskiej i filetowej części widma z prawej strony. Druga sprawa, intensywność, jest bardziej złożona. Jak wiadomo intensywność linii widmowych nie jest taka sama. Trzeba to uwzględnić w trakcie rysowania widma. Procedura okazała się banalna i skrypt ma teraz postać:

//calculations
function adjust($color,$factor,$int_max){
    $intensity_max=$int_max;
    $gamma=0.6;
    if ($color==0) return 0; else
        return round($intensity_max*pow($color*$factor,$gamma));
}
function lambda2RGB($lambda,$int_max){
    if (($lambda>=380)&&($lambda<=439)) {$R=-($lambda-440)/60;$G=0;$B=1.0;} else
    if (($lambda>=440)&&($lambda<=489)) {$R=0;$G=($lambda-440)/50;$B=1.0;} else
    if (($lambda>=490)&&($lambda<=509)) {$R=0;$G=1;$B=-($lambda-510)/20;} else
    if (($lambda>=510)&&($lambda<=579)) {$R=($lambda-510)/70;$G=1;$B=0;} else
    if (($lambda>=580)&&($lambda<=644)) {$R=1;$G=-($lambda-645)/65;$B=0;} else
    if (($lambda>=645)&&($lambda<=780)) {$R=1;$G=0;$B=0;} else {$R=0;$G=0;$B=0;}
    if (($lambda>=380)&&($lambda<=419)) {$intensity=0.3+0.7*($lambda-380)/40;}
    if (($lambda>=420)&&($lambda<=700)) {$intensity=1;}
    if (($lambda>=701)&&($lambda<=780)) {$intensity=0.3+0.7*(780-$lambda)/80;}
    $R=adjust($R,$intensity,$int_max);
    $G=adjust($G,$intensity,$int_max);
    $B=adjust($B,$intensity,$int_max);
    return array ($R,$G,$B);
}
// file type
header("Content-type: image/png");
// create image
$img = imagecreatetruecolor(800, 50);
// draw line
$lines=array(4046.563,4339.223,4347.494,4358.328,5460.735,5769.598,5790.663,7081.90);
$intensity=array(400,60,100,1000,500,50,60,25);
$max=max($intensity);
$min=min($intensity);
$k=0;
foreach($lines as $i){
$relative_intensity=230/($max-$min)*$intensity[$k]+(25-230*$min/($max-$min));
$i=$i/10;
$x=800-2*$i+760;
list($a,$b,$c)=lambda2RGB($i,$relative_intensity);
$color = imagecolorallocate($img, $a, $b, $c);
imageline($img,$x,0,$x,50,$color);
$k++;
}
//display image
imagepng($img);
// release image from memory
imagedestroy($img)
?>

Wynik działania dla helu i neonu:

He I/He II

Ne I/Ne II
W części 3 wykorzystam już bazę danych.

Brak komentarzy:

Prześlij komentarz