Results 1 to 3 of 3

Thread: The path randomizer for SPS

  1. #1
    Join Date
    May 2012
    Location
    Moscow, Russia
    Posts
    661
    Mentioned
    35 Post(s)
    Quoted
    102 Post(s)

    Default The path randomizer for SPS

    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

    Simba Code:
    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:
    Simba Code:
    const
     test = 10;
    var
     Randomiser: TPathRandomizer;
     i: integer;
     TPA: TPointArray;
     Res: TPointArray;
    begin
     TPA:=[Point(48,387),Point(93,334),Point(163,316),Point(238,313),Point(313,315),Point(370,316),Point(375,319)];
     Randomiser.Init(TPA);
     for i := 0 to test - 1 do
      begin
       Randomiser.GetNextPath(Res);
       writeLn(TPA);
       WriteLn(res);
      end;

    Output:
    Simba Code:
    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.
    Per aspera ad Astra!
    ----------------------------------------
    Slow and steady wins the race.

  2. #2
    Join Date
    Feb 2006
    Location
    Helsinki, Finland
    Posts
    1,395
    Mentioned
    30 Post(s)
    Quoted
    107 Post(s)

    Default

    Quote Originally Posted by CynicRus View Post
    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

    Simba Code:
    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:
    Simba Code:
    const
     test = 10;
    var
     Randomiser: TPathRandomizer;
     i: integer;
     TPA: TPointArray;
     Res: TPointArray;
    begin
     TPA:=[Point(48,387),Point(93,334),Point(163,316),Point(238,313),Point(313,315),Point(370,316),Point(375,319)];
     Randomiser.Init(TPA);
     for i := 0 to test - 1 do
      begin
       Randomiser.GetNextPath(Res);
       writeLn(TPA);
       WriteLn(res);
      end;

    Output:
    Simba Code:
    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++.

  3. #3
    Join Date
    Apr 2015
    Location
    FireFox
    Posts
    528
    Mentioned
    10 Post(s)
    Quoted
    227 Post(s)

    Default

    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;
    Scripting with ogLib

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •