2008. június 14., szombat

How to measure the distance between two points


Problem/Question/Abstract:

I need to measure a distance between two points to compute an intensity value. Currently I use

Dx := i - Cur.X;
Dy := j - Cur.Y;
Distance := Round(Sqrt(Dx * Dx + Dy * Dy));

Is there a faster way to compute this? Distance is an integer type so I was hoping to get a reasonably accurate solution as this method seems to produce. Problem is that it slows things down a bit.

Answer:

You can calculate the angle and then make a lookup table for the value to be used to multiply the Y-axis. Try this:


program DCDemo;

{$APPTYPE CONSOLE}

uses
  SysUtils, Math, My_Crt32;

const
  DegToRadFact = Pi / 180;
  RadToDegFact = 180 / Pi;

var
  DistSinArray: array[1..359] of Extended;

function Calcdist(const dX, dY: LongInt): LongInt;
var
  Angle, n: word;
begin
  if (dX <> 0) then
  begin
    if (dY <> 0) then
    begin
      Angle := Round(ArcTan(dY / dX) * RadToDegFact);
      Result := Round(dY / DistSinArray[Angle]);
    end
    else
      Result := dX;
  end
  else
    Result := dY;
end;

var
  dX, dY: LongInt;
begin
  {First time operation}
  for dX := 1 to 359 do
    DistSinArray[dX] := Sin(dX * DegToRadFact);
  Writeln('Geef dX: ');
  readln(dX);
  Writeln('Geef dY: ');
  readln(dY);
  Writeln(FloatToStr(Calcdist(dX, dY)));
  Readln;
end.

Nincsenek megjegyzések:

Megjegyzés küldése