Exemplo n.º 1
0
            /// <summary>
            /// Создание нового объекта возможно только после того как созданы узлы вершин
            /// </summary>
            /// <param name="tg"></param>
            /// <param name="edgeNum"></param>
            public EdgeGraphNode(TriangleGraph tg, short edgeNum, Point2d pt)
            {
                if (edgeNum > 2 || edgeNum < 0)
                {
                    throw new ArgumentException(nameof(edgeNum));
                }

                if (!tg.vertexNodes.All(n => n != null))
                {
                    throw new ArgumentException(nameof(tg));
                }

                TriangleGraph = tg;
                EdgeNum       = edgeNum;

                //Расчитать параметр для этого узла
                Parameter = (pt - tg.vert2dLocs[edgeNum]).Length / tg.edgesLength[edgeNum];

                //Добавить узел в нужное место в графе, заполнить свойство LinkedListNode
                LinkedListNode <GraphNode> lln = tg.vertexNodes[edgeNum];

                do
                {
                    lln = lln.Next != null ? lln.Next : lln.List.First;

                    EdgeGraphNode edgeNode = lln.Value as EdgeGraphNode;
                    if (edgeNode != null && edgeNode.Parameter > Parameter)
                    {
                        //Если обнаружен узел с большим параметром, то выход из цикла
                        break;
                    }
                } while (!(lln.Value is VertexGraphNode));

                if (!lln.Equals(tg.vertexNodes[0]))
                {
                    LinkedListNode = tg.graphNodes.AddBefore(lln, this);
                }
                else//????На первом месте в списке всегда должна быть первая вершина. Перед ней ничего не вставляется. Вместо этого в конец списка
                {
                    LinkedListNode = tg.graphNodes.AddLast(this);
                }
            }
Exemplo n.º 2
0
            /// <summary>
            /// Узлы вершин должны быть созданы последовательно. Сначала 0, потом 1 и 2
            /// При этом других узлов в графе не должно быть
            /// </summary>
            /// <param name="tg"></param>
            /// <param name="vertNum"></param>
            public VertexGraphNode(TriangleGraph tg, short vertNum)
            {
                if (vertNum > 2 || vertNum < 0)
                {
                    throw new ArgumentException(nameof(vertNum));
                }

                TriangleGraph = tg;
                VertNum       = vertNum;

                //Добавить узел в нужное место в графе, заполнить свойство LinkedListNode и поле vertex
                if (tg.vertexNodes.Count(n => n != null) == vertNum &&
                    tg.graphNodes.Count == vertNum)
                {
                    LinkedListNode          = tg.graphNodes.AddLast(this);
                    tg.vertexNodes[vertNum] = LinkedListNode;
                }
                else
                {
                    throw new ArgumentException(nameof(tg));
                }
            }