В настоящее время я создаю приложение на C#, которое помогает учащимся использовать и понимать алгоритмы модуля D1 моего курса математики A-Level в рамках моего проекта COMP4.
Часть этих алгоритмов использует графики, которые необходимо вводить как матрицу расстояний, затем изоморфный график истинного масштаба необходимо нарисовать в форме окна. Как показано на диаграмме, указанной ниже.
https://www.dropbox.com/s/k5sl2y98pml8mji/DistanceMatrix.png?dl=0
Для простоты предположим, что у вас есть следующие функции
DrawLine(int aX, int aY, int bX, int bY) : void
// Draws line to screen given start and end points.
DrawNode(int x, int y) : void
// Draws node circle to screen given x and y co-ordinates of centre of circle.
Итак, я начал с представления матрицы расстояний в классах
public class Node : DataItem , INode
{
public IList<IArc> Arcs { get; set; }
public Node(string nodeName, IList<IArc> nodeNeighbors)
{
this.Name = nodeName;
Arcs = nodeNeighbors;
}
public Node(string nodeName)
{
this.Name = nodeName;
Arcs = new List<IArc>();
}
}
public class Arc : DataItem, IArc
{
public Arc(string arcName, decimal arcWeight, INode destinationNode)
{
this.Magnitude = arcWeight;
this.Name = arcName;
this.DestinationNode = destinationNode;
}
public INode DestinationNode { get; set; }
}
public class DataItem : IDataItem
{
public string Name { get; set; }
public decimal Magnitude { get; set; }
}
public class GraphDataSet<TNode> : DataSet<TNode>, IGraphSet<TNode> where TNode : INode
{
public int NumberOfNodes { get; set; }
public GraphDataSet(decimal[,] distanceMatrix, int NumberOfNodes)
{
for (int i = 0; i < NumberOfNodes; i++)
{
TNode NodeToAdd = default(TNode);
NodeToAdd.Name = Convert.ToString(i);
}
for (int i = 0; i < NumberOfNodes; i++)
{
for (int j = 0; j < NumberOfNodes; j++)
{
if (distanceMatrix[i, j] != 0)
{
INode Destination = GetItem(i);
GetItem(i).Arcs.Add(new Arc(i + ":" + Destination.Name ,distanceMatrix[i, j], Destination));
}
}
}
}
}
Я добрался до этого момента и убедился, что введенные данные представлены правильно, но теперь я не уверен, куда идти с точки зрения фактического рисования элемента на экране.
Я рассматривал различные стратегии, такие как создание внеэкранной очереди рисования, в которую заносятся детали. Исключение выдается, если происходят коллизии или если график начинает исчезать с экрана, но не может видеть, что он работает в долгосрочной перспективе.
Если это имеет какое-либо значение с точки зрения языковых функций, я использую c#.net с версией фреймворка, ограниченной 4.0.3 (из-за компьютеров в колледже).
Я рад использовать внешнюю библиотеку, если проблема слишком сложна в этом контексте, но предпочел бы использовать свой собственный код, если это возможно.
Приветствуются все предложения и советы.