PDA

View Full Version : The path randomizer for SPS



CynicRus
04-11-2015, 07:48 PM
Hi all. I just leave it here:) This will add randomness to the path for the SPS walking:) For best effect, it is necessary to move the point Newpath[i + 1].X by offset. But I'm too lazy:D


const
MIN_DISTANCE = 40;
MAX_DISTANCE = 70;

type
TPathRandomizer = record
FOriginalPath: TPointArray;
FMyBigPath: TPointArray;
FSegmentLen: integer;
end;

function TPathRandomizer.SegmentLength(const Pt1, Pt2: TPoint): integer;
begin
result := trunc(sqrt(sqr(Pt2.X - Pt1.X) + sqr(Pt2.Y - Pt1.Y)));
end;

procedure TPathRandomizer.GetPointsList(x1, y1, x2, y2: integer; N: Longint; var TPA: TPointArray);
var
i: Longint;
R, Rnew, Xnew, Ynew, SinA, CosA: Extended;
begin
SetLength(TPA, N);
R := Sqrt(Sqr(x2 - x1) + Sqr(y2 - y1));
SinA := (y2 - y1) / R;
CosA := (x2 - x1) / R;
TPA[0].X := x1;
TPA[0].Y := y1;
for i := 1 to N - 1 do
begin
Rnew := R * i / (N - 1);
Xnew := x1 + Rnew * CosA;
Ynew := y1 + Rnew * SinA;
TPA[i].X := Trunc(Xnew);
TPA[i].Y := Trunc(Ynew);
end;
end

function DynArrayAppend(var V: TPointArray; const R: TPointArray): Integer;
var
I, LR: Integer;
begin
Result := Length(V);
LR := Length(R);
if LR > 0 then
begin
SetLength(V, Result + LR);
for I := 0 to LR - 1 do
V[Result + I] := R[I];
end;
end;

procedure TPathRandomizer.Init(MyPath: TPointArray);
var
PathLen: integer;
TPA: TPointArray;
i: integer;
begin
SetLength(FMyBigPath, 0);
FSegmentLen := 0;
FOriginalPath := MyPath;
PathLen := Length(FOriginalPath) - 1;
for i := 0 to PathLen - 1 do
begin
FSegmentLen := SegmentLength(FOriginalPath[i], FOriginalPath[i + 1]);
{$IFDEF DBG}
WriteLn(ToStr(FSegmentLen));
{$ENDIF}
GetPointsList(FOriginalPath[i].X, FOriginalPath[i].Y, FOriginalPath[i + 1].X, FOriginalPath[i + 1].Y, FSegmentLen, TPA);
{$IFDEF DBG}
WriteLn(TPA);
{$ENDIF}
DynArrayAppend(FMyBigPath, TPA);
SetLength(TPA, 0);
end;
end;

procedure TPathRandomizer.GetNextPath(var NewPath: TPointArray);
var
i, NewPathLen,NewLen: integer;
NewPathBase: T2dPointArray;
begin
NewPathLen := Round(Length(FMyBigPath) / RandomRange(MIN_DISTANCE, MAX_DISTANCE));
NewPathBase := TPAtoATPA(FMyBigPath, Round(Length(FMyBigPath) / NewPathLen));
SetLength(NewPath, NewPathLen + 1);
NewPath[0] := FMyBigPath[0];
for i := 0 to NewPathLen - 1 do
begin
NewLen := Length(NewPathBase[i]);
Newpath[i + 1].X := NewPathBase[i][NewLen - 1].x;
NewPath[i + 1].Y := NewPathBase[i][NewLen - 1].y;
end;
end;


testing:

const
test = 10;
var
Randomiser: TPathRandomizer;
i: integer;
TPA: TPointArray;
Res: TPointArray;
begin
TPA:=[Point(48,387),Point(93,334),Point(163,316),Point(2 38,313),Point(313,315),Point(370,316),Point(375,31 9)];
Randomiser.Init(TPA);
for i := 0 to test - 1 do
begin
Randomiser.GetNextPath(Res);
writeLn(TPA);
WriteLn(res);
end;


Output:

Compiled successfully in 312 ms.
[{X = 48, Y = 387}, {X = 93, Y = 334}, {X = 163, Y = 316}, {X = 238, Y = 313}, {X = 313, Y = 315}, {X = 370, Y = 316}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 94, Y = 333}, {X = 164, Y = 315}, {X = 236, Y = 313}, {X = 309, Y = 314}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 93, Y = 334}, {X = 163, Y = 316}, {X = 238, Y = 313}, {X = 313, Y = 315}, {X = 370, Y = 316}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 85, Y = 342}, {X = 142, Y = 321}, {X = 202, Y = 314}, {X = 262, Y = 313}, {X = 322, Y = 315}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 93, Y = 334}, {X = 163, Y = 316}, {X = 238, Y = 313}, {X = 313, Y = 315}, {X = 370, Y = 316}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 73, Y = 357}, {X = 103, Y = 331}, {X = 142, Y = 321}, {X = 182, Y = 315}, {X = 222, Y = 313}, {X = 262, Y = 313}, {X = 302, Y = 314}, {X = 342, Y = 315}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 93, Y = 334}, {X = 163, Y = 316}, {X = 238, Y = 313}, {X = 313, Y = 315}, {X = 370, Y = 316}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 80, Y = 348}, {X = 125, Y = 325}, {X = 175, Y = 315}, {X = 226, Y = 313}, {X = 277, Y = 314}, {X = 328, Y = 315}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 93, Y = 334}, {X = 163, Y = 316}, {X = 238, Y = 313}, {X = 313, Y = 315}, {X = 370, Y = 316}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 85, Y = 342}, {X = 142, Y = 321}, {X = 202, Y = 314}, {X = 262, Y = 313}, {X = 322, Y = 315}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 93, Y = 334}, {X = 163, Y = 316}, {X = 238, Y = 313}, {X = 313, Y = 315}, {X = 370, Y = 316}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 76, Y = 353}, {X = 114, Y = 328}, {X = 158, Y = 317}, {X = 203, Y = 314}, {X = 248, Y = 313}, {X = 293, Y = 314}, {X = 338, Y = 315}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 93, Y = 334}, {X = 163, Y = 316}, {X = 238, Y = 313}, {X = 313, Y = 315}, {X = 370, Y = 316}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 85, Y = 342}, {X = 142, Y = 321}, {X = 202, Y = 314}, {X = 262, Y = 313}, {X = 322, Y = 315}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 93, Y = 334}, {X = 163, Y = 316}, {X = 238, Y = 313}, {X = 313, Y = 315}, {X = 370, Y = 316}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 80, Y = 348}, {X = 125, Y = 325}, {X = 175, Y = 315}, {X = 226, Y = 313}, {X = 277, Y = 314}, {X = 328, Y = 315}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 93, Y = 334}, {X = 163, Y = 316}, {X = 238, Y = 313}, {X = 313, Y = 315}, {X = 370, Y = 316}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 94, Y = 333}, {X = 164, Y = 315}, {X = 236, Y = 313}, {X = 309, Y = 314}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 93, Y = 334}, {X = 163, Y = 316}, {X = 238, Y = 313}, {X = 313, Y = 315}, {X = 370, Y = 316}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 76, Y = 353}, {X = 114, Y = 328}, {X = 158, Y = 317}, {X = 203, Y = 314}, {X = 248, Y = 313}, {X = 293, Y = 314}, {X = 338, Y = 315}, {X = 375, Y = 319}]
Successfully executed.

Janilabo
04-11-2015, 08:15 PM
Hi all. I just leave it here:) This will add randomness to the path for the SPS walking:) For best effect, it is necessary to move the point Newpath[i + 1].X by offset. But I'm too lazy:D


const
MIN_DISTANCE = 40;
MAX_DISTANCE = 70;

type
TPathRandomizer = record
FOriginalPath: TPointArray;
FMyBigPath: TPointArray;
FSegmentLen: integer;
end;

function TPathRandomizer.SegmentLength(const Pt1, Pt2: TPoint): integer;
begin
result := trunc(sqrt(sqr(Pt2.X - Pt1.X) + sqr(Pt2.Y - Pt1.Y)));
end;

procedure TPathRandomizer.GetPointsList(x1, y1, x2, y2: integer; N: Longint; var TPA: TPointArray);
var
i: Longint;
R, Rnew, Xnew, Ynew, SinA, CosA: Extended;
begin
SetLength(TPA, N);
R := Sqrt(Sqr(x2 - x1) + Sqr(y2 - y1));
SinA := (y2 - y1) / R;
CosA := (x2 - x1) / R;
TPA[0].X := x1;
TPA[0].Y := y1;
for i := 1 to N - 1 do
begin
Rnew := R * i / (N - 1);
Xnew := x1 + Rnew * CosA;
Ynew := y1 + Rnew * SinA;
TPA[i].X := Trunc(Xnew);
TPA[i].Y := Trunc(Ynew);
end;
end

function DynArrayAppend(var V: TPointArray; const R: TPointArray): Integer;
var
I, LR: Integer;
begin
Result := Length(V);
LR := Length(R);
if LR > 0 then
begin
SetLength(V, Result + LR);
for I := 0 to LR - 1 do
V[Result + I] := R[I];
end;
end;

procedure TPathRandomizer.Init(MyPath: TPointArray);
var
PathLen: integer;
TPA: TPointArray;
i: integer;
begin
SetLength(FMyBigPath, 0);
FSegmentLen := 0;
FOriginalPath := MyPath;
PathLen := Length(FOriginalPath) - 1;
for i := 0 to PathLen - 1 do
begin
FSegmentLen := SegmentLength(FOriginalPath[i], FOriginalPath[i + 1]);
{$IFDEF DBG}
WriteLn(ToStr(FSegmentLen));
{$ENDIF}
GetPointsList(FOriginalPath[i].X, FOriginalPath[i].Y, FOriginalPath[i + 1].X, FOriginalPath[i + 1].Y, FSegmentLen, TPA);
{$IFDEF DBG}
WriteLn(TPA);
{$ENDIF}
DynArrayAppend(FMyBigPath, TPA);
SetLength(TPA, 0);
end;
end;

