Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.01.2010, 13:22   #1
NSV
Форумчанин
 
Аватар для NSV
 
Регистрация: 27.05.2009
Сообщений: 127
Восклицание Алгоритм создания генеалогического древа

Всем привет!
Я уже довольно давно собираю данные о своем роде, делаю генеалогическое древо. Количество персонажей в нем у меня ушло за несколько сотен человек. Поэтому я решил хранить данные на компе. Попробовав несколько программ, я не получил хорошего результата. Так как в тех программах нужно просто рисовать древо, а мне это не подходит. Я бы хотел хранить это древо в какой-нибудь базе данных, а когда нужно, прога сама рисовала оптимальный вариант древа. Создать базу достаточно просто. Но тут стал вопрос, как будут связаны между собой люди в этой базе. Я подумал и пришел к выводу, что нужно создать 3 свойства: "родители", "супруги" и "дети". Это я наглядно показал на рисунке 1. Рисунок 2 - это то, как примерно должны расположиться номера людей в древе.
Но как перейти от базы, что на Рис.1 к древу, что на Рис.2???
Это главный вопрос. Первым шагом по пути к его решению, на мой взгляд, должно стать расформирование базы на поколения. Например, вот так:
1) 14
2) 9, 11, 13, 5
3) 3, 6, 2, 10, 7, 4
4) 12, 8, 15, 1
Это вроде получается.

А вот что мне делать дальше, я не знаю. Поэтому и обратился к Вам.
Если у кого-нибудь есть что-то полезное (ссылки, идеи и т.д.), то заранее огромное спасибо!
P.S. С праздником!!!
Изображения
Тип файла: jpg picture.jpg (122.5 Кб, 223 просмотров)
NSV вне форума Ответить с цитированием
Старый 07.01.2010, 13:55   #2
Sensizu
Otsukitakitte
Форумчанин
 
Аватар для Sensizu
 
Регистрация: 01.10.2009
Сообщений: 126
По умолчанию

И Вас с праздником!
Как такового решения я не имею, но если есть проблема в рисовании, то используйте стандартный метод рисования в Delphi - поищите в гугле.
Помог - ставь плюс.
$("question").onAnswer(function() { $(this).getItWright(true); });
Sensizu вне форума Ответить с цитированием
Старый 07.01.2010, 15:04   #3
NSV
Форумчанин
 
Аватар для NSV
 
Регистрация: 27.05.2009
Сообщений: 127
По умолчанию

Спасибо
С рисованием проблем как раз нет. Это даже рисовать не обязательно. Это можно и html-страничкой сделать и т.д. Нужен способ, чтобы как-то их лучшим образом распределить.
NSV вне форума Ответить с цитированием
Старый 07.01.2010, 16:50   #4
Sensizu
Otsukitakitte
Форумчанин
 
Аватар для Sensizu
 
Регистрация: 01.10.2009
Сообщений: 126
По умолчанию

Ну попробуй через INI или XML.
Отлично хранят информацию. Пример INI:
Цитата:
[Parents]
Name1=Elena
Age1=30
Name2=Victor
Age2=34
...
А потом можно считать вот так:
Цитата:
uses inifiles;
...
var ini:TIniFile; i,iniCount:integer;
begin
iniCount:=2;
ini:=TIniFile.Create();
for i:=1 to iniCount do begin
Memo1.Lines.Add(ini.ReadString('Par ents','Name'+inttostr(i),''));
...
На счёт Memo, так это просто пример, что информацию можно куда-то выводить.

С XML не работал ниразу, но структура наверное будет лучше:
Цитата:
<myTree>
<Parents>
<Human Name="Elena" Age="31" Address="..." />
...
</Parents>
<Childrens>
<Human Name="Afr" Age="23" Address="..." />
</Childrens>
</myTree>
Помог - ставь плюс.
$("question").onAnswer(function() { $(this).getItWright(true); });
Sensizu вне форума Ответить с цитированием
Старый 07.01.2010, 20:01   #5
NSV
Форумчанин
 
Аватар для NSV
 
Регистрация: 27.05.2009
Сообщений: 127
По умолчанию

Спасибо большое за помощь, но это к сожалению не то, что нужно. Вы пишете как создать базу данных. Всё это у меня уже есть. Я остановился на INI. Сделал прогу по работе с этой базой. Возможно, что что-то будет лучше, чем INI, но это совсем не важно.
Я специально не останавливался на этих подробностях и сделал на Рис.1 только четыре самых важных столбца (на мой взгляд).

Мне просто нужен алгоритм расположения всех этих кружочков и стрелочек. Хотя бы просто русскими словами. Мне нужно то, как должна "мыслить" программа, чтобы их расположить. А лучше, нужен оптимальный вариант расположения. На мой взгляд, оптимальный вариант - это когда стрелки должны быть как можно короче.

