Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2018-03-06T00:42:39+01:00Les derniers messages parus sur le forum de Zeste de Savoir.C++ utilisation de furchterman directed force sur un graph, message #1750042018-03-06T00:42:39+01:00d3m0t3p/@d3m0t3phttps://zestedesavoir.com/forums/sujet/10322/c-utilisation-de-furchterman-directed-force-sur-un-graph/?page=1#p175004<p>Bon je suis arrivé à l’utiliser, les exemples m’ont bien aider ! </p>
<p>Pour les curieux :
Merci à tous, je passe le sujet en résolut <img alt=":-)" src="/static/smileys/smile.png"></p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="c1">//</span>
<span class="k">struct</span> <span class="n">PositionAndColor</span> <span class="p">{</span>
<span class="n">rectangle_topology</span><span class="o"><>::</span><span class="n">point_type</span> <span class="n">coo</span><span class="p">;</span>
<span class="n">sf</span><span class="o">::</span><span class="n">Color</span> <span class="n">color</span> <span class="o">=</span> <span class="n">sf</span><span class="o">::</span><span class="n">Color</span><span class="o">::</span><span class="n">White</span><span class="p">;</span> <span class="c1">//drawing with SFML</span>
<span class="p">};</span>
<span class="k">typedef</span> <span class="n">adjacency_list</span><span class="o"><</span><span class="n">vecS</span> <span class="p">,</span><span class="n">vecS</span><span class="p">,</span> <span class="n">undirectedS</span> <span class="p">,</span> <span class="n">PositionAndColor</span> <span class="o">></span> <span class="n">Graph</span><span class="p">;</span>
<span class="k">typedef</span> <span class="n">boost</span><span class="o">::</span><span class="n">rectangle_topology</span><span class="o"><></span> <span class="n">topology_type</span><span class="p">;</span>
<span class="k">typedef</span> <span class="n">topology_type</span><span class="o">::</span><span class="n">point_type</span> <span class="n">point_type</span><span class="p">;</span>
<span class="k">class</span> <span class="nc">progress_cooling</span> <span class="o">:</span> <span class="k">public</span> <span class="n">linear_cooling</span><span class="o"><</span><span class="kt">double</span><span class="o">></span>
<span class="p">{</span>
<span class="k">typedef</span> <span class="n">linear_cooling</span><span class="o"><</span><span class="kt">double</span><span class="o">></span> <span class="n">inherited</span><span class="p">;</span>
<span class="k">public</span><span class="o">:</span>
<span class="k">explicit</span> <span class="n">progress_cooling</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="kt">size_t</span> <span class="n">iterations</span><span class="p">)</span> <span class="o">:</span> <span class="n">inherited</span><span class="p">(</span><span class="n">iterations</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">display</span><span class="p">.</span><span class="n">reset</span><span class="p">(</span><span class="k">new</span> <span class="n">progress_display</span><span class="p">(</span><span class="n">iterations</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">cerr</span><span class="p">));</span> <span class="c1">//console display progressionBar (useless)</span>
<span class="p">}</span>
<span class="kt">double</span> <span class="k">operator</span><span class="p">()()</span>
<span class="p">{</span>
<span class="o">++</span><span class="p">(</span><span class="o">*</span><span class="n">display</span><span class="p">);</span>
<span class="k">return</span> <span class="n">inherited</span><span class="o">::</span><span class="k">operator</span><span class="p">()();</span>
<span class="p">}</span>
<span class="k">private</span><span class="o">:</span>
<span class="n">shared_ptr</span><span class="o"><</span><span class="n">boost</span><span class="o">::</span><span class="n">progress_display</span><span class="o">></span> <span class="n">display</span><span class="p">;</span>
<span class="p">};</span>
<span class="kt">void</span> <span class="nf">show_vertex_property</span><span class="p">(</span><span class="k">const</span> <span class="n">Graph</span><span class="o">&</span> <span class="n">g</span><span class="p">){</span>
<span class="kt">int</span> <span class="n">nbVertices</span> <span class="o">=</span> <span class="n">num_vertices</span><span class="p">(</span><span class="n">g</span><span class="p">);</span>
<span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o"><</span> <span class="n">nbVertices</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o"><<</span> <span class="n">i</span> <span class="o"><<</span><span class="s">" :"</span> <span class="o"><<</span><span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">coo</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o"><<</span> <span class="sc">'/'</span> <span class="o"><<</span> <span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">coo</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o"><<</span><span class="sc">'\n'</span> <span class="p">;</span>
<span class="p">}</span>
<span class="kt">void</span> <span class="nf">execute_fruchterman</span><span class="p">(</span><span class="k">const</span> <span class="kt">double</span> <span class="n">w</span><span class="p">,</span><span class="k">const</span> <span class="kt">double</span> <span class="n">h</span><span class="p">,</span><span class="n">Graph</span> <span class="o">&</span> <span class="n">g</span><span class="p">,</span> <span class="k">const</span> <span class="kt">size_t</span> <span class="n">iterations</span> <span class="o">=</span> <span class="mi">1000</span><span class="p">){</span>
<span class="n">minstd_rand</span> <span class="n">gen</span><span class="p">;</span>
<span class="n">topology_type</span> <span class="n">topo</span><span class="p">(</span><span class="n">gen</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">);</span>
<span class="n">random_graph_layout</span><span class="p">(</span><span class="n">g</span><span class="p">,</span> <span class="n">get</span><span class="p">(</span><span class="o">&</span><span class="n">PositionAndColor</span><span class="o">::</span><span class="n">coo</span><span class="p">,</span> <span class="n">g</span><span class="p">),</span> <span class="n">topo</span><span class="p">);</span>
<span class="n">fruchterman_reingold_force_directed_layout</span><span class="p">(</span><span class="n">g</span><span class="p">,</span> <span class="n">get</span><span class="p">(</span><span class="o">&</span><span class="n">PositionAndColor</span><span class="o">::</span><span class="n">coo</span><span class="p">,</span> <span class="n">g</span><span class="p">),</span> <span class="n">topo</span><span class="p">,</span> <span class="n">cooling</span><span class="p">(</span><span class="n">progress_cooling</span><span class="p">(</span><span class="n">iterations</span><span class="p">)));</span>
<span class="p">}</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span>
<span class="p">{</span>
<span class="k">const</span> <span class="kt">double</span> <span class="n">w</span> <span class="o">=</span> <span class="mi">800</span><span class="p">;</span>
<span class="k">const</span> <span class="kt">double</span> <span class="n">h</span> <span class="o">=</span> <span class="mi">600</span><span class="p">;</span>
<span class="n">Graph</span> <span class="n">g</span><span class="p">;</span>
<span class="k">for</span> <span class="p">(</span><span class="kt">size_t</span> <span class="n">i</span> <span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o"><</span> <span class="mi">10</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">){</span>
<span class="n">add_edge</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="n">i</span><span class="p">,</span><span class="n">g</span><span class="p">);</span>
<span class="p">}</span>
<span class="n">execute_fruchterman</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">g</span><span class="p">);</span>
<span class="c1">//SFML part</span>
<span class="k">return</span> <span class="n">EXIT_SUCCESS</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</td></tr></table></div>C++ utilisation de furchterman directed force sur un graph, message #1743422018-02-24T00:29:12+01:00AmarOk/@AmarOkhttps://zestedesavoir.com/forums/sujet/10322/c-utilisation-de-furchterman-directed-force-sur-un-graph/?page=1#p174342<p>En parlant d’exemple quand celui du site suffit pas, perso je me permet de regarder les quelques exemples qu’on trouve sur <a href="https://github.com/search?l=C%2B%2B&q=fruchterman_reingold_force_directed_layout&type=Code&utf8=%E2%9C%93">github</a> des fois ça aide.</p>C++ utilisation de furchterman directed force sur un graph, message #1743262018-02-23T18:49:21+01:00d3m0t3p/@d3m0t3phttps://zestedesavoir.com/forums/sujet/10322/c-utilisation-de-furchterman-directed-force-sur-un-graph/?page=1#p174326<p>Je l’avais pas vu, je l’étudie ce soir quand j’ai accès à un ordi et je reviens vers vous<br>
Merci <img alt=":-)" src="/static/smileys/smile.png"></p>C++ utilisation de furchterman directed force sur un graph, message #1743202018-02-23T17:47:45+01:00Davidbrcz/@Davidbrczhttps://zestedesavoir.com/forums/sujet/10322/c-utilisation-de-furchterman-directed-force-sur-un-graph/?page=1#p174320<p>J’y connais pas grand chose dans BGL et encore moins dans l’algo que tu cherches à utiliser mais tu as regardé <a href="http://www.boost.org/doc/libs/1_66_0/libs/graph/example/fr_layout.cpp">l’exemple </a> ? Il est volumineux mais la partie vraiment utile (manipulation de graphe) ne commence que dans le dernier quart.</p>C++ utilisation de furchterman directed force sur un graph, message #1743172018-02-23T16:55:46+01:00d3m0t3p/@d3m0t3phttps://zestedesavoir.com/forums/sujet/10322/c-utilisation-de-furchterman-directed-force-sur-un-graph/?page=1#p174317<p>Salut,<br>
je cherche a utiliser la fonction <kbd><a href="http://www.boost.org/doc/libs/1_66_0/libs/graph/doc/fruchterman_reingold.html">fruchterman_reingold_force_directed_layout</a></kbd> de la BGL</p>
<p>Mais je suis un peu perdu, je ne sais pas quel version de la fonction utilisé (elle est surchargée) et je suis perdu avec ses paramètres.</p>
<p>Voila ce que j’ai fait:</p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="k">struct</span> <span class="n">vertex_coo_t</span> <span class="p">{</span>
<span class="c1">//2 is because we are in 2D and point type 'cause fruchterman expect ::point_type in the property</span>
<span class="n">convex_topology</span><span class="o"><</span><span class="mi">2</span><span class="o">>::</span><span class="n">point_type</span> <span class="n">position</span><span class="p">;</span>
<span class="c1">//correct topology ?</span>
<span class="p">};</span>
<span class="p">...</span>
<span class="k">typedef</span> <span class="n">adjacency_list</span><span class="o"><</span><span class="n">vecS</span> <span class="p">,</span><span class="n">vecS</span><span class="p">,</span> <span class="n">undirectedS</span><span class="p">,</span> <span class="n">vertex_coo_t</span><span class="o">></span> <span class="n">Graph</span><span class="p">;</span>
<span class="p">...</span>
<span class="n">Graph</span> <span class="n">g</span><span class="p">;</span>
<span class="n">add_edge</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">g</span><span class="p">);</span>
<span class="n">add_edge</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="n">g</span><span class="p">);</span>
<span class="n">add_edge</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="n">g</span><span class="p">);</span>
<span class="n">add_edge</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="n">g</span><span class="p">);</span>
<span class="k">auto</span> <span class="n">propertyMap</span> <span class="o">=</span> <span class="n">get</span><span class="p">(</span><span class="n">vertex_coo_t</span><span class="p">,</span> <span class="n">g</span><span class="p">);</span> <span class="c1">//no matching function</span>
<span class="k">auto</span> <span class="n">topo</span> <span class="o">=</span> <span class="n">square_topology</span><span class="o"><></span><span class="p">(</span><span class="mf">600.f</span><span class="p">);</span>
<span class="n">fruchterman_reingold_force_directed_layout</span><span class="p">(</span><span class="n">g</span><span class="p">,</span> <span class="n">propMap</span><span class="p">,</span> <span class="n">topo</span><span class="p">);</span>
</pre></div>
</td></tr></table></div>
<p>Je n’arrive pas à utiliser get pour recevoir ma propertyMap et l’utiliser dans la fonction fruchterman.</p>
<p>Pourtant mon appel respecte la documentation (je crois):<br>
<kbd>property_map<adjacency_list, PropertyTag>::type get(PropertyTag, adjacency_list& g)</kbd> </p>
<p><em>Returns the property map object for the vertex property specified by PropertyTag. The PropertyTag must match one of the properties specified in the graph’s VertexProperty template argument.</em></p>
<p>Mes questions sont : </p>
<ol>
<li>Ma structure vertex_coo_t est-elle correctement utilisé ?</li>
<li>Pourquoi mon appel à <kbd>get</kbd> ne correspond à aucune surcharge ?</li>
<li>Ma structure doit avoir une valeur de type point_type<sup id="fnref-note"><a class="footnote-ref" href="#fn-note">1</a></sup> mais convex_topology<2> est correcte ou il faudrait utiliser qqch d’autre.</li>
<li>La surcharge de fruchterman que j’utilise est correcte ou il en faut une autre pour atteindre mon but ?</li>
</ol>
<p>Je veux avoir les positions de mes vertices aléatoires avant l’appel et positionés selon la force d’attraction/repulsion après l’appel à la fonction. Problème, le paramètre graph est constant et propertyMap n’est pas une référence et n’est donc pas modifié. de plus la fonction ne retourne rien, donc je ne sais pas ou trouver le résultat (les positions de mes vertices dirigé selon les forces : force-directed)</p>
<p>Merci d’avance pour toute aide <img alt=";-)" src="/static/smileys/clin.png"></p>
<div class="footnote">
<hr>
<ol>
<li id="fn-note">
<p><em>The property map that stores the position of each vertex. It should typically be initialized with the vertices at random locations (use random_graph_layout). The type PositionMap must be a model of Lvalue Property Map such that the vertex descriptor type of Graph is convertible to its key type. Its value type must be Topology::point_type, representing the coordinates of the vertex.</em> <a class="footnote-backref" href="#fnref-note" title="Retourner au texte de la note 1">↩</a></p>
</li>
</ol>
</div>