pascalabcnet/InstallerSamples/WhatsNew/3_9_0/argra.pas
Mikhalkovich Stanislav 522b744236 Примеры для 3.9.0
CartesianPower(Self: string
Некоторые проверки именованных аргументов
2023-05-08 20:05:55 +03:00

46 lines
1.3 KiB
ObjectPascal

uses GraphWPF;
begin
// Представление взвешенного графа как словаря словарей
//var EmptyDict := new Dictionary<char,integer>;
var graph := Dict(
('A',Dict(('B',2),('E',5))),
//('B',EmptyDict),
('C',Dict(('B',7),('D',9))),
('D',Dict(('B',34))),
('E',Dict(('C',12),('B',66)))
);
var dPoints := new Dictionary<char,Point>;
var R := 200;
var n := ('A'..'E').Count;
var Phi := 0.0;
for var c := 'A' to 'E' do
begin
dPoints[c] := Window.Center + R * Vect(Cos(Phi),Sin(Phi));
Phi += 2 * Pi/n;
end;
Window.Title := 'Рисование ориентированного графа';
var Radius := 10;
foreach var kv in dPoints do
begin
var p := kv.Value;
Circle(p,Radius);
TextOut(p.x,p.y,kv.Key,Alignment.Center);
end;
foreach var k1 in graph.Keys do
foreach var k2 in graph[k1].Keys do
begin
var weight := graph[k1][k2];
var (p1,p2) := (dPoints[k1],dPoints[k2]);
var v := p2 - p1;
var pp1 := p1 + v.Norm * Radius;
var pp2 := p2 - v.Norm * Radius;
Arrow(pp1,pp2);
var cc := p1 + v/2;
var txt := weight.ToString;
var sz := TextSize(txt);
FillRectangle(cc.X - sz.Width/2, cc.Y - sz.Height/2, sz.Width, sz.Height);
TextOut(cc.x,cc.y,weight,Alignment.Center);
end;
end.