А где их расположить? Да хоть на простой канве. Это уже подробности языка и желания. Я думаю, что всё это не сложно переделать под что-то другое. Нужен просто метод расположения. Я написал эту тему в данный раздел потому что работаю с Delphi. Может её лучше нужно было написать в "Свободное общение"?

P.S. Можно писать хоть так: "Родителей первого поместить туда-то (можно X,Y), детей, если они есть в другое место и т.п.". Мне нужна только идея. Я её к горькому сожалению не вижу. Только придумал первый шаг (см. #1).
NSV вне форума Ответить с цитированием
Старый 07.01.2010, 20:21   #6
Sensizu
Otsukitakitte
Форумчанин
 
Аватар для Sensizu
 
Регистрация: 01.10.2009
Сообщений: 126
По умолчанию

ага, понял) у Вас проблема в расположении считаных строк.

Ну, попробуем... Ну родители в самом верху.. потом дети.. потом их дети и тд и тп. Ну расположение, насколько знаю, регулирует свойство Left, Top. К примеру, делаем преимущетсво в родительской строке:
Цитата:
...
Label1.Caption:=ini.readstring...
Label1.Caption:=Label1.Caption+'[p]'; // тег родителя
if Pos('[p]',Label1.Caption)<>0 then Label1.Left:=250;
Label1.Caption:=Copy(Label1.Caption ,0,length(Label1.Caption)-length('[p]');
...
Смысл понятен? =)
Помог - ставь плюс.
$("question").onAnswer(function() { $(this).getItWright(true); });
Sensizu вне форума Ответить с цитированием
Старый 07.01.2010, 21:23   #7
NSV
Форумчанин
 
Аватар для NSV
 
Регистрация: 27.05.2009
Сообщений: 127
По умолчанию

Спасибо. Конечно же, смысл понятен. Видимо я никак не могу точно выразить весь поток нахлынувших на меня мыслей. Всё кажется просто, когда "баба, деда, мама, папа да и я с братом". А вот когда поколений 5-7! И в некоторых поколениях не меньше двадцати! Тут проблемы с расположением и начинают сказываться. Я вот быстренько нарисовал две картинки. Информативностью правая ничем не отличается от левой, а вот наглядностью... Посмотрите на левую картинку. "3" и "4" располагаются точно по центральной линии между "8", "9", "10" и "11". "5" находится в "укромном месте", а на правой картинке "5" находится сбоку. И сумма длин всех стрелок на левой картинке гораздо меньше, чем на правой.
Видимо, тут нужно учитывать большое количество факторов. Можно даже позволить пользователю какими-то факторами управлять. К примеру: расстояние между поколениями; минимальное расстояние между персонами; мужчина слева, а женщина справа (или наоборот) и т.д.
Всё видимо не так просто, как кажется на первый взгляд. По крайней мере для меня .
Изображения
Тип файла: jpg picture2.jpg (99.0 Кб, 192 просмотров)
NSV вне форума Ответить с цитированием
Старый 07.01.2010, 21:28   #8
Sensizu
Otsukitakitte
Форумчанин
 
Аватар для Sensizu
 
Регистрация: 01.10.2009
Сообщений: 126
По умолчанию

Я сдаюсь... З Різдвом! =) Помогут Вам программеры заядлые
Помог - ставь плюс.
$("question").onAnswer(function() { $(this).getItWright(true); });
Sensizu вне форума Ответить с цитированием
Старый 08.01.2010, 11:34   #9
NSV
Форумчанин
 
Аватар для NSV
 
Регистрация: 27.05.2009
Сообщений: 127
По умолчанию

Буду надеяться
NSV вне форума Ответить с цитированием
Старый 10.01.2010, 21:26   #10
NSV
Форумчанин
 
Аватар для NSV
 
Регистрация: 27.05.2009
Сообщений: 127
По умолчанию

Товарищи! У кого-нибудь есть на примете какой-нибудь компонент (для Delphi), который работает со сложными деревьями или блок-схемами? Чтобы можно было нарисовать структуру подобную второму рисунку в посте #1. Чтобы могло быть несколько пар "родителей". И каждый элемент этого компонента можно было задавать в виде привязанности к другим. А не посредством X и Y.
Спасибо!
P.S. погуглил-погуглил, а ничего особенно подходящего не нашел.
NSV вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм создания дерева Delphi VadEr Помощь студентам 5 03.11.2009 08:45
Создания интерфейса...си dampirik Помощь студентам 1 06.07.2009 14:40
C# Создания ярлыка MAcK Общие вопросы .NET 6 16.08.2008 12:22
создания бота kobras Работа с сетью в Delphi 1 01.12.2007 14:41
Создания Класса Mickle Общие вопросы Delphi 1 30.04.2007 00:44