Obmedzovac layoutu

0 views
Skip to first unread message

Jaroslav Prokop

unread,
Mar 26, 2011, 9:27:38 AM3/26/11
to tim16_2010
Milan,

Pripravil som ti dve branche, v jednej su vnorene nody pripajane k
nadradenej, v druhej nie su. Prosim pozri sa na to, pretoze ked tie
nody nepripojim pomocnou hranou, nie su obmedzene do gule v okoli
nadradenej nody...

Milan Laslop

unread,
Mar 26, 2011, 12:20:10 PM3/26/11
to tim16...@googlegroups.com
Zatiaľ som si chyby v obmedzovači nevšimol, sú tam ale iné problémy +
správanie, s ktorým sme nerátali.

commitol som do nested_graph 2 zmeny kvôli lepšiemu testovaniu:
- menší polomer okolo parent uzla (10)
- jednoduchší testovací graf (nested_simple.graphml - iba 1 uzle a v nej
16 vnorených, žiadne hrany)

1. problém:
- stalo sa v mojom testovacom grafe (nested_simple.graphml)
- na začiatku si layoutovač uvedomí, že nenastáva žiadna výrazná zmena,
tak grafu setne frozen = layoutovanie sa zastaví a uzly sa rozprchávajú od
seba nejakou ich aktuálnou rýchlosťou (to som nepozeral, prečo stále idú
preč, keďže rýchlosť by sa im mala vtedy resetnúť na 0)
- treba zastaviť a znovu spustiť layoutovač z GUI (vtedy sú už uzly
väčšinou dosť ďaleko na to, aby sa nimi layoutovač chcel zaoberať)
- dávaj pozor, aby sa ti to nestalo v niektorom z tvojich grafov

2. problém:
- stalo sa v nested3.graphml
- niektoré uzly idú preč, akoby sa nimi layoutovač nechcel zaoberať
- treba zastaviť a znovu spustiť layoutovač z GUI (potom už aj tie sa
začnú približovať tam, kam majú)

3. problém:
- je tam správanie, s ktorým sme pri návrhu layoutovania vnorených grafov
(pomocou obmedzovača) nerátali
- predstav si, že je:
- uzol A
- vnorený graf v uzle A
- v tomto vnorenom grafe uzly B, C, D
- nikde žiadne hrany (alebo len hrany medzi uzlami B, C, D)
- na začiatku je nejaké akoby náhodné rozdelenie uzlov
- určite sa stane, že nebudú okolo A rozložené úplne rovnomerne, ale bude
ich v jednom smere od A viac ako v iných smeroch
- ak sa chcú vplyvom obmedzovača priblížiť k uzlu A (dajme tomu, že tá
väčšina, čo je v jednom smere od A), aby sa vmestili do gule okolo tohoto
uzla, odtlačia tým uzol A ďalej od seba (keďže layoutovač chce nejakú
vzdialenosť medzi uzlami nespojenými hranou)
- celý graf takto potom putuje preč
- možno nastáva, iba ak je polomer obmedzovacej gule menší ako nejaká
hodnota (ak by bol polomer väčší, vnorené uzly by sa mohli vzdialiť tak,
aby už nevplývali na parent, no ale my chceme rovnomerne zaplniť
obmedzovaciu gulu, nie iba od nejakej vzdialenosti od parent uzla, od
ktorej náhodou už layoutovač nechce vzdialiť uzly)

Budeme preto asi musieť zmeniť správanie layoutovača, aby zvlášť
layoutoval každý vnorený graf, bez toho, aby na seba vplývali uzly z
rôvnych vnorených grafov (aj z rôznych úrovní grafov). Vplývať by mali na
seba navzájom iba uzly jedného grafu, bez ohľadu na uzly parent grafu (a
akýchkoľvek vyšších parent grafov) a bez ohľadu na uzly vnorených grafov
(aj v akejkoľvek nižšej úrovni).
Sú 2 základné možnosti, ak toto budeme chcieť robiť:
- spustiť zvlášť inštanciu layoutovača nad každým grafom (layoutovač
dostane množinu uzlov, ktorou sa má zaoberať, o ostatných uzloch nebude
vedieť nič)
- v triede Graph pribudne metóda areInOneGraph (Node, Node), ktorá vráti,
či sú uzly v rovnakom grafe (teda či na seba majú vplývať) - layoutovač sa
vždy spýta na toto a podľa toho sa rozhodne, či nastavovať sily

Skús nabudúce aj trochu podebugovať a zistiť zbežne, prečo sa to tak
správa, nie len napísať, že to nefunguje.

Jaroslav Prokop

unread,
Mar 27, 2011, 5:38:59 PM3/27/11
to tim16_2010
Podľa môjho názoru bude asi jednoduchšie riešenie zisťovať pri výpočte
síl, či sa dané dva vrcholy nachádzajú v rovnakom podgrafe, resp.
grafe.

Nachystal som pre teba na tento účel (do master branche) metódu v
triede Graph bool isInSameGraph(nodeA, nodeB). Len pre informáciu, ak
to niekto bude náhodou potrebovať, každý vrchol (Node) si pamätá
svojho nadradeného rodiča - nestedParent. Ak je na najvyššej úrovni,
je NULL.

Milan Laslop

unread,
Mar 28, 2011, 4:04:00 PM3/28/11
to tim16...@googlegroups.com
Pridal som do layoutovača to, aby na seba nepôsobili uzly z rôznych
grafov. Ak je jeden z nich meta, tak na seba pôsobia (lebo meta sú
globálne - nevzťahujú sa k nejakému podgrafu).
Reply all
Reply to author
Forward
0 new messages