Untitled

 avatar
unknown
pascal
3 years ago
11 kB
6
Indexable
{$rangechecks off}
procedure RotatingAdjecent(var Adj:TPointArray;const Curr:TPoint; const Prev:TPoint);
var
  i: Integer;
  dx,dy,x,y:Single;
begin
  x := Prev.x; y := Prev.y;
  adj[7] := Prev;
  for i:=0 to 6 do
  begin
    dx := x - Curr.x;
    dy := y - Curr.y;
    x := ((dy * 0.7070) + (dx * 0.7070)) + Curr.x;
    y := ((dy * 0.7070) - (dx * 0.7070)) + Curr.y;
    adj[i] := Point(Round(x),Round(y));
  end;
end;

function TPABorder(const TPA:TPointArray): TPointArray;
var
  i,j,h,x,y,hit:Integer;
  Matrix: TIntegerMatrix;
  adj: TPointArray;
  start,prev,endpt:TPoint;
  Area: TBox;
  isset:Boolean;
begin
  H := High(TPA);
  Area := GetTPABounds(TPA);
  Area.X2 := (Area.X2 - Area.X1) + 3;  //Width
  Area.Y2 := (Area.Y2 - Area.Y1) + 3;  //Height
  Area.X1 := Area.X1 - 1;
  Area.Y1 := Area.Y1 - 1;

  Matrix.SetSize(Area.X2+1, Area.Y2+1);
  //Matrix := NewMatrix(Area.X2+1, Area.Y2+1);

  start := Point(Area.X2, Area.Y2);
  for i:=0 to H do
    Matrix[(TPA[i].y-Area.Y1)][(TPA[i].x-Area.X1)] := 1;

  //find FIRST starting y coord.
  Isset := False;
  Start := Point(Area.X2, Area.Y2);
  for y:=0 to Area.Y2-1 do begin
    for x:=0 to Area.X2-1 do
      if Matrix[y][x] <> 0 then
      begin
        Start := Point(x,y);
        Isset := True;
        Break;
      end;
    if Isset then Break;
  end;

  H := H*4;
  endpt := Start;
  prev := Point(start.x, start.y-1);
  hit := 0;

  SetLength(adj, 8);
  for i:=0 to H do
  begin
    if ((endpt = start) and (i>1)) then begin
      if hit = 1 then Break;
      Inc(hit);
    end;
    RotatingAdjecent(adj, start, prev);
    for j:=0 to 7 do begin
      x := adj[j].x;
      y := adj[j].y;
      if (x >= 0) and (x < Area.X2) and
         (y >= 0) and (y < Area.Y2) then
        if Matrix[y][x] <= 0 then begin
          if Matrix[y][x] = 0 then
          begin
            Result += Point((adj[j].x+Area.x1), (adj[j].y+Area.y1));
            Dec(Matrix[y][x]);
          end;
        end else if Matrix[y][x] >= 1 then
        begin
          prev := start;
          start := adj[j];
          Break;
        end;
    end;
  end;
end;
{$rangechecks on}

