Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function VectorLength(x, y: Extended): Extended;
- begin
- VectorLength := sqrt(x*x + y*y);
- end;
- function AdjustBounds(x: Extended): Extended;
- begin
- if x < 0 then
- AdjustBounds := 0.0
- else if x > 1 then
- AdjustBounds := 1.0
- else
- AdjustBounds := x;
- end;
- procedure TForm1.AdvanceForces(Sender: TObject);
- function Signum(x: Extended): Extended;
- begin
- if x > 0 then Signum := 1
- else if x = 0 then Signum := 0
- else Signum := -1;
- end;
- procedure Repulsion(v1, v2: TVertex; var fx, fy, k: Extended);
- var dx, dy, d, f: Extended;
- begin
- dx := v2.PosX - v1.PosX;
- dy := v2.PosY - v1.PosY;
- d := VectorLength(dx, dy);
- f := -k*k/d;
- fx := fx + f * dx/d;
- fy := fy + f * dy/d;
- end;
- procedure Attraction(v1, v2: TVertex; var fx, fy, k: Extended);
- var dx, dy, d, f: Extended;
- begin
- dx := v2.PosX - v1.PosX;
- dy := v2.PosY - v1.PosY;
- d := VectorLength(dx, dy);
- f := d*d/k;
- fx := fx + f * dx/d;
- fy := fy + f * dy/d;
- end;
- var x, y, vx, vy, fx, fy, k: Extended;
- v1, v2: TVertex;
- n, i, j: Integer;
- begin
- if Graph <> nil then
- begin
- n := Graph.Vertices.Count;
- k := 0.5*sqrt(1/n);
- for i := 0 to n-1 do
- begin
- fx := 0;
- fy := 0;
- v1 := Graph.Vertices[i];
- for j := 0 to n-1 do
- begin
- v2 := Graph.Vertices[j];
- if i <> j then
- Repulsion(v1, v2, fx, fy, k);
- end;
- for j := 0 to n-1 do
- begin
- v2 := Graph.Vertices[j];
- if ((i <> j) and (Graph.Incidency[i, j])) then
- Attraction(v1, v2, fx, fy, k);
- end;
- v1.VX := (v1.VX + 0.5 * fx) * DampingC;
- v1.VY := (v1.VY + 0.5 * fy) * DampingC;
- v1.PosX := AdjustBounds(v1.PosX + 0.5 * v1.VX);
- v1.PosY := AdjustBounds(v1.PosY + 0.5 * v1.VY);
- end;
- end;
- end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement