Posts Tagged ‘Структурный анализ’
Структурный анализ
Продолжаем конкретизировать задачи, цели и методы их достижения.
Предположим, все звенья, кинематические пары и связи между ними уже хранятся в памяти, пока что не важно, каким образом.
Для дальнейшего исследования механизма необходимо сначала провести структурный анализ.
Один из возможных вариантов – делать это с помощью графа.
На самом деле это единственный нормальный вариант, до которого я смог додуматься
.
Радует то, что в какой-то статье (ссылку дам позже) работники какой-то кафедры СПбГУ ИТМО описывали свою программу, созданную только для структурного анализа, причем тоже использовали графы.
Итак, в чем суть. Построим граф, вершинами которого будут звенья механизма, а ребрами – кинематические пары.
Сначала надо указать, что приводит механизм в движение. Выбранные пользователем стартовая КП и стартовое звено образуют группу Ассура первого класса.
Далее начинается собственно анализ.
Пока что будем реализовывать поиск групп Ассура 2-го класса (используемый алгоритм легко модифицировать для более сложных задач, мы оставляем это на будущее). Группа Ассура 2-го класса – это набор из 2 КП и 3 звеньев, которые соединяются этими КП. Искать эти группы надо по правилу: 2 вершины должны быть уже просчитаны на данный момент, тогда мы можем просчитать третью.
Для примера, пусть есть следующий механизм:
Качество рисунков в этой статье не ахти, но это потом поправлю.
Этому механизму соответствует следующий граф:
Числа в вершинах графа – это номера соответствующих звеньев механизма. Введена фиктивная вершина “0″, которая обозначает “землю”. Это сделано для упрощения дальнейшего анализа. “Землей” будем называть любую просчитанную вершину. Буквы рядом с ребрами – это имена соответствующих кинематических пар механизма.
“Земляные” вершины будем красить в зеленый темный. Значит, граф превращается в такой:
С учетом того, что пользователь указал 1-ую группу Ассура, имеем следующее:
Звенья 0, 1 и точка O принадлежат теперь 1-ой группе Ассура, 1-го класса.
Далее алгоритм похож на обход графа в ширину. На каждой итерации вершины, соседние с темными зелеными, окрашиваются в светлый зеленый. Теперь задача состоит в том, чтобы найти путь из темной зеленой вершины в другую темную зеленую. По построению, этот путь будет содержать две светлых зеленых. Три ребра и две светлых зеленых вершины выделяем в отдельную группу Ассура. По-моему можно обойтись и без перекрашивания вершин в светлые зеленые, но я подумаю и вспомню, зачем же это все-таки понадобилось…
Алгоритм в действии:
- Вершины 2, 3 и 5 – соседние с темными зелеными. Красим их в светлый зеленый.

- Нашли путь 1 A 2 B 3 C 0. Выделяем в отдельную группу Ассура второго класса ребра A, B, C и вершины 2, 3.

- Вершины 4 и 7 теперь соседние с темными зелеными. Красим их в светлый зеленый.

- Нашли путь 0 D3 5 D2 6 D1 3 (или в другую сторону, не важно). Выделяем вершины 5, 6 и ребра D1, D2, D3 в отдельную группу Ассура.

- Вершина 6 теперь стала соседней с темной зеленой. Перекрашиваем ее в светлый зеленый:

- И последнее: вершины 6, 7 и ребра E, F1, F2 выделяем в группу Ассура.

Надо еще раз обратить внимание на то, что ребра графа – это кинематические пары механизма, а вершины графа – это его ребра.
Каждый раз, когда какая-то часть механизма обосабливается в отдельную группу Ассура, создаем объект класса AssurGroup, ставим ему соответствующие значения свойств и добавляем в указатель на этот объект в список.
Полученный список позволяет провести кинематический анализ.
Если просчитаны все группы Ассура с 1-й по i-ую в этом списке, то есть все данные для вычисления (i+1)-ой. Таким образом, провести кинематический анализ можно за 1 проход списка.



