Advertisement
Guest User

Untitled

a guest
May 27th, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 1.79 KB | None | 0 0
  1. function VectorLength(x, y: Extended): Extended;
  2. begin
  3.   VectorLength := sqrt(x*x + y*y);
  4. end;
  5.  
  6. function AdjustBounds(x: Extended): Extended;
  7. begin
  8.   if x < 0 then
  9.     AdjustBounds := 0.0
  10.   else if x > 1 then
  11.     AdjustBounds := 1.0
  12.   else
  13.     AdjustBounds := x;
  14. end;
  15.  
  16. procedure TForm1.AdvanceForces(Sender: TObject);
  17. function Signum(x: Extended): Extended;
  18. begin
  19.   if x > 0 then Signum := 1
  20.   else if x = 0 then Signum := 0
  21.   else Signum := -1;
  22. end;
  23. procedure Repulsion(v1, v2: TVertex; var fx, fy, k: Extended);
  24. var dx, dy, d, f: Extended;
  25. begin
  26.   dx := v2.PosX - v1.PosX;
  27.   dy := v2.PosY - v1.PosY;
  28.   d := VectorLength(dx, dy);
  29.   f := -k*k/d;
  30.   fx := fx + f * dx/d;
  31.   fy := fy + f * dy/d;
  32. end;
  33. procedure Attraction(v1, v2: TVertex; var fx, fy, k: Extended);
  34. var dx, dy, d, f: Extended;
  35. begin
  36.   dx := v2.PosX - v1.PosX;
  37.   dy := v2.PosY - v1.PosY;
  38.   d := VectorLength(dx, dy);
  39.   f := d*d/k;
  40.   fx := fx + f * dx/d;
  41.   fy := fy + f * dy/d;
  42. end;
  43. var x, y, vx, vy, fx, fy, k: Extended;
  44.   v1, v2: TVertex;
  45.   n, i, j: Integer;
  46. begin
  47.   if Graph <> nil then
  48.   begin
  49.     n := Graph.Vertices.Count;
  50.     k := 0.5*sqrt(1/n);
  51.     for i := 0 to n-1 do
  52.     begin
  53.       fx := 0;
  54.       fy := 0;
  55.       v1 := Graph.Vertices[i];
  56.  
  57.       for j := 0 to n-1 do
  58.       begin
  59.         v2 := Graph.Vertices[j];
  60.         if i <> j then
  61.           Repulsion(v1, v2, fx, fy, k);
  62.       end;
  63.  
  64.       for j := 0 to n-1 do
  65.       begin
  66.         v2 := Graph.Vertices[j];
  67.         if ((i <> j) and (Graph.Incidency[i, j])) then
  68.           Attraction(v1, v2, fx, fy, k);
  69.       end;
  70.  
  71.       v1.VX := (v1.VX + 0.5 * fx) * DampingC;
  72.       v1.VY := (v1.VY + 0.5 * fy) * DampingC;
  73.  
  74.       v1.PosX := AdjustBounds(v1.PosX + 0.5 * v1.VX);
  75.       v1.PosY := AdjustBounds(v1.PosY + 0.5 * v1.VY);
  76.     end;
  77.   end;
  78. end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement