public static VertexClass CreateModel(Object data_prev, Object data_curr, Object data_next) { VertexClass vertex_prev = new VertexClass(data_prev, data_curr, data_next); VertexClass vertex_next = new VertexClass(data_next, data_curr, data_prev); // Установление связей между начальными тройками. vertex_prev.prev.SetCros(vertex_next.next); vertex_prev.SetCros(vertex_next); vertex_prev.next.SetCros(vertex_next.prev); return vertex_prev; } // Проверить! Оптимизировать!
public void Reset() { current = start; }
/// <summary> /// Установление связи с перекрёстным узлом (и наоборот). /// </summary> /// <param name="cros_vertex">Ссылка на перекрёстный узел.</param> protected void SetCros(VertexClass cros_vertex) { cros = cros_vertex; cros.cros = this; }
public bool MoveNextInTriple() { current = current.next; return current != start; }
public bool MoveNextInTriple(CheckedBoolFunction ChF, CheckedVoidFunction FF) { do { if (!current.Rebuild(ChF)) return true; FF(current); current = current.next; } while (current != start); return false; }
public bool MoveNextInNode() { current = current.next.cros.next; return current != start; }
public bool MoveNextInNode(CheckedBoolFunction ChF) { do { if (!current.Rebuild(ChF)) return true; current = current.next.cros.next; } while (current != start); return false; }
/// <summary> /// Разбиение противоположного ребра (вставка двух новых троек). /// </summary> /// <param name="data">Вставляемый объект.</param> public void BreakCrosBy(Object data) { // Создаём две противоположнонаправленные тройки. VertexClass vertex_n = new VertexClass(next.data, data, prev.data) { cros = this }; VertexClass vertex_f = new VertexClass(prev.data, data, next.data) { cros = this.cros }; // Устанавливаем связи между созданными тройками. vertex_n.prev.SetCros(vertex_f.next); vertex_n.next.SetCros(vertex_f.prev); // Устанавливаем связи со всем графом. vertex_n.cros.cros = vertex_n; vertex_f.cros.cros = vertex_f; }
public Enumerator(VertexClass vertex) { start = vertex; current = vertex; }
protected VertexClass(Object data_prev, Object data_curr, Object data_next) { prev = new VertexClass() { next = this, data = data_prev }; data = data_curr; next = new VertexClass() { prev = this, data = data_next }; prev.prev = next; next.next = prev; }
public TripleClass(VertexClass vertex) { Vertex = vertex; VertexClass.Enumerator en_vertexes = Vertex.GetEnumerator(); do { en_vertexes.Current.Triple = this; } while (en_vertexes.MoveNextInTriple()); }
private bool MonotonCheck(VertexClass vertex, Circle circle) { return true; }
private void ChVF(VertexClass vertex) { vertex.Triple.Update(); }
private bool ChBF(VertexClass vertex) { TripleClass triple = vertex.Cros.Triple; if (triple == null) return true; Circle delone_circle = triple.Data; Circle circle = vertex.Data as Circle; double dx = circle.X - delone_circle.X; double dy = circle.Y - delone_circle.Y; return Math.Sqrt(dx * dx + dy * dy) - circle.R - delone_circle.R >= 0; // Находим расширенное расстояние от Circle до Circle. }