SCAR Code:
//-----------------------------------------------------------------//
//-- Scar Standard Resource Library --//
//-- ยป Math Routines --//
//-----------------------------------------------------------------//
// * procedure LoadCoSineArrays; // * by Mutant Squirrle
// * function CreateTPAFromText(Txt : String; Chars : Integer) : TPointArray; // * by Raymond
// * function GetSplinePt(Points: TPointArray; Theta: Extended): TPoint; // * by BenLand100
// * function MakeSplinePath(Points: TPointArray; ThetaInc: Extended): TPointArray; // * by BenLand100
// * function MidPoints(Path: TPointArray; MaxDist: Integer): TPointArray; // * by BenLand100
// * function InAbstractBox(x1, y1, x2, y2, x3, y3, x4, y4: Integer; x, y: Integer): Boolean; // * by BenLand100
// * function inAngle(Origin: TPoint; Angle1, Angle2, Radius1, Radius2: Extended; X, Y: Integer): Boolean; // * by BenLand100
// * function Sine(degrees: Integer): Extended; // * by ?
// * function Cose(degrees: Integer): Extended; // * by ?
Var
SineArray, Cosearray: Array[0..360] Of Extended;
{*******************************************************************************
procedure LoadCoSineArrays;
By: Mutant Squirrle
Description: Loads arrays for use with Radial- and LinearWalk.
*******************************************************************************}
procedure LoadCoSineArrays;
var
i: Integer;
begin
for i := 0 to 360 do
begin
Sinearray[i] := Sin(i * Pi / 180);
Cosearray[i] := Cos(i * Pi / 180);
end;
end;
{*******************************************************************************
Function CreateTPAFromText(Txt : String; Chars : Integer) : TPointArray;
By: MastaRaymond
Description: Returns the TPointArray of the inputted Text. Needs Wizzyplugin
*******************************************************************************}
Function CreateTPAFromText(Txt : String; Chars : Integer) : TPointArray;
var
TempBMP : integer;
begin;
TempBMP := CreateBitmapMaskFromText(Txt,Chars);
Result := CreateTPAFromBMP( GetBitmapDC(TempBMP));
FreeBitmap(TempBMP);
end;
{*******************************************************************************
function GetSplinePt(Points: TPointArray; Theta: Extended): TPoint;
By: BenLand100
Description: Returns the point on a spline, defined by control points Points, at Theta
*******************************************************************************}
function GetSplinePt(Points: TPointArray; Theta: Extended): TPoint;
var
i, n: Integer;
XTemp, YTemp: Extended;
begin
n := GetArrayLength(Points) - 1;
for i := 0 to n do
begin
XTemp := XTemp + (BinCoe(n, i) * Points[i].x * Pow((1 - Theta), n - i) *
Pow(Theta, i));
YTemp := YTemp + (BinCoe(n, i) * Points[i].y * Pow((1 - Theta), n - i) *
Pow(Theta, i));
end;
Result.x := Round(XTemp);
Result.y := Round(YTemp);
end;
{*******************************************************************************
function MakeSplinePath(Points: TPointArray; ThetaInc: Extended): TPointArray;
By: BenLand100
Description: Returns a spline, defined by control points Points, incrementing theta by ThetaInc
*******************************************************************************}
function MakeSplinePath(Points: TPointArray; ThetaInc: Extended): TPointArray;
var
i: Integer;
t: Extended;
temp, last: TPoint;
done: Boolean;
begin
repeat
if t >= 1 then
begin
t := 1;
done := True;
end;
temp := GetSplinePt(Points, t);
if ((temp.x <> last.x) and (temp.y <> last.y)) then
begin
i := i + 1;
SetArrayLength(Result, i);
Result[i - 1] := temp;
last := temp;
end;
t := t + ThetaInc;
until (done)
end;
{*******************************************************************************
function MidPoints(Path: TPointArray; MaxDist: Integer): TPointArray;
By: BenLand100
Description: Adds midpoints to Path so no distance on it is greater than MaxDist
*******************************************************************************}
function MidPoints(Path: TPointArray; MaxDist: Integer): TPointArray;
var
i, c: Integer;
last: TPoint;
done: Boolean;
begin
if (getarraylength(path) > 0) then
begin
repeat
last := Path[0];
done := True;
for i := 1 to GetArrayLength(Path) - 1 do
begin
if Sqrt(Pow((Path[i].x - last.x), 2) + Pow((Path[i].y - last.y), 2)) >
MaxDist then
begin
done := False;
SetArrayLength(Path, GetArrayLength(Path) + 1);
for c := GetArrayLength(Path) - 1 downto i + 1 do
begin
Path[c] := Path[c - 1];
end;
Path[i].x := Round((last.x + Path[i + 1].x) / 2);
Path[i].y := Round((last.y + Path[i + 1].y) / 2);
end;
last := Path[i];
end;
until (done);
end;
Result := Path;
end;
{*******************************************************************************
function InAbstractBox(x1, y1, x2, y2, x3, y3, x4, y4: Integer; x, y: Integer): Boolean;
By: BenLand100
Description: Returns true if point x, y is in an abstract box defined by x1, y1, x2, y2, x3, y3, x4, y4
An abstract box example:
x1, y1 x2, y2
+--------+
\ /
\ /
+--+
x4, y4 x3, y3
*******************************************************************************}
function InAbstractBox(x1, y1, x2, y2, x3, y3, x4, y4: Integer; x, y: Integer):
Boolean;
var
U, D, R, L: Boolean;
UB, DB, LB, RB, UM, DM, LM, RM: Extended;
begin
UM := (-y1 - -y2) div (x1 - x2);
DM := (-y4 - -y3) div (x4 - x3);
if x1 - x4 <> 0 then
begin
LM := (-y1 - -y4) div (x1 - x4);
end else
begin
LM := Pi;
end;
if x2 - x3 <> 0 then
begin
RM := (-y2 - -y3) div (x2 - x3);
end else
begin
RM := Pi;
end;
UB := -(UM * x1) + -y1
RB := -(RM * x2) + -y2;
DB := -(DM * x3) + -y3;
LB := -(LM * x4) + -y4;
if (UM * x + UB >= -y) then U := True;
if (DM * x + DB <= -y) then D := True;
if (RM <> Pi) and (RM >= 0) and (RM * x + RB <= -y) then R := True;
if (RM <> Pi) and (RM < 0) and (RM * x + RB >= -y) then R := True;
if (RM = Pi) and (x < x2) then R := True;
if (LM <> Pi) and (LM >= 0) and (LM * x + LB >= -y) then L := True;
if (LM <> Pi) and (LM < 0) and (LM * x + LB <= -y) then L := True;
if (LM = Pi) and (x > x1) then L := True;
if U and D and L and R then Result := True;
end;
{*******************************************************************************
function inAngle(Origin: TPoint; Angle1, Angle2, Radius1, Radius2: Extended; X, Y: Integer): Boolean;
By: BenLand100
Description: Returns True if X and Y fall within Radius1 to Radius2 and Angle1 to Angle2
Note1: EVERYTHING IS RELATIVE TO ORIGIN!!!
Note2: This checks in the smallest segment of the circle formed by Angle1 and Angle 2
Example: (Assume the origin is 0,0)
inAngle(0, 90, 5, 10, origin, 5, 5) = true;
inAngle(0, 90, 0, 5, origin, 5, 5) = false;
inAngle(90, 0, 5, 10, origin, 5, 5) = false;
*******************************************************************************}
function inAngle(Origin: TPoint; Angle1, Angle2, Radius1, Radius2: Extended; x,
y: Integer): Boolean;
var
PTemp: PPoint;
OTemp: TPoint;
MinAngle, MaxAngle, MinRadius, MaxRadius: Extended;
begin
Angle1 := FixD(Angle1);
Angle2 := FixD(Angle2);
MinAngle := Angle1;
if Angle1 > Angle2 then MinAngle := Angle2;
MaxAngle := Angle1;
if Angle1 < Angle2 then MaxAngle := Angle2;
MinRadius := Radius1;
if Radius1 > Radius2 then MinRadius := Radius2;
MaxRadius := Radius1;
if Radius1 < Radius2 then MaxRadius := Radius2;
OTemp.x := x;
OTemp.y := y;
PTemp := ToPolarOffset(OTemp, Origin);
if (PTemp.R >= MinRadius) and (PTemp.R <= MaxRadius) then
if (PTemp.T >= MinAngle) and (PTemp.T <= MaxAngle) then
Result := True;
end;
{*******************************************************************************
function Sine(degrees: Integer): Extended;
By:
Description:
*******************************************************************************}
function Sine(Degrees: Integer): Extended;
begin
Result := sinearray[Trunc(FixD(Degrees))];
end;
{*******************************************************************************
function Cose(degrees: Integer): Extended;
By:
Description:
*******************************************************************************}
function Cose(Degrees: Integer): Extended;
begin
Result := cosearray[Trunc(FixD(Degrees))];
end;