Advertisement
mixster

mixster

Jul 30th, 2009
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 2.02 KB | None | 0 0
  1. function DBSCAN(p: TPointArray; d, minPts: Integer): T2DPointArray;
  2. var
  3.   v, nC: array of Boolean;
  4.   n, n2: TIntegerArray;
  5.   i, dL, r, ii, nL, rL, iii, nL2: Integer;
  6. begin
  7.   dL := Length(p);
  8.   SetLength(v, dL);
  9.   SetLength(nC, dL);
  10.   SetLength(Result, dL);
  11.   r := 0;
  12.   dL := dL - 1;
  13.   for i := 0 to dL do
  14.   begin
  15.     v[i] := False;
  16.     nC[i] := True;
  17.   end;
  18.   for i := 0 to dL do
  19.   begin
  20.     if (not (v[i])) then
  21.     begin
  22.       v[i] := True;
  23.       SetLength(n, dL);
  24.       nL := 0;
  25.       for ii := 0 to dL do
  26.       begin
  27.         if (ii <> i) then
  28.           if(not (v[ii])) then
  29.             if (Distance(p[i].x, p[i].y, p[ii].x, p[ii].y) <= d) then
  30.             begin
  31.               n[nL] := ii;
  32.               nL := nL + 1;
  33.             end;
  34.       end;
  35.       SetLength(n, nL);
  36.       if (nL >= minPts) then
  37.       begin
  38.         SetLength(Result[r], dL + 1);
  39.         Result[r][0] := p[i];
  40.         rL := 1;
  41.         for ii := 0 to nL - 1 do
  42.         begin
  43.           if (not (v[n[ii]])) then
  44.           begin
  45.             v[n[ii]] := True;
  46.             nL2 := 0;
  47.             SetLength(n2, dL);
  48.             for iii := 0 to dL do
  49.               if (n[ii] <> iii) then
  50.                 if(not (v[iii])) then
  51.                   if (nC[n[ii]]) then
  52.                     if (Distance(p[n[ii]].x, p[n[ii]].y, p[iii].x, p[iii].y) <= d) then
  53.                     begin
  54.                       n2[nL2] := iii;
  55.                       nL2 := nL2 + 1;
  56.                     end;
  57.             SetLength(n2, nL2);
  58.             if (nL2 >= minPts) then
  59.             begin
  60.               SetLength(n, nL + nL2);
  61.               for iii := nL to nL + nL2 - 1 do
  62.                 n[iii] := n2[iii - nL];
  63.               nL := nL + nL2;
  64.             end;
  65.           end;
  66.           if (nC[n[ii]]) then
  67.           begin
  68.             nC[n[ii]] := False;
  69.             Result[r][rL] := p[n[ii]];
  70.             rL := rL + 1;
  71.           end;
  72.         end;
  73.         SetLength(Result[r], rL);
  74.         r := r + 1;
  75.       end;
  76.     end;
  77.   end;
  78.   SetLength(Result, r);
  79. end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement