niedziela, 18 listopada 2012

Zabawa z widmami cz3


W wolnych chwilach bawię się nadal skryptem do widm. Nieco go zmodyfikowałem. Zwiększyłem rozmiar rysunku oraz popiołem bazę danych NIST. Wygląda to nieźle :) Pozostaje do zrobienia formularz do generowania zapytań do baz danych i myślę, że będzie gotowe. BTW, dawno nie zajmowałem się PHP i wykorzystanie biblioteki PDO znakomicie ułatwia podpięcie bazy do skryptu. Wygenerowałem też taki oto rysunek.

Widma gazów szlachetnych oraz dwóch metali.
Sam skrypt ma postać:

function adjust($color,$factor,$max){
    $intensity_max=$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);
}
header("Content-type: image/png");
$width=1000; $height=80;
$img = imagecreatetruecolor($width, $height);
 try
   {
      $pdo = new PDO('mysql:host=localhost;dbname=spectra', 'root', '');
      $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      $query = $pdo -> query('SELECT Truncate((linia/10),0) as linia,intensity from nist where (linia<=7800) and (linia>=3800) and (symbol="Na") and (ion=1) order by linia;');
      foreach($query as $row){$lines[]=$row['linia'];$lintensity[]=$row['intensity'];}
      $query -> closeCursor();
   }
   catch(PDOException $e)
   {
      echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
   }
$max=max($lintensity);
$min=min($lintensity);
$k=0;
foreach($lines as $i){
$relative_intensity=230/($max-$min)*$lintensity[$k]+(25-230*$min/($max-$min));
$x=(-$width/400)*$i+(780/400)*$width;
list($a,$b,$c)=lambda2RGB($i,$relative_intensity);
$color = imagecolorallocate($img, $a, $b, $c);
imageline($img,$x,0,$x,$height,$color);
$k++;
}
imagepng($img);
imagedestroy($img)
?>

Brak komentarzy:

Prześlij komentarz