rendered paste bodyfunction TForm1.ReadWindAngle : Integer;
var
wPixel, bRed, bGreen : integer;
fHighest, fLowest, fTotalMedian : single;
fMedian: array[0..5] of double;
fCurAngle, nRadius, z, nX, nY, f, c : integer;
begin
z:=0;
fhighest:=0;
flowest:=0;
fTotalMedian:=0;
fCurAngle:=0;
for nRadius:=21 to PRED(26) do
begin
inc(z);
for fCurAngle:=0 to PRED(360) do
begin
nX := Trunc(241 + (cos(DegToRad(fCurAngle)) * nRadius)); //old interface
nY := Trunc(573 + (sin(DegToRad(fCurAngle)) * nRadius)); //old interface
//nX := Trunc(400 + (cos(DegToRad(fCurAngle)) * nRadius)); //new interface
//nY := Trunc(27 + (sin(DegToRad(fCurAngle)) * nRadius)); //new interface (SinCos is faster)
wPixel := form1.canvas.Pixels[nX, nY];
bRed := (wPixel and $1F);
bGreen := (wPixel shr 5) and $1F;
if (bRed > $17) and (bGreen < $8) then
begin
if (flowest <> 0) then
begin
fHighest := fCurAngle;
fLowest := fCurAngle
end else if ((fCurAngle - fLowest) < 27) then
fHighest := fCurAngle;
end;
end;
fMedian[z] := (fLowest + fHighest) / 2.00;
fHighest := 0;
fLowest := 0;
f:=0;
c:=0;
end;
for f:=0 to 6 do
if fMedian[z] <> 0 then begin
fTotalMedian := fTotalMedian + fMedian[f];
inc(c);
end;
fTotalMedian := fTotalMedian / c;
result := Trunc(fTotalMedian);
end;
========
#define PIXEL(a, b) pBitmap[a + b * 800]
int ReadWindAngle(unsigned short *pBitmap)
{
unsigned short wPixel;
unsigned char bRed, bGreen;
float fHighest = 0;
float fLowest = 0;
float fMedians[6];
float fTotalMedian = 0;
for (int nRadius = 21, int z = 0; nRadius < 27; nRadius++, z++)
{
for (float fCurAngle = 0; fCurAngle < 360; fCurAngle++)
{
int nX = 400 + (cos(fCurAngle * DegToRad) * nRadius);
int nY = 71 + (sin(fCurAngle * DegToRad) * nRadius);
wPixel = PIXEL(nX, nY);
bRed = wPixel & 0x1F;
bGreen = (wPixel >> 5) & 0x1F;
if ((bRed > 0x17) && (bGreen < 0x08))
{
if (!fLowest)
fLowest = fHighest = fCurAngle;
else
if ((fCurAngle - fLowest) < 27)
fHighest = fCurAngle;
}
}
fMedians[z] = (fLowest + fHighest) / 2.00;
fLowest = fHighest = 0;
}
for (int f = 0, int c = 0; f < 6; f++)
if (fMedians[f] != 0)
{
fTotalMedian += fMedians[f];
c++;
}
fTotalMedian /= c;
return (int)fTotalMedian;
}