You can just cut that out, you mostly just want the TG2Vec2 record and the methods that go with it, Gen2.inc controls some of the compiler directives which you don't need.
EDIT: I took the time and put all the stuff that you may need here
Code:
TVec2 = record
public
x, y: Single;
class operator Negative(const v: TVec2): TVec2;
class operator Add(const v1, v2: TVec2): TVec2;
class operator Subtract(const v1, v2: TVec2): TVec2;
class operator Multiply(const v: TVec2; const s: Single): TVec2;
procedure SetValue(const _X, _Y: Single);
function Len: Single;
function Dot(const v: TVec2): Single;
function Perp: TVec2;
end;
TCircle = record
public
c: TVec2;
r: Single;
end;
TPie = record
public
c: TVec2;
r: Single;
AngStart: Single;
AngEnd: Single;
end;
...
class operator TVec2.Negative(const v: TVec2): TVec2;
begin
Result.x := -v.x;
Result.y := -v.y;
end;
class operator TVec2.Add(const v1, v2: TVec2): TVec2;
begin
Result.x := v1.x + v2.x;
Result.y := v1.y + v2.y;
end;
class operator TVec2.Subtract(const v1, v2: TVec2): TVec2;
begin
Result.x := v1.x - v2.x;
Result.y := v1.y - v2.y;
end;
class operator TVec2.Multiply(const v: TVec2; const s: Single): TVec2;
begin
Result.x := v.x * s;
Result.y := v.y * s;
end;
procedure TVec2.SetValue(const _X, _Y: Single);
begin
x := _X; y := _Y;
end;
function TVec2.Len: Single;
begin
Result := Sqrt(Sqr(x) + Sqr(y));
end;
function TVec2.Dot(const v: TVec2): Single;
begin
Result := x * v.x + y * v.y;
end;
function TVec2.Perp: TVec2;
begin
Result.SetValue(-y, x);
end;
procedure SinCos(const Angle: Single; var s, c: Single);
asm
fld Angle
fsincos
fstp [edx]
fstp [eax]
fwait
end;
function CircleVsPieIntersect(const c: TCircle; const p: TPie): Boolean;
var v1, v2, n1, n2, n3, a1, a2: TVec2;
var d1, d2, l: Single;
begin
l := (c.c - p.c).Len;
if l > c.r + p.r then
begin
Result := False;
Exit;
end;
SinCos(p.AngStart, v1.y, v1.x);
SinCos(p.AngEnd, v2.y, v2.x);
n3 := -(v1 + v2);
if (n3.Dot(c.c) > n3.Dot(p.c))
and (l > c.r) then
begin
Result := False;
Exit;
end;
n1 := v1.Perp; if n1.Dot(v1 - v2) < 0 then n1 := -n1;
n2 := v2.Perp; if n2.Dot(v2 - v1) < 0 then n2 := -n2;
d1 := n1.Dot(p.c) + c.r;
d2 := n2.Dot(p.c) + c.r;
if (n1.Dot(c.c) > d1)
or (n2.Dot(c.c) > d2) then
begin
Result := False;
Exit;
end;
a1 := p.c + v1 * p.r;
a2 := p.c + v2 * p.r;
if (
(n1.Dot(c.c) > n1.Dot(p.c))
and (v1.Dot(c.c) > v1.Dot(a1))
and ((c.c - a1).Len > c.r)
)
or (
(n2.Dot(c.c) > n2.Dot(p.c))
and (v2.Dot(c.c) > v2.Dot(a2))
and ((c.c - a2).Len > c.r)
) then
begin
Result := False;
Exit;
end;
Result := True;
end;
Bookmarks