[JS KineticJS] Мащаб на семейното дърво


13
Колко голямо трябва да е дървото което трябва да се направи , да е както на примера максимум със 3 нива или трябва да работи при всякакви варианти . Защото ако е при всякакви вариант се налага рекурсивно обхождане и проверка за родители и т.н. и става доста по сложно и бяга от идеята за канвас домашно .
EDIT: Ето един тест , всички в него имат роднинска връзка, няма кръвосмешение и няма повтарящи се имена http://pastebin.com/PRXu047x Image : http://s24.postimg.org/pcfpt6zud/Family_Tree.png ПС : Не ме бива да рисувам :)



Отговори



11

Решение Демо

Даже няма звездичка тази задача :))

Първо си правя обекти от тип Human - имат си пол, партньор, деца, родител и име. Обхождам всички подадени обекти и им задавам тези стойности - понеже не съм сигурен че няма да са подадени разбъркано. Връщам освен масив със всички хора, масив с прародители - такива които си нямат родители (корени). 

После пак обхождам в широчина и добавям индекси на всеки човек - къде трябва да седи в дървото (дълбочина и Х координата).

Самото рисуване проверява пола и прави съответното квадратче. Ако човека няма партньор не се знае дали е жена или мъж - понеже по условие децата са само имена и пола им става ясен ако участват в семейство. Проверява се дали човека има партньор - ако да се рисува връзка между тях.

Когато се рисува всеки човек се проверява дали има родител - ако има се прави връзка между по-левия от родителя и партньора на родителя (така работи самото рисуване на тези криви линиики) и самото дете.

За да работи коректно не трябва да се повтарят имената - което лесно може да се промени ако се задава и ЕГН на всеки човек и проверките после ползват него.

В самото демо има 3 теста (3тия е с 100 нива на наследяване - зарежда 3 - 4 сек) и един бутон да си вкарвате вие масива в input-a :))

Надявам се кода да е достатъчно четим :))


от dzhenko (3893 точки)


0
Не съм ти чел кода , по принцип Павлина и Генади трябва да са на втория ред , това за да се постигне трябва да намериш най дългия път в йерархията , и от него да пуснеш рекурсивно да изчислява позициите по редове вече за да се наредят всяко поколение на един и същи ред . Предвид колко е извратена задача може и да не се занимаваш с това :)

от TeodorTunev (3061 точки)


3

Ето и моето решение, ползвах теста на pavelh:

DEMO

SOURCE

Ще съм благодарен този, който е правил теста да каже дали се визуализира правилно. Специално мен ме затрудниха повече сметките, кое къде да се рисува и смятам, че задачата си беше ок като за KeneticJS. За съжаление не съм майстор художник :) 

 


от dimo.petrof (2887 точки)


0
Изрисувано в добре.

от lithical (992 точки)

0
Благодаря ... и за това, че ми спести времето за писане на тестове :)

от dimo.petrof (2887 точки)


0
Колеги, тази задача може ли да се реши ако човек не е учил ООП?
Малко ми е мъгла концепцията за дървото. Изглежда ми сякаш всеки елемент от масива има неизвестна самоличност и трябва да го навържеш със съседните елементи за да откриеш самоличността му.
Засега ще опитам да разуча някое от вашите решения...

от ivan.mihov1 (4988 точки)


0
ООП не ти трябва, но ти трябва Data Structures and Algorithms - Trees или Graphs https://telerikacademy.com/Courses/Courses/Details/89

от lithical (992 точки)

0
По точно за задачата ще ти е нужно да изгледаш лекцията Дървета и обхождане(DFS,BFS). Обяснено е доста добре няма да ти е трудно да ги разбереш.



0

И аз написах алгоритъм за семейството, който се основава на това, че имената са уникални, иначе няма да работи правилно. Но нямам идея как да изрисувам имената.

Ето го и кодът:

https://github.com/stoyans/Telerik/blob/master/WebDesign/JavaScript%20UI%20and%20DOM/03.KineticJS/01.CreateFamilyTree/family-tree-script.js

1. С findRoot намирам корена, като претърсвам масива и запазвам тези имена, които се повтарят само веднъж, т.е. не присъстват като деца в останалите семейства. В familiesWithChildren запазва индекса на семейството, от което ще почне дървото

2. treeSearch започва от корена на дървото, като взима всяко от децата и проверява дали то не е почнало ново семейство, ако е така запазвам индекса на това семейство в subfamilies, а в currentLevelofMembers запазвам всички членове от текущото ниво (с и без семейства). И така с новите индекси на децата със семейства почва ново обхождане като ги добавям в familiesWithChildren.

Може да не е много културно написано, но работи.

Следващите дни ще се опитам да нарисувам нещо смислено.


от Tanis (75 точки)