All pastes #395149 Raw Edit

Untitled

public text v1 · immutable
·published 2007-03-14 20:50 UTC
rendered paste body
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;
}