{
    "componentChunkName": "component---src-templates-blog-post-jsx",
    "path": "/post/force-directed-algorithm-with-html5-canvas/",
    "result": {"data":{"site":{"siteMetadata":{"title":"WEB EGG","author":"Leko - CTO at Yuimedi"}},"markdownRemark":{"id":"2b81b928-093f-54c0-8034-09f5d294d095","excerpt":"こんにちは。 今回は、力学モデル (グラフ描画アルゴリズム) – Wikipediaというグラフを描画するための面白いアルゴリズムを見つけたので、 こいつをJavaScript(CoffeeScript)とcanvas…","html":"<p>こんにちは。<br>\n今回は、<a href=\"http://ja.wikipedia.org/wiki/%E5%8A%9B%E5%AD%A6%E3%83%A2%E3%83%87%E3%83%AB_(%E3%82%B0%E3%83%A9%E3%83%95%E6%8F%8F%E7%94%BB%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0)\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">力学モデル (グラフ描画アルゴリズム) – Wikipedia</a>というグラフを描画するための面白いアルゴリズムを見つけたので、<br>\nこいつをJavaScript(CoffeeScript)とcanvasで実装してみました。</p>\n<!--more-->\n<h2 id=\"動作デモ\" style=\"position:relative;\"><a href=\"#%E5%8B%95%E4%BD%9C%E3%83%87%E3%83%A2\" aria-label=\"動作デモ permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>動作デモ</h2>\n<p>まずはこちらを御覧ください。</p>\n<script type=\"text/javascript\" src=\"https://jsdo.it/blogparts/e6jI/js\"></script>\n<p>５つの丸が、ふわふわ動いてバランス良い配置になると思います。</p>\n<h2 id=\"用語の整理\" style=\"position:relative;\"><a href=\"#%E7%94%A8%E8%AA%9E%E3%81%AE%E6%95%B4%E7%90%86\" aria-label=\"用語の整理 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>用語の整理</h2>\n<p>まず、グラフとは、<strong>折れ線グラフ</strong>や<strong>円グラフ</strong>のようなものではありません。<br>\n頂点と辺の集合で構成されている方のグラフです。</p>\n<blockquote>\n<p><a href=\"http://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%A9%E3%83%95%E7%90%86%E8%AB%96\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">グラフ理論 – Wikipedia</a></p>\n</blockquote>\n<p><strong>グラフ</strong>とは、↑のグラフのことで、<br>\nグラフの頂点のことを<strong>ノード</strong><br>\nノードの点と点を繋ぐ辺を<strong>エッジ</strong>と呼びます。</p>\n<h2 id=\"基本的な理論のおさらい\" style=\"position:relative;\"><a href=\"#%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AA%E7%90%86%E8%AB%96%E3%81%AE%E3%81%8A%E3%81%95%E3%82%89%E3%81%84\" aria-label=\"基本的な理論のおさらい permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>基本的な理論のおさらい</h2>\n<p>力学モデルのWikiに書いてある通りですが、少し噛み砕いてみます。</p>\n<p>まず、ノードの座標決定には<br>\n**<a href=\"http://www.mag2.com/sample/P0005602/html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">クーロンの法則</a><strong>と</strong><a href=\"http://www.wakariyasui.sakura.ne.jp/3-2-0-0/3-2-2-1dannseiryoku.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">フックの法則</a>**という法則が絡んできます。</p>\n<p>どちらの法則も、<br>\n要は<strong>ノード同士が引き合う/反発する力は徐々に安定へ収束</strong>するというだけです。</p>\n<p>この２つの法則を元に各ノード同士に働く力を計算し、<br>\nその力を元に座標を決定します。</p>\n<h2 id=\"ノードの実装\" style=\"position:relative;\"><a href=\"#%E3%83%8E%E3%83%BC%E3%83%89%E3%81%AE%E5%AE%9F%E8%A3%85\" aria-label=\"ノードの実装 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>ノードの実装</h2>\n<p>早速実装に移ります。<br>\nコードはCoffeeScriptで書きます。</p>\n<p>まず、ノードに最低限必要な物は、<br>\n<code>x座標</code>, <code>y座標</code>, <code>半径</code>, <code>x方向の速度</code>, <code>y方向の速度</code>の５つです。</p>\n<div class=\"gatsby-highlight\" data-language=\"coffeescript\"><pre class=\"language-coffeescript\"><code class=\"language-coffeescript\"><span class=\"token comment\"># 文字とつながりを持った点</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">Node</span>\n    <span class=\"token property\">constructor</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span><span class=\"token class-member variable\">@x</span><span class=\"token punctuation\">,</span> <span class=\"token class-member variable\">@y</span><span class=\"token punctuation\">,</span> <span class=\"token class-member variable\">@r</span> <span class=\"token operator\">=</span> <span class=\"token number\">20</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span>\n        <span class=\"token class-member variable\">@vx</span> <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n        <span class=\"token class-member variable\">@vy</span> <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n\n    <span class=\"token property\">connect</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span>node<span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span>\n        <span class=\"token class-member variable\">@connections</span><span class=\"token punctuation\">.</span>push node</code></pre></div>\n<p>ごくシンプル。</p>\n<p>今回はそれに加えて、</p>\n<ul>\n<li>各ノードに固有のIDを持たせたい</li>\n<li>中にテキストを表示したい</li>\n<li>ランダムに背景色をつけたい</li>\n<li>ノード同士の接続情報をグラフではなくノード同士に持たせたい</li>\n</ul>\n<p>ということで最終的に以下のような定義になりました。</p>\n<div class=\"gatsby-highlight\" data-language=\"coffeescript\"><pre class=\"language-coffeescript\"><code class=\"language-coffeescript\"><span class=\"token comment\"># 文字とつながりを持った点</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">Node</span>\n    <span class=\"token class-member variable\">@_lastID</span> <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n    colorPalette <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'#556270'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'#4ECDC4'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'#C7F464'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'#FF6B6B'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'#C44D58'</span><span class=\"token punctuation\">]</span>\n\n    <span class=\"token property\">constructor</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span><span class=\"token class-member variable\">@value</span><span class=\"token punctuation\">,</span> <span class=\"token class-member variable\">@x</span><span class=\"token punctuation\">,</span> <span class=\"token class-member variable\">@y</span><span class=\"token punctuation\">,</span> <span class=\"token class-member variable\">@background</span><span class=\"token punctuation\">,</span> <span class=\"token class-member variable\">@r</span> <span class=\"token operator\">=</span> <span class=\"token number\">20</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span>\n        <span class=\"token class-member variable\">@id</span> <span class=\"token operator\">=</span> Node<span class=\"token punctuation\">.</span>_lastID<span class=\"token operator\">++</span>\n        <span class=\"token class-member variable\">@connections</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n        <span class=\"token class-member variable\">@vx</span> <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n        <span class=\"token class-member variable\">@vy</span> <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n\n        idx <span class=\"token operator\">=</span> <span class=\"token operator\">~</span><span class=\"token operator\">~</span><span class=\"token punctuation\">(</span>Math<span class=\"token punctuation\">.</span><span class=\"token function\">random</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> colorPalette<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span>\n        <span class=\"token class-member variable\">@background</span> <span class=\"token operator\">=</span> colorPalette<span class=\"token punctuation\">[</span>idx<span class=\"token punctuation\">]</span> <span class=\"token keyword\">unless</span> <span class=\"token class-member variable\">@background</span>\n\n    <span class=\"token property\">connect</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span>node<span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span>\n        <span class=\"token class-member variable\">@connections</span><span class=\"token punctuation\">.</span>push node</code></pre></div>\n<h2 id=\"グラフの実装\" style=\"position:relative;\"><a href=\"#%E3%82%B0%E3%83%A9%E3%83%95%E3%81%AE%E5%AE%9F%E8%A3%85\" aria-label=\"グラフの実装 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>グラフの実装</h2>\n<p>今回のキモ、力指向グラフです。<br>\n<code>balance</code>メソッドが、このグラフに属する各ノードの位置を計算します。</p>\n<div class=\"gatsby-highlight\" data-language=\"coffeescript\"><pre class=\"language-coffeescript\"><code class=\"language-coffeescript\"><span class=\"token comment\"># 力指向アルゴリズム</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">ForceDirectedGraph</span>\n    <span class=\"token comment\"># バネ定数: 大きいとノードの間隔が詰まる、クーロン数：大きいとノードの間隔が広がる</span>\n    @<span class=\"token constant\">BOUNCE</span> <span class=\"token operator\">=</span> <span class=\"token number\">0.1</span>         <span class=\"token comment\"># バネ定数(BOUNCE &lt; 0.1[推奨])</span>\n    @<span class=\"token constant\">ATTENUATION</span> <span class=\"token operator\">=</span> <span class=\"token number\">0.8</span>    <span class=\"token comment\"># 減衰定数(ATTENUATION &lt; 1[必須])</span>\n    @<span class=\"token constant\">COULOMB</span> <span class=\"token operator\">=</span> <span class=\"token number\">600</span>        <span class=\"token comment\"># クーロン数</span>\n\n    <span class=\"token property\">constructor</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span><span class=\"token class-member variable\">@nodes</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span>\n\n    <span class=\"token property\">add</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span>node<span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span>\n        <span class=\"token class-member variable\">@nodes</span><span class=\"token punctuation\">.</span>push node\n\n    <span class=\"token property\">connect</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span>a<span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span>\n        <span class=\"token class-member variable\">@nodes</span><span class=\"token punctuation\">[</span>a<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span><span class=\"token function\">connect</span><span class=\"token punctuation\">(</span><span class=\"token class-member variable\">@nodes</span><span class=\"token punctuation\">[</span>b<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n        <span class=\"token class-member variable\">@nodes</span><span class=\"token punctuation\">[</span>b<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span><span class=\"token function\">connect</span><span class=\"token punctuation\">(</span><span class=\"token class-member variable\">@nodes</span><span class=\"token punctuation\">[</span>a<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token property\">balance</span><span class=\"token operator\">:</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span>\n        <span class=\"token keyword\">for</span> targetNode <span class=\"token keyword\">in</span> <span class=\"token class-member variable\">@nodes</span>\n            <span class=\"token keyword\">continue</span> <span class=\"token keyword\">if</span> targetNode<span class=\"token punctuation\">.</span>isFocus\n\n            <span class=\"token comment\"># このノードに作用する力</span>\n            fx <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n            fy <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n\n            <span class=\"token comment\"># 自分以外全てのノードから受ける力をクーロンの法則を用いて計算</span>\n            <span class=\"token keyword\">for</span> n <span class=\"token keyword\">in</span> <span class=\"token class-member variable\">@nodes</span>\n                <span class=\"token keyword\">continue</span> <span class=\"token keyword\">if</span> targetNode <span class=\"token operator\">==</span> n\n\n                distX <span class=\"token operator\">=</span> targetNode<span class=\"token punctuation\">.</span>x <span class=\"token operator\">-</span> n<span class=\"token punctuation\">.</span>x\n                distY <span class=\"token operator\">=</span> targetNode<span class=\"token punctuation\">.</span>y <span class=\"token operator\">-</span> n<span class=\"token punctuation\">.</span>y\n                rsq <span class=\"token operator\">=</span> distX <span class=\"token operator\">*</span> distX <span class=\"token operator\">+</span> distY <span class=\"token operator\">*</span> distY\n\n                fx <span class=\"token operator\">+=</span> ForceDirectedGraph<span class=\"token punctuation\">.</span><span class=\"token constant\">COULOMB</span> <span class=\"token operator\">*</span> distX <span class=\"token operator\">/</span> rsq\n                fy <span class=\"token operator\">+=</span> ForceDirectedGraph<span class=\"token punctuation\">.</span><span class=\"token constant\">COULOMB</span> <span class=\"token operator\">*</span> distY <span class=\"token operator\">/</span> rsq\n\n            <span class=\"token comment\"># 接続したノードから受けるバネのちからをフックの法則を用いて計算</span>\n            <span class=\"token keyword\">for</span> n <span class=\"token keyword\">in</span> targetNode<span class=\"token punctuation\">.</span>connections\n                distX <span class=\"token operator\">=</span> n<span class=\"token punctuation\">.</span>x <span class=\"token operator\">-</span> targetNode<span class=\"token punctuation\">.</span>x\n                distY <span class=\"token operator\">=</span> n<span class=\"token punctuation\">.</span>y <span class=\"token operator\">-</span> targetNode<span class=\"token punctuation\">.</span>y\n\n                fx <span class=\"token operator\">+=</span> ForceDirectedGraph<span class=\"token punctuation\">.</span><span class=\"token constant\">BOUNCE</span> <span class=\"token operator\">*</span> distX\n                fy <span class=\"token operator\">+=</span> ForceDirectedGraph<span class=\"token punctuation\">.</span><span class=\"token constant\">BOUNCE</span> <span class=\"token operator\">*</span> distY\n\n            <span class=\"token comment\"># 収束させるため速度を減衰</span>\n            targetNode<span class=\"token punctuation\">.</span>vx <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>targetNode<span class=\"token punctuation\">.</span>vx <span class=\"token operator\">+</span> fx<span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> ForceDirectedGraph<span class=\"token punctuation\">.</span><span class=\"token constant\">ATTENUATION</span>\n            targetNode<span class=\"token punctuation\">.</span>vy <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>targetNode<span class=\"token punctuation\">.</span>vy <span class=\"token operator\">+</span> fy<span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> ForceDirectedGraph<span class=\"token punctuation\">.</span><span class=\"token constant\">ATTENUATION</span>\n\n            <span class=\"token comment\"># xy座標の決定</span>\n            targetNode<span class=\"token punctuation\">.</span>x <span class=\"token operator\">+=</span> targetNode<span class=\"token punctuation\">.</span>vx\n            targetNode<span class=\"token punctuation\">.</span>y <span class=\"token operator\">+=</span> targetNode<span class=\"token punctuation\">.</span>vy</code></pre></div>\n<p>Wikiに書いてある擬似コード、ほぼそのままだと思います。</p>\n<h2 id=\"canvasユーティリティの作成\" style=\"position:relative;\"><a href=\"#canvas%E3%83%A6%E3%83%BC%E3%83%86%E3%82%A3%E3%83%AA%E3%83%86%E3%82%A3%E3%81%AE%E4%BD%9C%E6%88%90\" aria-label=\"canvasユーティリティの作成 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Canvasユーティリティの作成</h2>\n<p>今回はcanvasで実装するので、さくっとcanvasのユーティリティを作ります。</p>\n<div class=\"gatsby-highlight\" data-language=\"coffeescript\"><pre class=\"language-coffeescript\"><code class=\"language-coffeescript\"><span class=\"token comment\"># canvasのユーティリティ</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">Canvas</span>\n    <span class=\"token property\">constructor</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span>el<span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span>\n        <span class=\"token class-member variable\">@ctx</span> <span class=\"token operator\">=</span> el<span class=\"token punctuation\">.</span><span class=\"token function\">getContext</span><span class=\"token punctuation\">(</span><span class=\"token string\">'2d'</span><span class=\"token punctuation\">)</span>\n        <span class=\"token class-member variable\">@width</span> <span class=\"token operator\">=</span> el<span class=\"token punctuation\">.</span>width\n        <span class=\"token class-member variable\">@height</span> <span class=\"token operator\">=</span> el<span class=\"token punctuation\">.</span>height\n        <span class=\"token class-member variable\">@elements</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n\n    <span class=\"token comment\"># 描画する要素(今回は主にグラフ)を追加する</span>\n    <span class=\"token property\">add</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span>element<span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span>\n        <span class=\"token class-member variable\">@elements</span><span class=\"token punctuation\">.</span>push element\n        <span class=\"token keyword\">return</span> @\n\n    <span class=\"token comment\"># キャンバスの状態を保ちつつ操作を行う</span>\n    <span class=\"token property\">keep</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span>fn<span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span>\n        <span class=\"token class-member variable\">@ctx</span><span class=\"token punctuation\">.</span><span class=\"token function\">save</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        <span class=\"token class-member variable\">@ctx</span><span class=\"token punctuation\">.</span><span class=\"token function\">beginPath</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        <span class=\"token function\">fn</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        <span class=\"token class-member variable\">@ctx</span><span class=\"token punctuation\">.</span><span class=\"token function\">closePath</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        <span class=\"token class-member variable\">@ctx</span><span class=\"token punctuation\">.</span><span class=\"token function\">restore</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token comment\"># キャンバスをまっさらにする</span>\n    <span class=\"token property\">clear</span><span class=\"token operator\">:</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span>\n        <span class=\"token class-member variable\">@ctx</span><span class=\"token punctuation\">.</span><span class=\"token function\">clearRect</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token class-member variable\">@width</span><span class=\"token punctuation\">,</span> <span class=\"token class-member variable\">@height</span><span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">return</span> @\n\n    <span class=\"token comment\"># キャンバスを塗りつぶす</span>\n    <span class=\"token property\">fill</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span>bg <span class=\"token operator\">=</span> <span class=\"token string\">'#000'</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span>\n        @<span class=\"token parameter\">keep</span> <span class=\"token operator\">=></span>\n            <span class=\"token class-member variable\">@ctx</span><span class=\"token punctuation\">.</span>fillStyle <span class=\"token operator\">=</span> bg\n            <span class=\"token class-member variable\">@ctx</span><span class=\"token punctuation\">.</span><span class=\"token function\">fillRect</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token class-member variable\">@width</span><span class=\"token punctuation\">,</span> <span class=\"token class-member variable\">@height</span><span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">return</span> @\n\n    <span class=\"token comment\"># 円の描画</span>\n    <span class=\"token property\">circle</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">,</span> r<span class=\"token punctuation\">,</span> bg <span class=\"token operator\">=</span> <span class=\"token string\">'#000'</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span>\n        @<span class=\"token parameter\">keep</span> <span class=\"token operator\">=></span>\n            <span class=\"token class-member variable\">@ctx</span><span class=\"token punctuation\">.</span>fillStyle <span class=\"token operator\">=</span> bg\n            <span class=\"token class-member variable\">@ctx</span><span class=\"token punctuation\">.</span><span class=\"token function\">arc</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">,</span> r<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span> <span class=\"token operator\">*</span> Math<span class=\"token punctuation\">.</span><span class=\"token constant\">PI</span><span class=\"token punctuation\">)</span>\n            <span class=\"token class-member variable\">@ctx</span><span class=\"token punctuation\">.</span><span class=\"token function\">fill</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token comment\"># 線分の描画</span>\n    <span class=\"token property\">line</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span>fromX<span class=\"token punctuation\">,</span> fromY<span class=\"token punctuation\">,</span> toX<span class=\"token punctuation\">,</span> toY<span class=\"token punctuation\">,</span> color <span class=\"token operator\">=</span> <span class=\"token string\">'#444'</span><span class=\"token punctuation\">,</span> width <span class=\"token operator\">=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span>\n        @<span class=\"token parameter\">keep</span> <span class=\"token operator\">=></span>\n            <span class=\"token class-member variable\">@ctx</span><span class=\"token punctuation\">.</span>strokeStyle <span class=\"token operator\">=</span> color\n            <span class=\"token class-member variable\">@ctx</span><span class=\"token punctuation\">.</span>strokeWidth <span class=\"token operator\">=</span> width\n\n            <span class=\"token class-member variable\">@ctx</span><span class=\"token punctuation\">.</span><span class=\"token function\">moveTo</span><span class=\"token punctuation\">(</span>fromX<span class=\"token punctuation\">,</span> fromY<span class=\"token punctuation\">)</span>\n            <span class=\"token class-member variable\">@ctx</span><span class=\"token punctuation\">.</span><span class=\"token function\">lineTo</span><span class=\"token punctuation\">(</span>toX<span class=\"token punctuation\">,</span> toY<span class=\"token punctuation\">)</span>\n            <span class=\"token class-member variable\">@ctx</span><span class=\"token punctuation\">.</span><span class=\"token function\">stroke</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token comment\"># テキストを描画</span>\n    <span class=\"token property\">text</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span>txt<span class=\"token punctuation\">,</span> x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">,</span> color <span class=\"token operator\">=</span> <span class=\"token string\">'white'</span><span class=\"token punctuation\">,</span> font <span class=\"token operator\">=</span> <span class=\"token string\">'14px bold'</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span>\n        @<span class=\"token parameter\">keep</span> <span class=\"token operator\">=></span>\n            <span class=\"token class-member variable\">@ctx</span><span class=\"token punctuation\">.</span>font <span class=\"token operator\">=</span> font\n            <span class=\"token class-member variable\">@ctx</span><span class=\"token punctuation\">.</span>textAlign <span class=\"token operator\">=</span> <span class=\"token string\">'center'</span>\n            <span class=\"token class-member variable\">@ctx</span><span class=\"token punctuation\">.</span>textBaseline <span class=\"token operator\">=</span> <span class=\"token string\">'middle'</span>\n            <span class=\"token class-member variable\">@ctx</span><span class=\"token punctuation\">.</span>fillStyle <span class=\"token operator\">=</span> color\n            <span class=\"token class-member variable\">@ctx</span><span class=\"token punctuation\">.</span><span class=\"token function\">fillText</span><span class=\"token punctuation\">(</span>txt<span class=\"token punctuation\">,</span> x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">)</span>\n\n    <span class=\"token comment\"># 追加した要素を描画</span>\n    <span class=\"token property\">draw</span><span class=\"token operator\">:</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span>\n        <span class=\"token keyword\">for</span> el <span class=\"token keyword\">in</span> <span class=\"token class-member variable\">@elements</span>\n            <span class=\"token keyword\">if</span> el<span class=\"token punctuation\">.</span>constructor <span class=\"token operator\">==</span> ForceDirectedGraph\n                @<span class=\"token function\">_drawGraph</span><span class=\"token punctuation\">(</span>el<span class=\"token punctuation\">)</span>\n\n    <span class=\"token comment\"># グラフを描画</span>\n    <span class=\"token property\">_drawGraph</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span>graph<span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span>\n        connected <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n        <span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token punctuation\">[</span><span class=\"token number\">0.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span>graph<span class=\"token punctuation\">.</span>nodes<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">]</span>\n            connected<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n\n        <span class=\"token keyword\">for</span> node<span class=\"token punctuation\">,</span> i <span class=\"token keyword\">in</span> graph<span class=\"token punctuation\">.</span>nodes\n            <span class=\"token keyword\">for</span> n<span class=\"token punctuation\">,</span> j <span class=\"token keyword\">in</span> node<span class=\"token punctuation\">.</span>connections\n                <span class=\"token keyword\">continue</span> <span class=\"token keyword\">if</span> connected<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">||</span> connected<span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span>\n\n                connected<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">true</span>\n                connected<span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">true</span>\n                @<span class=\"token function\">line</span><span class=\"token punctuation\">(</span>node<span class=\"token punctuation\">.</span>x<span class=\"token punctuation\">,</span> node<span class=\"token punctuation\">.</span>y<span class=\"token punctuation\">,</span> n<span class=\"token punctuation\">.</span>x<span class=\"token punctuation\">,</span> n<span class=\"token punctuation\">.</span>y<span class=\"token punctuation\">)</span>\n\n        <span class=\"token keyword\">for</span> node <span class=\"token keyword\">in</span> graph<span class=\"token punctuation\">.</span>nodes\n            @<span class=\"token function\">circle</span><span class=\"token punctuation\">(</span>node<span class=\"token punctuation\">.</span>x<span class=\"token punctuation\">,</span> node<span class=\"token punctuation\">.</span>y<span class=\"token punctuation\">,</span> node<span class=\"token punctuation\">.</span>r<span class=\"token punctuation\">,</span> node<span class=\"token punctuation\">.</span>background<span class=\"token punctuation\">)</span>\n            @<span class=\"token function\">text</span><span class=\"token punctuation\">(</span>node<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">,</span> node<span class=\"token punctuation\">.</span>x<span class=\"token punctuation\">,</span> node<span class=\"token punctuation\">.</span>y<span class=\"token punctuation\">)</span></code></pre></div>\n<p><code>_drawGraph()</code>では、</p>\n<ol>\n<li>接続されているノード同士を全て線分で繋ぐ</li>\n<li>各ノードの背景を描画し、テキストを入れる</li>\n</ol>\n<p>ということを行っています。</p>\n<h2 id=\"初期化処理\" style=\"position:relative;\"><a href=\"#%E5%88%9D%E6%9C%9F%E5%8C%96%E5%87%A6%E7%90%86\" aria-label=\"初期化処理 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>初期化処理</h2>\n<p>↑の３つだけではクラス定義でしかないので、初期化します。</p>\n<p>最初の方はあまり意味がなく、canvasのサイズ調整をしているだけです。</p>\n<p>いくつかノードを生成して、<br>\nそのノードのインデックスを渡して接続します。</p>\n<p>そして、そのグラフのインスタンスをcanvasにadd（↑のCanvasクラスを参照）して、<br>\n50ミリ秒ごとに再描画をかけています。</p>\n<div class=\"gatsby-highlight\" data-language=\"coffeescript\"><pre class=\"language-coffeescript\"><code class=\"language-coffeescript\"><span class=\"token comment\"># init</span>\n<span class=\"token keyword\">do</span> <span class=\"token punctuation\">(</span>$ <span class=\"token operator\">=</span> jQuery<span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span>\n    random <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>max<span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">~</span><span class=\"token operator\">~</span><span class=\"token punctuation\">(</span>Math<span class=\"token punctuation\">.</span><span class=\"token function\">random</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> max<span class=\"token punctuation\">)</span>\n\n    <span class=\"token constant\">WIN_W</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">window</span><span class=\"token punctuation\">.</span>innerWidth\n    <span class=\"token constant\">WIN_H</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">window</span><span class=\"token punctuation\">.</span>innerHeight\n\n    $canvas <span class=\"token operator\">=</span> <span class=\"token function\">$</span><span class=\"token punctuation\">(</span><span class=\"token string\">'#canvas'</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token comment\"># canvasの初期化</span>\n    $canvas<span class=\"token punctuation\">.</span><span class=\"token function\">attr</span><span class=\"token punctuation\">(</span><span class=\"token string\">'width'</span><span class=\"token operator\">:</span> <span class=\"token constant\">WIN_W</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'height'</span><span class=\"token operator\">:</span> <span class=\"token constant\">WIN_H</span><span class=\"token punctuation\">)</span>\n\n    canvas <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Canvas</span><span class=\"token punctuation\">(</span>$canvas<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n    center <span class=\"token operator\">=</span> <span class=\"token property\">x</span><span class=\"token operator\">:</span> canvas<span class=\"token punctuation\">.</span>width <span class=\"token operator\">/</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token property\">y</span><span class=\"token operator\">:</span> canvas<span class=\"token punctuation\">.</span>height <span class=\"token operator\">/</span> <span class=\"token number\">2</span>\n\n    <span class=\"token comment\"># ノードを生成</span>\n    nodes <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\n        <span class=\"token keyword\">new</span> <span class=\"token class-name\">Node</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"A\"</span><span class=\"token punctuation\">,</span> center<span class=\"token punctuation\">.</span>x <span class=\"token operator\">-</span> <span class=\"token number\">100</span> <span class=\"token operator\">+</span> <span class=\"token function\">random</span><span class=\"token punctuation\">(</span><span class=\"token number\">200</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> center<span class=\"token punctuation\">.</span>y <span class=\"token operator\">-</span> <span class=\"token number\">100</span> <span class=\"token operator\">+</span> <span class=\"token function\">random</span><span class=\"token punctuation\">(</span><span class=\"token number\">200</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        <span class=\"token keyword\">new</span> <span class=\"token class-name\">Node</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"B\"</span><span class=\"token punctuation\">,</span> center<span class=\"token punctuation\">.</span>x <span class=\"token operator\">-</span> <span class=\"token number\">100</span> <span class=\"token operator\">+</span> <span class=\"token function\">random</span><span class=\"token punctuation\">(</span><span class=\"token number\">200</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> center<span class=\"token punctuation\">.</span>y <span class=\"token operator\">-</span> <span class=\"token number\">100</span> <span class=\"token operator\">+</span> <span class=\"token function\">random</span><span class=\"token punctuation\">(</span><span class=\"token number\">200</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        <span class=\"token keyword\">new</span> <span class=\"token class-name\">Node</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"C\"</span><span class=\"token punctuation\">,</span> center<span class=\"token punctuation\">.</span>x <span class=\"token operator\">-</span> <span class=\"token number\">100</span> <span class=\"token operator\">+</span> <span class=\"token function\">random</span><span class=\"token punctuation\">(</span><span class=\"token number\">200</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> center<span class=\"token punctuation\">.</span>y <span class=\"token operator\">-</span> <span class=\"token number\">100</span> <span class=\"token operator\">+</span> <span class=\"token function\">random</span><span class=\"token punctuation\">(</span><span class=\"token number\">200</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        <span class=\"token keyword\">new</span> <span class=\"token class-name\">Node</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"D\"</span><span class=\"token punctuation\">,</span> center<span class=\"token punctuation\">.</span>x <span class=\"token operator\">-</span> <span class=\"token number\">100</span> <span class=\"token operator\">+</span> <span class=\"token function\">random</span><span class=\"token punctuation\">(</span><span class=\"token number\">200</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> center<span class=\"token punctuation\">.</span>y <span class=\"token operator\">-</span> <span class=\"token number\">100</span> <span class=\"token operator\">+</span> <span class=\"token function\">random</span><span class=\"token punctuation\">(</span><span class=\"token number\">200</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        <span class=\"token keyword\">new</span> <span class=\"token class-name\">Node</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"E\"</span><span class=\"token punctuation\">,</span> center<span class=\"token punctuation\">.</span>x <span class=\"token operator\">-</span> <span class=\"token number\">100</span> <span class=\"token operator\">+</span> <span class=\"token function\">random</span><span class=\"token punctuation\">(</span><span class=\"token number\">200</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> center<span class=\"token punctuation\">.</span>y <span class=\"token operator\">-</span> <span class=\"token number\">100</span> <span class=\"token operator\">+</span> <span class=\"token function\">random</span><span class=\"token punctuation\">(</span><span class=\"token number\">200</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">]</span>\n\n    <span class=\"token comment\"># グラフを生成</span>\n    graph <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ForceDirectedGraph</span><span class=\"token punctuation\">(</span>nodes<span class=\"token punctuation\">)</span>\n\n    <span class=\"token comment\"># ノード同士を接続</span>\n    graph<span class=\"token punctuation\">.</span><span class=\"token function\">connect</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span>\n    graph<span class=\"token punctuation\">.</span><span class=\"token function\">connect</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n    graph<span class=\"token punctuation\">.</span><span class=\"token function\">connect</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span>\n    graph<span class=\"token punctuation\">.</span><span class=\"token function\">connect</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span>\n    graph<span class=\"token punctuation\">.</span><span class=\"token function\">connect</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span>\n    graph<span class=\"token punctuation\">.</span><span class=\"token function\">connect</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span>\n    graph<span class=\"token punctuation\">.</span><span class=\"token function\">connect</span><span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span>\n    graph<span class=\"token punctuation\">.</span><span class=\"token function\">connect</span><span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n\n    canvas<span class=\"token punctuation\">.</span>add graph\n\n    <span class=\"token comment\"># グラフを描画</span>\n    setInterval <span class=\"token operator\">-</span><span class=\"token operator\">></span>\n        graph<span class=\"token punctuation\">.</span><span class=\"token function\">balance</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        canvas<span class=\"token punctuation\">.</span><span class=\"token function\">clear</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">fill</span><span class=\"token punctuation\">(</span><span class=\"token string\">'white'</span><span class=\"token punctuation\">)</span>\n        canvas<span class=\"token punctuation\">.</span><span class=\"token function\">draw</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">,</span> <span class=\"token number\">50</span></code></pre></div>\n<p>というコードになっております。 コードベースでの解説となってしまいましたが、これで説明は以上です。</p>\n<p>jsdo.itでも公開していますが、<br>\n一応zipのダウンロードリンクも貼っておきます。</p>\n<p><span class=\"removed_link\" title=\"http://d.pr/f/gHXb\">ダウンロード</span></p>\n<h2 id=\"参考\" style=\"position:relative;\"><a href=\"#%E5%8F%82%E8%80%83\" aria-label=\"参考 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>参考</h2>\n<p><a href=\"http://blog.ivank.net/force-based-graph-drawing-in-as3.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">» Force-based graph drawing in AS3</a></p>","timeToRead":7,"frontmatter":{"title":"jsとcanvasでグラフの描画(力学モデル)を実装した","tags":["CoffeeScript","HTML5 Canvas","JavaScript"],"date":"December 20, 2013","featuredImage":{"childImageSharp":{"fluid":{"tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='135'%20viewBox='0%200%20400%20135'%20preserveAspectRatio='none'%3e%3cpath%20d='M66%2013c-7%203-9%2013-3%2019l2%203h-4c-10%200-16%2013-8%2021%2012%2011%2029-6%2017-17l-2-3h3c14%200%2018-17%206-24-4-1-7-1-11%201m-36%206c-9%204-8%2020%201%2022%204%201%204%207%200%207-14%204-12%2024%202%2024%205%200%206%200%209-3l4-4v-1l-1-4c0-5-3-9-7-11-4-1-5-7%200-7%203%200%209-6%2010-10%200-3%201-4%202-4%202-1%202-1%200-1s-3-1-3-2c-2-5-10-9-17-6m302%2017c-5%203-7%209-5%2016%202%203%202%203-1%206-6%205-6%2012%200%2018l2%203-2%201-3%207c0%206%203%2011%208%2013%2013%205%2023-13%2013-21-2-2-2-2%200-5%203-4%203-10%201-14-2-2-2-2%200-3%205-3%207-11%204-17-2-6-11-8-17-4m-228%203c-2%201-7%207-7%209v7l6%207c6%203%2015%200%2018-6%200-2%202-4%203-4v-1l-2-1c0-8-10-14-18-11m94%207c-11%206-7%2024%206%2024%206%200%2012-5%2012-9l2-2h3l-3-1-2-3c0-7-11-12-18-9m91%208l-4%205-2%204v1l1%203c0%203%206%209%2010%2010%203%201%2010-2%2012-5%208-11-5-25-17-18m68%203c-6%202-10%209-7%2016%204%2013%2024%2010%2024-4%200-8-8-14-17-12M35%20109v2c2%201%202%202%200%203s-1%204%202%204c2%200%202%200%201-1-1-2-1-4%201-4l1%202c0%202%200%203%205%203h6l-1-4c0-3%200-4%202-4l1%204c-1%204%200%204%202%204s3%200%202-3c-1-7-1-7-7-7-4%200-5%200-4%202%202%201%201%206-1%207-2%200-2-1-2-4%200-4-1-5-3-5l-5%201m120%200v12c-1%201%200%201%203%201%202%200%203%200%202-1-2-1-1-3%201-3%205%200%207-6%204-9h-10'%20fill='%23d3d3d3'%20fill-rule='evenodd'/%3e%3c/svg%3e","aspectRatio":2.9557522123893807,"src":"/static/7eb1cf8d830fdff37571497eaba549bf/7f4a1/featured-image.png","srcSet":"/static/7eb1cf8d830fdff37571497eaba549bf/1ec58/featured-image.png 334w,\n/static/7eb1cf8d830fdff37571497eaba549bf/7f4a1/featured-image.png 604w","srcWebp":"/static/7eb1cf8d830fdff37571497eaba549bf/e33b9/featured-image.webp","srcSetWebp":"/static/7eb1cf8d830fdff37571497eaba549bf/cd98f/featured-image.webp 334w,\n/static/7eb1cf8d830fdff37571497eaba549bf/e33b9/featured-image.webp 604w","sizes":"(max-width: 604px) 100vw, 604px"}}}}}},"pageContext":{"slug":"/force-directed-algorithm-with-html5-canvas/","previous":{"fields":{"slug":"/improve-coding-speed-with-mou/"},"frontmatter":{"title":"Mouのショートカットを覚えて爆速コーディング","tags":["Markdown","Mou"]}},"next":{"fields":{"slug":"/keyboard-shortcut-of-github/"},"frontmatter":{"title":"Githubで使えるキーボードショートカット","tags":["Github"]}}}},
    "staticQueryHashes": ["2585454260","2954598359"]}