Расскажите, что здесь происходит в коде? Хотя бы в целом.
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;
namespace GraphsMinCoverage.Models.GraphLab
{
public class RoundGraphVisualizer
{
public static void Visualize(Canvas canvas, GraphData graph, int vertexRadius = 15)
{
Point center = GetCenter(canvas);
int distY = (int)(canvas.ActualHeight / 2 - vertexRadius * 5);
int distX = (int)(canvas.ActualWidth / 2 - vertexRadius * 6);
int verticesCount = graph.Vertices.Count;
double angle = 0;
double deltaAngle = 360 / verticesCount;
double x, y;
for (int i = 0; i < verticesCount; i++)
{
x = center.X - distX * Math.Sin(angle * Math.PI / 180);
y = center.Y - distY * Math.Cos(angle * Math.PI / 180);
graph.Vertices[i].Position = new Point(x, y);
angle += deltaAngle;
}
foreach (var edge in graph.Edges)
{
Line line = new Line();
line.Stroke = Brushes.Black;
line.Fill = Brushes.Black;
line.X1 = edge.Source.Position.X;
line.Y1 = edge.Source.Position.Y;
line.X2 = edge.Target.Position.X;
line.Y2 = edge.Target.Position.Y;
canvas.Children.Add(line);
//TextBlock textBlock = new TextBlock();
//textBlock.Text = graph.WeightMatrix[edge.Source.ID - 1, edge.Target.ID - 1].ToString();
//textBlock.FontSize = 15;
//Canvas.SetLeft(textBlock, (line.X1 + line.X2) / 2);
//Canvas.SetTop(textBlock, (line.Y1 + line.Y2) / 2);
//canvas.Children.Add(textBlock);
}
foreach (var vertex in graph.Vertices)
{
DrawVertex(canvas, vertex, Brushes.White);
}
}
public static void DrawVertex(Canvas canvas, VertexData vertex, SolidColorBrush color)
{
vertex.Color = color;
Ellipse ellipse = new Ellipse();
ellipse.Stroke = Brushes.Black;
ellipse.Fill = color;
ellipse.SetValue(Canvas.TopProperty, vertex.Position.Y - 15);
ellipse.SetValue(Canvas.LeftProperty, vertex.Position.X - 15);
ellipse.Height = 15 * 2;
ellipse.Width = 15 * 2;
canvas.Children.Add(ellipse);
TextBlock textBlock = new TextBlock();
textBlock.Text = vertex.Text;
Canvas.SetLeft(textBlock, vertex.Position.X - 15 / 2);
Canvas.SetTop(textBlock, vertex.Position.Y - 15 / 2);
canvas.Children.Add(textBlock);
}
public static void PaintGraph(Canvas canvas, GraphData graph)
{
List<SolidColorBrush> brushes = new List<SolidColorBrush>();
foreach (var vertex in graph.Vertices)
{
SolidColorBrush color = null;
bool flag = false;
foreach (var brush in brushes)
{
int count = vertex.IncidentEdges.Where(e => e.OtherEdge(vertex).Color.Equals(brush)).Count();
Thread.Sleep(10);
if (count == 0)
{
color = brush;
flag = true;
break;
}
}
if (!flag)
{
do
{
color = PickBrush();
} while (brushes.Contains(color));
}
brushes.Add(color);
vertex.Color = color;
DrawVertex(canvas, vertex, color);
}
var brushes1 = brushes.ToList().Distinct();
System.Windows.MessageBox.Show($"Number of colors: {brushes1.Count()}");
}
public void ColorsCount(GraphData graph)
{
var color = new SolidColorBrush();
foreach (var vertex in graph.Vertices)
{
}
}
//public static void PaintGraph1(Canvas canvas, GraphData graph)
//{
// var colors = new List<SolidColorBrush>();
// var notPainted = graph.Vertices.ToList();
// var painted = new List<VertexData>();
// //while (notPainted.Count != 0)
// //{
// foreach (var vertex in notPainted)
// {
// if (vertex.Color.Color == Colors.White)
// {
// var disconnectedVertices = notPainted.Except(vertex.GetNearbyVertices()).ToList();
// foreach (var disVertex in disconnectedVertices)
// {
// SolidColorBrush color = null;
// if (!painted.Contains(disVertex))
// {
// painted.Add(disVertex);
// }
// foreach (var vert in painted)
// {
// DrawVertex(canvas, vert, color);
// }
// }
// }
// }
// }
// //}
//}
private static Point GetCenter(Canvas canvas)
{
Point center = new Point();
center.X = canvas.ActualWidth / 2;
center.Y = canvas.ActualHeight / 2;
return center;
}
private static SolidColorBrush PickBrush()
{
SolidColorBrush result = Brushes.Transparent;
Random rnd = new Random();
Type brushesType = typeof(Brushes);
PropertyInfo[] properties = brushesType.GetProperties();
int random = rnd.Next(properties.Length);
result = (SolidColorBrush)properties[random].GetValue(null, null);
return result;
}
}
}