/// <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); } }
/// <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)); } }