2008/8/9 Hans Breuer <[EMAIL PROTECTED]>:
> Am 05.08.2008 21:22, Fred Morcos schrieb:
>>
>> Patch attached. Taken off revision 4102 from Dia's root dir using svn
>> diff.
>>
> Thanks for the patch. I have played with it a bit but am still not able to
> completely wrap my head around it. Here is what I think I have understood:
>
>  * Repulsion is calculated as a force between the current node and
>   every other node - be it connected or not.

Yep.

>  * Attraction is calculated only between the current and it's
>   directly connected nodes.

Yep.

>  * The calcualtion is done for every node in the graph and
>   applied instantly. During one loop the only state accumulated is
>   the overall graph energy.

Yep, I moved the netforce as a variable in the layout_force function
instead of being for every node.

>  * The above is repeated until a maximum number of iterations is reached
>   or the energy falls below a certain value.

Yep, at first I had only the energy part to terminate the algorithm
but while testing, with some combinations of graphs + distance/spacing
values the energy keeps oscillating between some values which turned
into an infinite loop. This should have improved by now (after some
changes) but I still kept the iterations limit just in case (put it
from 1000 to 10000).

>  * There is no state outside of the diagram (here: the modified object
>   positions) shared between different iterations
>

Could you come again please?

> The graph is constructed from the diagram('s selection) by translating (only
> connected) connection objects to edges and the other objects to nodes.
> The only additional parameters taken from the diagram are 'mass of node'
> (currently defined as Object::bounding_box area), their position and the
> distance between the nodes (currently defined as the distance between the
> Object::position).

Yep, so larger "objects" can push other objects around them further
and avoid overlapping.

>
> If the above summary is right the intermediate 'Graph' allocation is only
> needed for convenience and as a cache to avoid the recalculation of node
> masses.

Well not really. Everytime the function is called this 'Graph' is
reconstructed. We can have the Graph data structure static in the
function, and from app/autolayout-force.c we either pass an argument
(to have the function re-create the graph from the diagram or just use
the cached one).

> To verify my assumptions I have reimplemented the functionality as a PyDia
> plug-in, and indeed it gave the same result for everthing I have tested.
> I hope it is useful to illustrate the remaining open questions regarding
> Handle, ConnectionPoint an Object relation better than my previous attempts
> ;-)
>

I don't know Python and I couldn't really run the script...

>
> Your current patch adds the algorithm to lib/ and its dialog to app/. My gut
> feeling is both should be added together into a new plug-in/autolayout. The
> necessary glue code is attached. I only have integrated it with the
> win32/msvc build yet.
>

If you want it in Python you'll have to give me some time...

>
> There are also some formal aspects with your patch which need  to be
> addressed before it is ready for inclusion with Dia.
>
>  * please use tab-width 8 (apparently you used 4)

Done.

>  * the first file to include in every .c file is config.h

Done.

>  * prototypes only used in a single file should be declared locally
>   and static

Done.

>  * a function name in the implementation should start at the beginning
>   of a line, the return value is on it's own line

Done.

>  * every user-visble string needs to be marked for translation,
>   e.g. _(""Spacing:"")

You meant _("Spacing:") right?

>  * some variable naming looked strange to me, e.g. 'Graph diagram;'
>   IMHO this make the code unnecessary harder to understand.
>

Did what I could here...

>
> The undo thing and other things I've forgotten is left for another mail. I
> think this one is already long enough ;)
>
> Regards,
>        Hans
>

Well, I'll be really busy for the next 20 days with writing my thesis
report. I'm implementing another algorithm for force based layouting
(should be much faster and much more scalable)...

-- 
Fred Morcos
http://fredmorcos.blogspot.com/
http://fredmorcos.googlecode.com/
_______________________________________________
dia-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/dia-list
FAQ at http://live.gnome.org/Dia/Faq
Main page at http://live.gnome.org/Dia

Reply via email to