var TPA: TPointArray;
var bmp: TMufasaBitmap;
begin
  SetTargetBitmap(BitmapFromString(572, 547, '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2onkGVG1dcytVW2crmmdA1dY1t1K1dbaieQZUbV1zK1VbZyuaZ0DV1jW3UrV1tqJ5BlRtXXMrVVtnK5pnQNXWNbdStXW2onkGVG1dcytVW2crmmdA1dY1t1K1dbaieQZUbV1zK1VbZyuaZ0DV1jW3UrV1tqJ5BlRtXXMrVVtnK5pnQNXWNbdStXW2onkGVG1dcytVW2crmmdA1dY1t1K1dbaieQZUbV1zK1VbZyuaZ0DV1jW3UrV1tvrK3t7enp6eTqfT4XA4Ho/nPz8/P6+Oilb94H2Za26lauts9WWdPw2Pj4/ffvfw8PDy8vL5+anqj7wvc82tVG2drb6s879fvv3J+TycT4WqP/K+zDW3UrV1tvqyrn0d7u7u3t/fPxY5nU6+WfvQ3ErV1tnqy7r2zbq5uTl/tu4XORwOvln70NxK1dbZ6su69s26vb19fX39vsjxePTN2ofmVqq2zlZfVvPXDs2qn7wvc82tVG2drb6yH78q/1XhV+V+674Pza1UbZ2taGqezGZVU3MrVVtnK5qaJ7NZ1dTcStXW2Yqm5slsVjU1t1K1dbaiqXkym1VNza1UbZ2taGqezGZVU3MrVVtnK5qaJ7NZ1dTcStXW2Yqm5slsVjU1t1K1dbaiqXkym1VNza1UbZ2taGqezGZVU3MrVVtnK5qaJ7NZ1dTcStXW2Yqm5slsVjU1t1K1dbaiqXkym1VNza1UbZ2taGqezGZVU3MrVVtnK5qaJ7NZ1dTcStXW2Yqm5slsVjU1t1K1dbaiqXkym1VNza1UbZ2taGqezGZVU3MrVVtnK5qaJ7NZ1dTcStXW2Yqm5slsVjU1t1K1dbaiqXkym1VNza1UbZ2taGqezGZVU3MrVVtnK5qaJ7NZ1dTcStXW2Yqm5slsVjU1t1K1dbaiqXkym1VNza1UbZ2taGqezGZVU3MrVVtnK5qaJ7NZ1dTcStXW2Yqm5slsVjU1t1K1dbaiqXkym1VNza1UbZ2taGqezGZVU3MrVVtnK5qaJ7NZ1dTcStXW2Yqm5slsVjU1t1K1dbaiqXkym1VNza1UbZ2taGqezGZVU3MrVVtnK5qaJ7NZ1dTcStXW2Yqm5slsVjU1t1K1dbaiqXkym1VNza1UbZ2taGqezGZVU3MrVVtnK5qaJ7NZ1dTcStXW2Yqm5slsVjU1t1K1dbaiqXkym1VNza1UbZ2taGqezGZVU3MrVVtnK5qaJ7NZ1dTcStXW2erveHt7e/rd8/Pz6qh01el0OhwOx+MxUvWD92WuuVWtqnna3Qxf3Hnqx8fHb797eHh4eXn5/PxU1a/6qXbjlTW3SlU1T7sqzn8f+PYn53fn/Aap6lf9lLrx4ppbpaqap10V19a+u7t7f3//WOT8T+wNVUVO5kfpxotrbpWqcjP886rIzbAz107mzc3N+RjcL3I4HDZUdd84mR+lGy+uuVWqys3wz6vuGzfDzlw7mbe3t6+vr98XOR6PG6qKnMzUjRfX3CpV5Wb451WRm2Fnmv/1UNX/QerGi2tulapqnnZV/Kf6K01V/6vUjRfX3KpW5VflW6/at9r78oOquWZVU3OrZlVTc6tm1V4111Y116xqam7VrGpqbtWs2qvm2qrmmlVNza2aVU3NrZpVe9VcW9Vcs6qpuVWzqqm5VbNqr5prq5prVjU1t2pWNTW3albtVXNtVXPNqqbmVs2qpuZWzaq9aq6taq5Z1dTcqlnV1NyqWbVXzbVVzTWrmppbNauamls1q/aqubaquWZVU3OrZlVTc6tm1V4111Y116xqam7VrGpqbtWs2qvm2qrmmlVNza2aVU3NrZpVe9VcW9Vcs6qpuVWzqqm5VbNqr5prq5prVjU1t2pWNTW3albtVXNtVXPNqqbmVs2qpuZWzaq9aq6taq5Z1dTcqlnV1NyqWbVXzbVVzTWrmppbNauamls1q/aqubaquWZVU3OrZlVTc6tm1V4111Y116xqam7VrGpqbtWs2qvm2qrmmlVNza2aVU3NrZpVe9VcW9Vcs6qpuVWzqqm5VbNqr5prq5prVjU1t2pWNTW3albtVXNtVXPNqqbmVs2qpuZWzaq9aq6taq5Z1dTcqlnV1NyqWbVXzbVVzTWrmppbNauamls1q/aqubaquWZVU3OrZlVTc6tm1V4111Y116xqam7VrGpqbtWs2qvm2qrmmlVNza2aVU3NrZpVe9VcW9Vcs6qpuVWzqqm5VbNqr5prq5prVjU1t2pWNTW3albtVXNtVXPNqqbmVs2qpuZWzaq9aq6taq5Z1dTcqlnV1NyqWbVXzbVVzTWrmppbNauamls1q/aqubaquWZVU3OrZlVTc6tm1V4111Y116xqam7VrGpqbtWs2qvm2qrmmlVNza2aVU3NrZpVe9VcW9Vcs6qpuVWzqqm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'));

  FindColorsTolerance(TPA, 0, 0, 0, 572-1, 547-1, 50);

  bmp.init();
  bmp.SetSize(1000,1000);
  bmp.DrawTPA(TPABorder(TPA), 255);

  ShowBitmap(bmp);
end.
Editor is loading...