function 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; }