Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИПОВС (2002) / ol / ol / Пояснительная записка_oll.doc
Скачиваний:
30
Добавлен:
16.04.2013
Размер:
3.64 Mб
Скачать

1.3.3 Проектирование создания дерева и способов работы с ним

1.3.3.1 Методика построения генеалогического дерева

Основная часть работ дипломного проекта связана с созданием и визуализацией генеалогического дерева. В результате введенной информации должно получится наглядное представление этой информации.

Существуют различные подходы к построению генеалогических деревьев. Это и использование формата GEDCOM, и использование обходов бинарных иn-нарных деревьев. В проекте использован следующий подход.

Для удобства рисования дерева создана следующая структура записей массива дерева. Структура записи представлена на рис. 1.3.3.1. Но на этом рисунке показаны только те поля записи, которые необходимы для визуализации генеалогического дерева. Полностью элемент массива дерева в виде записи выглядит так:

TPerson = record

Id: integer;

pol: string[3];

MotherId: integer;

FatherId: integer;

Fam: string[80];

Name: string[50];

PatronName: string[80];

Husbend: integer;

Sist_Broth: integer;

Children: integer;

pok: integer;

date_born: string[16];

place_born:string[80];

date_death:string[16];

place_death:string[80];

cause_death:string[20];

e_mail: string[50];

home_page: string[50];

another: string[50];

id_death:boolean;

xp, yp: integer;

end;

Необходимо пояснить, что информация о людях, необходимая для осуществления визуализации генеалогического дерева, хранится в одномерном массиве PersonAr. Одному элементу этого массива соответствует запись.

Двадцать одно поле записи дает кратко наиболее полную информацию о персоне. В программе вся эта информация отражается в форме fmMainInfo. Для осуществления визуализации дерева необходима только часть этих полей записи. Поэтому на рис. 3.4 приведен не полный объем записи элемента массива.

Первое поле записи – идентификационный номер человека, Id. Следующие поля - идентификационные номера отца и матери,MotherIdиFatherId. Получается, всегда есть ссылка на родителей человека. Значит, есть вся необходимая информация для того, чтобы восстановить вверх нисходящее генеалогическое дерево. ПолеHusbend- идентификационный номер супруга. По нему узнаем информацию о людях, находящихся слева и справа в дереве от рассматриваемого человека с номеромId. Теперь рассмотрю поляSist_BrothиChildren. Благодаря последним идентификационным номерам есть ссылки на сестру/брата и на детей. Следовательно, можно восстановить нижнюю часть генеалогического дерева. Есть некоторая особенность у полейSist_BrothиChildren: если у человека есть несколько сестер/братьев, то человек с идентификационным номеромSist_Brothв своем полеSist_Brothхранит ссылку на следующего сестру/брата. Так будет продолжаться до тех пор, пока не найдутся все сестры/братья, т.е. у последнего человека полеSist_Brothбудет равно нулю, ссылки ни на кого больше не будет.

Таким образом, с помощью такой созданной структуры записи элементов массива хранится вся необходимая информация для визуального представления дерева. Эти поля записи используются для осуществления алгоритмов рисования дерева и работы с ним.

Id

MotherId

FatherId

Husbend

Sist_Broth

Children

Рис. 1.3.3.1 Структура записи элемента массива

        1. Алгоритм отображения дерева

Вначале приведены общепринятые принципы построения деревьев (рис. 1.3.3.2.1). При построении генеалогического дерева сейчас придерживаются некоторых стандартных простых условных обозначений и правил.

  1. Мужчины всегда изображаются в виде квадратов, женщины - в видеокружностей.

  2. Графически изображаемые связи между членами родословной бывают только трех видов: "мужья-жены", "дети-родители" и "братья-сестры".

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

  4. Ваши дети изображаются на горизонтальном уровне ниже Вашего, а Ваши родители - на горизонтальном уровне выше Вашего. То же самое относится к детям и родителям всех Ваших братьев и сестер.

  5. Все поколения нумеруются сверху вниз римскимицифрами, а все индивидуумы в каждом поколении - слева направоарабскимицифрами. Это позволяет обозначить каждого человека личным идентификационным номером (например - III:15, что означает 15-й индивидуум в третьем поколении).