procedure TPathRandomizer.GetNextPath(var NewPath: TPointArray);
var
i, NewPathLen,NewLen: integer;
NewPathBase: T2dPointArray;
begin
NewPathLen := Round(Length(FMyBigPath) / RandomRange(MIN_DISTANCE, MAX_DISTANCE));
NewPathBase := TPAtoATPA(FMyBigPath, Round(Length(FMyBigPath) / NewPathLen));
SetLength(NewPath, NewPathLen + 1);
NewPath[0] := FMyBigPath[0];
for i := 0 to NewPathLen - 1 do
begin
NewLen := Length(NewPathBase[i]);
Newpath[i + 1].X := NewPathBase[i][NewLen - 1].x;
NewPath[i + 1].Y := NewPathBase[i][NewLen - 1].y;
end;
end;


testing:

const
test = 10;
var
Randomiser: TPathRandomizer;
i: integer;
TPA: TPointArray;
Res: TPointArray;
begin
TPA:=[Point(48,387),Point(93,334),Point(163,316),Point(2 38,313),Point(313,315),Point(370,316),Point(375,31 9)];
Randomiser.Init(TPA);
for i := 0 to test - 1 do
begin
Randomiser.GetNextPath(Res);
writeLn(TPA);
WriteLn(res);
end;


Output:

Compiled successfully in 312 ms.
[{X = 48, Y = 387}, {X = 93, Y = 334}, {X = 163, Y = 316}, {X = 238, Y = 313}, {X = 313, Y = 315}, {X = 370, Y = 316}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 94, Y = 333}, {X = 164, Y = 315}, {X = 236, Y = 313}, {X = 309, Y = 314}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 93, Y = 334}, {X = 163, Y = 316}, {X = 238, Y = 313}, {X = 313, Y = 315}, {X = 370, Y = 316}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 85, Y = 342}, {X = 142, Y = 321}, {X = 202, Y = 314}, {X = 262, Y = 313}, {X = 322, Y = 315}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 93, Y = 334}, {X = 163, Y = 316}, {X = 238, Y = 313}, {X = 313, Y = 315}, {X = 370, Y = 316}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 73, Y = 357}, {X = 103, Y = 331}, {X = 142, Y = 321}, {X = 182, Y = 315}, {X = 222, Y = 313}, {X = 262, Y = 313}, {X = 302, Y = 314}, {X = 342, Y = 315}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 93, Y = 334}, {X = 163, Y = 316}, {X = 238, Y = 313}, {X = 313, Y = 315}, {X = 370, Y = 316}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 80, Y = 348}, {X = 125, Y = 325}, {X = 175, Y = 315}, {X = 226, Y = 313}, {X = 277, Y = 314}, {X = 328, Y = 315}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 93, Y = 334}, {X = 163, Y = 316}, {X = 238, Y = 313}, {X = 313, Y = 315}, {X = 370, Y = 316}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 85, Y = 342}, {X = 142, Y = 321}, {X = 202, Y = 314}, {X = 262, Y = 313}, {X = 322, Y = 315}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 93, Y = 334}, {X = 163, Y = 316}, {X = 238, Y = 313}, {X = 313, Y = 315}, {X = 370, Y = 316}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 76, Y = 353}, {X = 114, Y = 328}, {X = 158, Y = 317}, {X = 203, Y = 314}, {X = 248, Y = 313}, {X = 293, Y = 314}, {X = 338, Y = 315}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 93, Y = 334}, {X = 163, Y = 316}, {X = 238, Y = 313}, {X = 313, Y = 315}, {X = 370, Y = 316}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 85, Y = 342}, {X = 142, Y = 321}, {X = 202, Y = 314}, {X = 262, Y = 313}, {X = 322, Y = 315}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 93, Y = 334}, {X = 163, Y = 316}, {X = 238, Y = 313}, {X = 313, Y = 315}, {X = 370, Y = 316}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 80, Y = 348}, {X = 125, Y = 325}, {X = 175, Y = 315}, {X = 226, Y = 313}, {X = 277, Y = 314}, {X = 328, Y = 315}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 93, Y = 334}, {X = 163, Y = 316}, {X = 238, Y = 313}, {X = 313, Y = 315}, {X = 370, Y = 316}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 94, Y = 333}, {X = 164, Y = 315}, {X = 236, Y = 313}, {X = 309, Y = 314}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 93, Y = 334}, {X = 163, Y = 316}, {X = 238, Y = 313}, {X = 313, Y = 315}, {X = 370, Y = 316}, {X = 375, Y = 319}]
[{X = 48, Y = 387}, {X = 76, Y = 353}, {X = 114, Y = 328}, {X = 158, Y = 317}, {X = 203, Y = 314}, {X = 248, Y = 313}, {X = 293, Y = 314}, {X = 338, Y = 315}, {X = 375, Y = 319}]
Successfully executed.
Hay... That is some cool stuff, CynicRus!

Time to spread some reputation++. :)

srlMW
07-31-2015, 09:48 PM
From using SPS in my scripts it seems as though it has randomness already... is this more of an extra or am I mistaken? :) CynicRus;