#!/usr/bin/perl -w # http://www.hewgill.com/galilean-thermometer/index.html # This program creates a figure for use in the above page. # Requires: # GD.pm - http://stein.cshl.org/WWW/software/GD/GD.html # libgd - http://www.boutell.com/gd/ use GD; $img = new GD::Image(260, 360) or die; $white = $img->colorAllocate(255,255,255); $black = $img->colorAllocate(0,0,0); $blue = $img->colorAllocate(0,0,128); $green = $img->colorAllocate(0,128,0); $orange= $img->colorAllocate(224,128,0); $red = $img->colorAllocate(192,0,0); $img->interlaced('true'); $hatch = new GD::Image(5,5); $hatch->transparent($hatch->colorAllocate(255,255,255)); $hatch->line(0,4,4,0,$hatch->colorAllocate(0,0,0)); $img->setTile($hatch); $vessel = new GD::Polygon; $vessel->addPt(0,0); $vessel->addPt(0,320); $vessel->addPt(100,320); $vessel->addPt(100,0); $vessel->addPt(90,0); $vessel->addPt(90,310); $vessel->addPt(10,310); $vessel->addPt(10,0); $bulb = new GD::Polygon; $bulb->addPt(15,30); $bulb->addPt(30,30); $bulb->addPt(30,0); $bulb->addPt(0,0); $bulb->addPt(0,30); $bulb->addPt(15,30); $bulb->addPt(15,32); $bulb->addPt(25,32); $bulb->addPt(25,43); $bulb->addPt(5,43); $bulb->addPt(5,32); $bulb->addPt(15,32); sub deg { my ($x,$y,$c) = @_; $img->setPixel($x+1,$y,$c); $img->setPixel($x+2,$y,$c); $img->setPixel($x+3,$y+1,$c); $img->setPixel($x+3,$y+2,$c); $img->setPixel($x+2,$y+3,$c); $img->setPixel($x+1,$y+3,$c); $img->setPixel($x,$y+2,$c); $img->setPixel($x,$y+1,$c); } sub bulb { my ($x,$y,$f,$t,$c) = @_; $bulb->offset($x,$y); $img->polygon($bulb,$black); $img->filledRectangle($x+1,$y+$f,$x+29,$y+29,$c); $img->string(gdSmallFont,$x+8,$y+31,$t,$black); deg($x+20,$y+34,$black); $bulb->offset(-$x,-$y); } $vessel->offset(10,30); $img->filledPolygon($vessel,gdTiled); $img->polygon($vessel,$black); $vessel->offset(-10,-30); $img->line(20,40,100,40,$black); $img->string(gdSmallFont,50,10,"76 F",$black); deg(63,13,$black); bulb(45,40,17,"80",$blue); bulb(45,105,16,"76",$green); bulb(45,205,15,"72",$orange); bulb(45,250,14,"68",$red); bulb(45,295,13,"64",$blue); $vessel->offset(150,30); $img->filledPolygon($vessel,gdTiled); $img->polygon($vessel,$black); $vessel->offset(-150,-30); $img->line(160,40,240,40,$black); $img->string(gdSmallFont,190,10,"70 F",$black); deg(203,13,$black); bulb(185,40,17,"80",$blue); bulb(185,85,16,"76",$green); bulb(185,130,15,"72",$orange); bulb(185,250,14,"68",$red); bulb(185,295,13,"64",$blue); $fn = $0; $fn =~ s/pl$/png/; open(F, ">$fn") or die; binmode F; print F $img->png; close(F);