unit MainFrm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TMainForm = class(TForm)
CalculateButton: TButton;
Memo: TMemo;
procedure CalculateButtonClick(Sender: TObject);
private
function FindScale(bitmap: TBitmap): Integer;
procedure Calculate(year: Integer);
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
function TMainForm.FindScale(bitmap: TBitmap): Integer;
var
y: Integer;
begin
Result := 0;
for y := 1 to bitmap.Height - 1 do
begin
Inc(Result);
if bitmap.Canvas.Pixels[1, y] = clBlack then
Break;
end;
end;
procedure TMainForm.Calculate(year: Integer);
const
absolut = 273.15;
clRed = 255;
clGreen = 49152;
var
fileName: String;
bitmap: TBitmap;
red, green: Integer;
redMin, redMax: Integer;
greenMin, greenMax: Integer;
x, y: Integer;
count: Integer;
scale: Integer;
a, b: Single;
begin
fileName := Format('D:\%d.bmp', [year]);
if not FileExists(fileName) then
Exit;
bitmap := TBitmap.Create;
try
bitmap.LoadFromFile(fileName);
scale := FindScale(bitmap);
red := 0;
green := 0;
count := 0;
for x := 0 to bitmap.Width - 1 do
begin
redMin := 0;
redMax := 0;
greenMin := 0;
greenMax := 0;
for y := 0 to bitmap.Height - 1 do
case bitmap.Canvas.Pixels[x, y] of
clRed:
begin
if redMin = 0 then
redMin := y;
redMax := y;
end;
clGreen:
begin
if greenMin = 0 then
greenMin := y;
greenMax := y;
end;
end;
if (redMin > 0) and (greenMin > 0) then
begin
red := red + (redMin + redMax) div 2;
green := green + (greenMin + greenMax) div 2;
Inc(count);
end;
end;
a := 280 - 5*red/count/scale - absolut;
b := 280 - 5*green/count/scale - absolut;
Memo.Lines.Add(Format('%d: +%f C (%.1f C, %.1f C, %d)', [year, a - b, a, b, scale]));
finally
bitmap.Free;
end;
end;
procedure TMainForm.CalculateButtonClick(Sender: TObject);
var
i: Integer;
begin
Memo.Lines.Clear;
for i := 1958 to 2012 do
Calculate(i);
end;
end.