Как нарисовать график из матрицы расстояний в С#?

В настоящее время я создаю приложение на 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 (из-за компьютеров в колледже).

Я рад использовать внешнюю библиотеку, если проблема слишком сложна в этом контексте, но предпочел бы использовать свой собственный код, если это возможно.

Приветствуются все предложения и советы.


person Edward J Brown    schedule 26.08.2014    source источник
comment
Не беспокойтесь о том, что это исчезнет с экрана. Если внутри вы создаете холст, который в 2 раза больше (ширина и высота) наибольшего расстояния, то вы можете построить его, не беспокоясь о границах. Когда вы закончите, нарисуйте ограничивающую рамку вокруг нарисованной части и переместите ее в исходную точку для отображения.   -  person Jim Mischel    schedule 26.08.2014
comment
Также взгляните на соответствующие вопросы справа. В частности, stackoverflow.com/questions/18911994/, что может дать вам несколько хороших идей.   -  person Jim Mischel    schedule 26.08.2014
comment
Поиск в Google матрицы расстояний приводит к удивительному разнообразию изображений. Вы можете указать нам на одно или два, которые похожи на то, что вы хотите создать.   -  person TaW    schedule 27.08.2014
comment
Спасибо, ребята, за помощь до сих пор, основная проблема заключается в преобразовании точек в фактические координаты x и y на экране, может быть проще работать с сеткой (например, эта: mr-dnt.co.uk/Graphics%20Resources/DRAWING/isomgrid.gif) а затем ограничьте его так, чтобы один единственный узел мог быть подключен только к 6 другим узлам. Я добавил ссылку на изображение, чтобы дать людям представление о том, чего я хочу достичь. @JimMischel Мне нравится это предложение, но я не уверен в реализации, есть идеи, как сделать перевод, который вы описываете, при работе с графикой .NET?   -  person Edward J Brown    schedule 27.08.2014