piątek, 30 listopada 2012

Króliczka Julka.

Wczoraj trafił do mnie na przechowanie kolejny królik. Jest to młodziutka króliczka Julka. Została ona ocalona od pożarcia prawdopodobnie przez jakiegoś gada. Jest jeszcze nieco wystraszona ale zaczyna już buszować po pokoju. Prawdopodobnie będzie ze mną przez najbliższe 2 tygodnie.
Odpoczynek

Julka zwiedza pokój :)


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)
?>

wtorek, 13 listopada 2012

Solar Eclipse 14 Nov 2012 Australia

Dzisiaj nad ranem czasu australijskiego miało miejsce całkowite zaćmienie Słońca. Jedno z najbardziej spektakularnych i rzadkich zjawisk jakie można obserwować. Dzięki firmie Panasonic możliwe było oglądanie tego wspaniałego zjawiska na żywo przez internet. Przypomina to nieco lizanie cukierka przez szybę ale to zawsze coś. Warunki pogodowe w Australii nie były rewelacyjne. Zaćmienie miało miejsce dość nisko nad horyzontem i chmury znad Morza Koralowego groziły, że nie będzie możliwe zaobserwowanie tego zjawiska. Na szczęście tuż przed całkowitą fazą nieco się przetarło. Pozwoliłem sobie nagrać clip z tego wydarzenia.

Mój kolega Łukasz ( http://intotheshadowofthemoon.wordpress.com/) oglądał to zjawisko na żywo. Niestety pogoda mu nie dopisała. Szkoda. Łukasz, na następne pojedziemy razem :) No właśnie, na następne ciekawe zaćmienie wybieram na na 100% będzie ono za niecałe 5 lat w USA.  Jeżeli chodzi o inne zaćmienia to następne ciekawe będzie dopiero 20 marca 2015 r. Jednak będzie ono widoczne z bardzo dziwnych miejsc i w zasadzie nie ma po co tam jechać. W Polsce tego dnia doświadczymy zaćmienia częściowego.



PS: Dostępna jest też wersja HD:


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.

niedziela, 11 listopada 2012

Śmieszne królicze zdarzenie.

Dzisiaj zdarzyła się śmieszna sytuacja z Uszami. Pracuję sobie na komputerze analizując i planując wypad do czarnobylskiej zony i kątem oka dostrzegam, że Uszy weszły do gabinetu. Nie zdziwiło mnie to zbytnio bo robi to często. Po dłuższym czasie słyszę, że Uszy coś zapamiętale gryzą. Rany - jakąś moją literaturę! Rozglądam się po pokoju. Szukam. Uszu nie ma! Choroba gdzie on jest, cały czas słyszę chrupanie papieru. Przypadkowo spoglądam na dolną półkę regału i ...


Mam cię zbóju. Ale cwaniak. Inteligent jeden. Jak ty żeś tam wlazł? A tu zbój po dokonaniu dzieła zniszczeń.









środa, 7 listopada 2012

Zabawa z widmami cz1

Coś mnie naszło na odświeżenie wiedzy z fizyki oraz programowania w PHP. Tylko jak to połączyć? Mam! W bardzo starych zasobach odkopałem bazę danych linii widmowych wszystkich (no prawie) pierwiastków. Baza jest w MySQL czyli jak do PHP to jak znalazł. Wstępnie postanowiłem jej nie wykorzystywać tylko wpisać wybrane linie w samym skrypcie PHP. Okazało się, że jest pewien problem. Otóż w bazie danych podana jest długość fali danych linii w nm. Jak to przeliczyć na RGB? Okazuje się, że dokładne odwzorowanie kolorów z długości fali na przestrzeń RGB nie jest możliwe w 100%. Wynika to oczywiście z zakresu przestrzeni barwnej. Ale nic. Gwardia umiera ale się nie poddaje. Udało mi się znaleźć przybliżony algorytm konwertujący długość fali na RGB.
Jest o bardzo prosty i składa się z dwóch funkcji (listing w PHP):

{
    $intensity_max=255;
    $gamma=0.8;
    if ($color==0) return 0; else
        return round($intensity_max*pow($color*$factor,$gamma));
}
function lambda2RGB($lambda){
    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);
    $G=adjust($G,$intensity);
    $B=adjust($B,$intensity);
    return array ($R,$G,$B);
}


Dalej to już z górki.  Skrypt generujący widmo ciągłe światła białego.

//calculations
function adjust($color,$factor){
    $intensity_max=255;
    $gamma=0.8;
    if ($color==0) return 0; else
        return round($intensity_max*pow($color*$factor,$gamma));
}
function lambda2RGB($lambda){
    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);
    $G=adjust($G,$intensity);
    $B=adjust($B,$intensity);
    return array ($R,$G,$B);
}
// file type
header("Content-type: image/png");
// create image
$img = imagecreatetruecolor(800, 50);
// set colors
// draw line
for($i=380;$i<=780;$i++){
$x=2*$i-760;
list($a,$b,$c)=lambda2RGB($i);
$color = imagecolorallocate($img, $a, $b, $c);
imageline($img,$x,0,$x,50,$color);
imageline($img,$x+1,0,$x+1,50,$color);
}
// display image
imagepng($img);
// release image from memory
imagedestroy($img)
?>


Wynik działania:


Działa! Czas przetestować na liniach widmowych. Na warsztat idzie wodór (seria Blamera) i rtęć. Drobna modyfikacja skryptu (dla np. Hg):
// draw line
$lines=array(3983.931,4046.563,    4339.223,4347.494,4358.328,5128.442,5204.768,5425.253,5460.735,5677.105,5769.598,790.663,5871.279,5888.939,    6146.435,6149.475,7081.90,7346.508);
foreach($lines as $i){
$i=$i/10;
$x=2*$i-760;
list($a,$b,$c)=lambda2RGB($i);
$color = imagecolorallocate($img, $a, $b, $c);
//imageline($img,$x,0,$x,50,$color);
imageline($img,$x+1,0,$x+1,50,$color);
}

I wyniki są bardzo obiecujące.

Wodór (seria Blamera)

Rtęć Hg I i Hg II
Na początek zostaje uwzględnienie intensywności linii ale o tym w części 2.