All pastes #395077 Raw Edit

Mine

public text v1 · immutable
·published 2007-03-14 19:49 UTC
rendered paste body
function TForm1.ReadWindAngle : Integer;
var
  wPixel : word;
  bRed, bGreen : byte;
  fHighest, fLowest, fTotalMedian : single;
  fMedian: array[1..6] 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(27) 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 (use SinCos)
      Memo1.Text := IntToHex(wPixel,2);
      wPixel := form1.canvas.Pixels[nX, nY];
      bRed := (wPixel and $FF);
      bGreen := (wPixel shr 8) and $FF;
      Edit1.Text := IntToHex(bRed,2);
      Edit2.Text := IntToHex(bGreen,2);
       if (bRed > $17) and (bGreen < $8) then
      begin
    if fLowest <> 1 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;
  wa := FloatToStr(fTotalMedian);
end;

=================

// quick macro to convert X, Y location into a 1D array location. Top `left` pixel = 0, 0 
#define PIXEL(a, b) pBitmap[a + b * 800]

int Aimbot_ReadWindAngle(unsigned short *pBitmap)
{
	unsigned short wPixel;		// storage for a pixel
	unsigned char bRed, bGreen;	// red / green components of a pixel

	float fHighest = 0;			// highest recorded possibility of wind angle
	float fLowest = 0;			// lowest recorded possibility of wind angle
	float fMedians[6];			// median of each of the 6 readings
	float fTotalMedian = 0;		// median of all 6 readings

	// read which pixels are in between the specified colour range, going around the
	// circle with 6 different radii and calculating an average angle for each radius,
	// finally averaging all 6.

	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);	// can be sped up by creating a lookup table
			int nY = 71 + (sin(fCurAngle * DegToRad) * nRadius);	// ""					"" 
			
			wPixel = PIXEL(nX, nY);	// get a pixel from the wind meter
			
			// calculate the red and green components, lowest 5 bits = red, middle 5 bits = green
			bRed = wPixel & 0x1F;			// 0x1F = %11111
			bGreen = (wPixel >> 5) & 0x1F;	// shr the wPixel by 5 bits to make the green in the position of the old red

			if ((bRed > 0x17) && (bGreen < 0x08))	// check if the pixel is in the desired colour range
			{
				if (!fLowest)	// if we have not yet had a match then fLowest won't be set yet
					fLowest = fHighest = fCurAngle;		// so set fLowest, and in case we don't find another, set fHighest too.
				else			// already found a pixel at a lower angle than this
					if ((fCurAngle - fLowest) < 27)		// if this pixel is less than 27 angles away from the lowest, record it
						fHighest = fCurAngle;			// as the new highest (the wind meter angle is around 25 angles circum at base)
			}
		}

		fMedians[z] = (fLowest + fHighest) / 2.00;		// calculate the median red pixel
		fLowest = fHighest = 0;							// reset the counters
	}

	for (int f = 0, int c = 0; f < 6; f++)				// cycle through and count how many readings were not 0
		if (fMedians[f] != 0)							// if median is not 0
		{
			fTotalMedian += fMedians[f];				// add to total
			c++;										// increase count of added medians
		}

	fTotalMedian /= c;									// divide total sum by number of counted medians

	return (int)fTotalMedian;
}