-- FreeGeometry.pas --
function DistanceToLine(...): TFloatType;
begin
...
Result := 1e10;
...
end;
...
var
Dist: Integer
...
Dist := Round(DistanceToLine(...); // Overflow error (1e10 large then integer)
----
Patch:
-- FreeGeometry.pas --
function DistanceToLine(P1, P2:TPoint; X, Y: Integer; var Parameter: TFloatType): Integer;
const
VeryVeryLargeDistance = 1000000;
var
Pt: T2DCoordinate;
begin
if (P1.X<0) and (P2.X<0) then
Result := VeryVeryLargeDistance
else
if (P1.X>Screen.Width) and (P2.X>Screen.width) then
Result := VeryVeryLargeDistance
else
if (P1.Y<0) and (P2.Y<0) then
Result := VeryVeryLargeDistance
else
if (P1.Y>Screen.Height) and (P2.Y>Screen.Height) then
Result := VeryVeryLargeDistance
else
if (P2.X=P1.X) and (P1.Y=P2.Y) then
Result := Round(Sqrt(Sqr(P1.X-X)+Sqr(P1.Y-Y)))
else
begin
Parameter:=((X-P1.X)*(P2.X-P1.X)+(Y-P1.Y)*(P2.Y-P1.Y))/(sqr(P2.X-P1.X)+Sqr(P2.Y-P1.Y));
if (Parameter>=0) and (Parameter<=1) then
begin
Pt.X:=P1.X+Parameter*(P2.X-P1.X);
Pt.Y:=P1.Y+Parameter*(P2.Y-P1.Y);
if (Pt.X>=0) and (Pt.Y>=0) and (Pt.X<=Screen.Width) and (Pt.Y<=Screen.Height) then
Result := Round(Sqrt(Sqr(Pt.X-X)+Sqr(Pt.Y-Y)))
else
Result := VeryVeryLargeDistance;
end
else
Result := VeryVeryLargeDistance;
end;
end;{DistanceToLine}
-- FreeGeometry.pas --
function DistanceToLine(...): TFloatType;
begin
...
Result := 1e10;
...
end;
...
var
Dist: Integer
...
Dist := Round(DistanceToLine(...); // Overflow error (1e10 large then integer)
----
Patch:
-- FreeGeometry.pas --
function DistanceToLine(P1, P2:TPoint; X, Y: Integer; var Parameter: TFloatType): Integer;
const
VeryVeryLargeDistance = 1000000;
var
Pt: T2DCoordinate;
begin
if (P1.X<0) and (P2.X<0) then
Result := VeryVeryLargeDistance
else
if (P1.X>Screen.Width) and (P2.X>Screen.width) then
Result := VeryVeryLargeDistance
else
if (P1.Y<0) and (P2.Y<0) then
Result := VeryVeryLargeDistance
else
if (P1.Y>Screen.Height) and (P2.Y>Screen.Height) then
Result := VeryVeryLargeDistance
else
if (P2.X=P1.X) and (P1.Y=P2.Y) then
Result := Round(Sqrt(Sqr(P1.X-X)+Sqr(P1.Y-Y)))
else
begin
Parameter:=((X-P1.X)*(P2.X-P1.X)+(Y-P1.Y)*(P2.Y-P1.Y))/(sqr(P2.X-P1.X)+Sqr(P2.Y-P1.Y));
if (Parameter>=0) and (Parameter<=1) then
begin
Pt.X:=P1.X+Parameter*(P2.X-P1.X);
Pt.Y:=P1.Y+Parameter*(P2.Y-P1.Y);
if (Pt.X>=0) and (Pt.Y>=0) and (Pt.X<=Screen.Width) and (Pt.Y<=Screen.Height) then
Result := Round(Sqrt(Sqr(Pt.X-X)+Sqr(Pt.Y-Y)))
else
Result := VeryVeryLargeDistance;
end
else
Result := VeryVeryLargeDistance;
end;
end;{DistanceToLine}
... := DistanceToLine(...); // was: ... := Round(DistanceToLine(...);
...
-- --
-- FreeShipUnit.pas --
...
... := FreeGeometry.DistanceToLine(...); // was: ... := Round(DistanceToLine(...);
...
----
Comments/ideas?