Скачиваний:
0
Добавлен:
26.10.2025
Размер:
17.31 Кб
Скачать

Этот код реализует Windows Forms-приложение, которое создаёт и визуализирует граф (как в теории графов) с набором вершин (точек) и рёбер (линий). Приложение позволяет генерировать случайный граф, копировать его, сдвигать для отображения двух вариантов (исходного и изменённого), а также выполнять интерактивные операции по модификации графа (например, обмен позиций вершин, изменение цвета, добавление рёбер в «дерево»).

Ниже описана основная структура и функциональность:

Основная форма и визуализация

  • Два графа: В классе Form1 создаются два объекта типа Graph – один «исходный» (graph), второй – изменённый копией и сдвинутый вправо (graph2.Move(300)).

  • Настройка отображения: Используется двойная буферизация для повышения производительности отрисовки. В обработчике Form1_Paint рассчитываются коэффициенты масштабирования и смещения, чтобы граф корректно вписывался в окно, а затем вызываются методы отрисовки графов.

  • Изменение размера формы: При изменении размера окна вызывается Invalidate(), что приводит к перерисовке.

Класс Graph

Класс Graph содержит логику генерации и манипуляции графом.

  • Хранение данных:

    • pgsList – список вершин (объекты класса PointGraph), каждая вершина имеет координаты, имя, цвет и флаг inTree (например, для построения минимального остовного дерева).

    • linesList – список рёбер (объекты класса Line), которые соединяют вершины.

    • lnList – дополнительный список для хранения рёбер, который может использоваться при построении дерева.

  • Методы генерации:

    • Generate() создаёт вершины, размещая их по «решётке» с некоторыми случайными смещениями, и затем случайным образом соединяет вершины рёбрами с заданным весом.

    • Generate3() – альтернативная генерация, где создаются вершины с дополнительной случайностью (некоторые точки могут не попасть в граф), а затем для каждой пары вершин создаётся ребро. Получившийся список рёбер сортируется по длине, и далее выбирается ребро с минимальной длиной для начала построения дерева.

  • Манипуляции с графом:

    • Swap(int i, int k) – меняет местами координаты двух вершин.

    • Green(int i, int k) – изменяет цвет указанных вершин (например, при успешном обмене, чтобы визуально отметить улучшение).

    • Repaint(Brush brushnew, Brush brushold) – изменяет цвет вершин, у которых цвет соответствует старому значению.

    • Copy(Graph graph) – копирует вершины и рёбра из другого графа.

    • Move(int dx, int dy = 0) – сдвигает все вершины на заданное смещение, что позволяет разместить изменённый граф рядом с исходным.

    • MoveIntoCenter() – находит вершину с наибольшим числом соединений и перемещает её в центр списка, что, возможно, используется для оптимизации визуального расположения.

  • Подсчёт общей длины графа: Метод Length() суммирует длины всех рёбер, где длина ребра вычисляется как евклидово расстояние между координатами двух вершин.

  • Метод AddLineToTree(): Этот метод, судя по названию, пытается добавить ребро в некое дерево (вероятно, для построения минимального остовного дерева). Он перебирает список рёбер из lnList и добавляет ребро, если одна из вершин уже включена в дерево, а другая – нет.

Классы для представления вершин и рёбер

  • PointGraph: Представляет вершину графа с координатами (x, y), уникальным идентификатором (name), цветом для отрисовки и флагом inTree. Метод Draw(Graphics gr) отвечает за отрисовку вершины (в виде эллипса с номером).

  • Line: Представляет ребро между двумя вершинами, задаваемое индексами ind1 и ind2 в списке вершин графа. Ребро имеет вес и свойство l, вычисляющее длину ребра по координатам двух вершин. Метод Draw(Graphics gr) отрисовывает линию между соответствующими точками.

Интерактивное поведение

  • Обработка клика мыши (Form1_MouseClick): При клике выбираются две случайные вершины для обмена их позиций. Если суммарная длина графа уменьшается после обмена, изменения сохраняются и вершины перекрашиваются в зелёный цвет (метод Green); иначе обмен отменяется.

  • Нажатия на кнопки:

    • Одна из кнопок вызывает MoveIntoCenter(), что перемещает вершину с наибольшим числом соединений в центр.

    • Другая кнопка перегенерирует граф (с вызовом Generate() или Generate3()) и обновляет копию graph2.

    • Также есть кнопки для перекраски графа и добавления ребра в дерево (через AddLineToTree()).

Итог

В целом, код демонстрирует создание и интерактивное изменение графа с визуализацией: генерируются случайные вершины и рёбра, затем пользователь может влиять на структуру графа (например, обмен позиций вершин для оптимизации суммарной длины), наблюдать изменения через обновление меток и отрисовку на форме. Такое приложение может использоваться для экспериментов с алгоритмами оптимизации, визуализации структуры графов или демонстрации работы методов генерации и манипуляции графами в реальном времени.

Соседние файлы в предмете Автоматизация проектирования систем и средств управления