Родословное древо выглядит красиво и наглядно, но оно не может дать подробную информацию об упоминаемых в нем личностях.

Рис. 1.3.3.2.1 Общепринятый принцип построения деревьев

В общем алгоритме программы рис.1.3.1 этот этап записан как просмотр дерева. На рис. 1.3.3.2.2 графически показан алгоритм, использованный для визуализации дерева. В программе данные алгоритмы реализованы в модуле Pr1.pas. Главный алгоритм состоит из двух процедурCreateMas иDrawTree, включающих в себя еще процедуры.

Рис. 1.3.3.2.2 Общий алгоритм рисования дерева

На рисунках 1.3.3.2.3 и 1.3.3.2.4 алгоритмы процедур CreateMas иDrawTreeпредставлены подробнее.

CreateMasформирует массивpArPok, который будет удобен для осуществления визуализации генеалогического дерева. На том этапе, когда пришел этап рисования дерева, данные находятся в одномерном массиве записейPersonAr. Данные поступают в массив из файла*.tre. На месте * обычно записывается фамилия родословной. ПроцедураCreateMasвключает в себя еще процедуры:CreateArpok, SortArpok, FormXY, SizePanel.

  • CreateArpok:создаем двумерный массивpArPok из массиваPersonArтаким образом, чтобы на каждой строке массива находились люди одного поколения. Причем первой строчке массива соответствует самое старшее поколение людей, последней –самое младшее.

Рис. 1.3.3.2.3 Схемы алгоритма процедуры Рис. 1.3.3.2.4 Схема алгоритма процедуры создания двумерного рисования дерева (DrawTree).

массива (CreateMas).

  • SortArpok:проводим сортировку массиваpArPokтак, чтобы в каждой строке массива записи, соответствующие мужу и жене, находились рядом. Это будет в дальнейшем удобно для рисования самих узлов, отображающих этих людей и связей между ними.

  • FormXY:формируются координаты каждого узла-человека. В каждой записи есть поляxpиyp. До этого момента этим координатам присвоены нули. Затем эти поля записи равны тем координатам экрана, на местах которых будут находится узлы дерева – кружочки или квадратики.

  • SizePanel:рассчитываются получившиеся размеры рисунка дерева.

После выполнения этих процедур корректируются координаты узлов дерева в соответствии с размерами рисунка дерева и экрана. Массив сформирован должным образом. Далее алгоритм переходит к процедуре DrawTree.

Процедура DrawTree осуществляет непосредственно рисование самого дерева. Сначала рисуются узлы дерева. Если персона женского пола, то рисуется розовый кружочек, мужского пола – голубой квадратик. Далее прорисовываются горизонтальные линии-связи, соединяющие мужа и жену, затем вертикальные линии-связи, соединяющие родителей и их детей. Рисование связи мама-папа, не находящихся в браке, но имеющих общих детей, отображается горизонтально пунктирной линией. Эта линия будет чуть ниже, чем линия, соединяющая мужа и жену. Это линия выполняется следующим блоком алгоритма. Далее выполняется линия-связь мама-ребенок или папа-ребенок, т.е. известен только один родитель. Если муж и жена находятся в разных поколениях, то эта связь – кривая линия. Более подробно все эти блоки рисования будут рассмотрены ниже – в рабочем проекте.

        1. Алгоритм выделения отдельной ветви дерева

Задача этого алгоритма состоит в следующем. Пользователю предлагается полный список людей рассматриваемого им дерева. Из этого списка пользователь выбирает того человека, потомков которого он хочет увидеть. Потомки и линии, связывающие их с выбранным человеком, выделяются более ярким цветом.

Соседние файлы в папке ol