{"data":{"site":{"siteMetadata":{"title":"bauhausify","siteUrl":"https://www.bauhausify.com","subtitle":"美大出身のWEBエンジニアリング奮闘記","descriptionMyself":"\n多摩美術大学<br>プロダクトデザイン専攻卒業 -> <br>GUIデザイン会社勤務 -><br>\n現在フロントエンジニア<br>\n<br>\nMy site -><br>\n<a href=\"http://www.mwrote.com\">www.mwrote.com</a>\n"}},"markdownRemark":{"id":"6447a8c6-ecea-5d34-94f4-b65f0b6f3b70","html":"<p><a href=\"https://codepen.io/mwrote/pen/vYBxXQm??defaultTab=result&#x26;run=true\" target=\"_blank\" rel=\"noopener noreferrer\"><div class=\"embed-codepen\"><iframe\n        height='400'\n        scrolling='no'\n        src='//codepen.io/mwrote/embed/vYBxXQm/?height=400&theme-id=light&default-tab=result'\n        frameborder='no'\n        allowtransparency='true'\n        allowfullscreen='true'\n        style='width: 100%;'></iframe></div></a></p>\n<p>こちらのgenerative artistryというサイトで、<br>\n巣のJavaScriptのみで美しいパターンのチュートリアル集を発見しました。</p>\n<p><a href=\"https://generativeartistry.com\" target=\"_blank\" rel=\"noopener noreferrer\">https://generativeartistry.com</a></p>\n<p>今回は、上記リンク内の<a href=\"https://generativeartistry.com/tutorials/tiled-lines/\" target=\"_blank\" rel=\"noopener noreferrer\">01番目のコード</a>をsketchのインスタンスモードで書き直しましたので、パターンを作る際の簡単な考え方について説明します。</p>\n<p>考え方はざっくりまとめると、</p>\n<ul>\n<li>ルール(フォーミュラ)を考える</li>\n<li>フォーミュラをもとに実行する</li>\n</ul>\n<p>です。</p>\n<h2 id=\"ルールフォーミュラを考える\"><a href=\"#%E3%83%AB%E3%83%BC%E3%83%AB%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9F%E3%83%A5%E3%83%A9%E3%82%92%E8%80%83%E3%81%88%E3%82%8B\" aria-label=\"ルールフォーミュラを考える permalink\" class=\"gatsby-remark-autolink-headers-icon\"><svg width=\"22px\" height=\"7px\" viewBox=\"0 0 22 7\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n    <g id=\"Page-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n        <g id=\"icon-link\" fill=\"#23282D\">\n            <path d=\"M14,1 C13.4477153,1 13,1.31979661 13,1.71428571 L13,5.28571429 C13,5.68020339 13.4477153,6 14,6 L20,6 C20.5522847,6 21,5.68020339 21,5.28571429 L21,1.71428571 C21,1.31979661 20.5522847,1 20,1 L14,1 Z M14,0 L20,0 C21.1045695,0 22,0.696445945 22,1.55555556 L22,5.44444444 C22,6.30355406 21.1045695,7 20,7 L14,7 C12.8954305,7 12,6.30355406 12,5.44444444 L12,1.55555556 C12,0.696445945 12.8954305,0 14,0 Z M12,2 L12,5 L13,5 L13,2 L12,2 Z\" id=\"Combined-Shape\" fill-rule=\"nonzero\"></path>\n            <path d=\"M2,1 C1.44771525,1 1,1.31979661 1,1.71428571 L1,5.28571429 C1,5.68020339 1.44771525,6 2,6 L8,6 C8.55228475,6 9,5.68020339 9,5.28571429 L9,1.71428571 C9,1.31979661 8.55228475,1 8,1 L2,1 Z M2,0 L8,0 C9.1045695,0 10,0.696445945 10,1.55555556 L10,5.44444444 C10,6.30355406 9.1045695,7 8,7 L2,7 C0.8954305,7 0,6.30355406 0,5.44444444 L0,1.55555556 C0,0.696445945 0.8954305,0 2,0 Z M9,2 L9,5 L10,5 L10,2 L9,2 Z\" id=\"Combined-Shape\" fill-rule=\"nonzero\"></path>\n            <rect id=\"Rectangle-2\" x=\"6\" y=\"3\" width=\"10\" height=\"1\"></rect>\n        </g>\n    </g>\n</svg></a>ルール(フォーミュラ)を考える</h2>\n<p>これがパターンを作る際の最も大事なポイントです。<br>\nこれは言い換えると、最終的な絵はどうなるか作る本人もわからないということです(ある程度想像はしますが)。</p>\n<p>デザイナーやアーティストは、最終的にどんな絵を描くか決めてからペンを走らせます。<br>\nそして、その描いたとおりに、絵を描いて完成させます。</p>\n<p>一方、パターンを作る場合は、まずはじめにルールを決めます。<br>\nそして、そのルールに従い、反復して実行し続けます。<br>\n最終的な絵は連続して無限に広がる模様を切り取ったような絵になります。</p>\n<p>これが大きな考え方の違いです。<br>\nつまり、最終的な絵を始めに描いてコードを書き始めるのではなく、<br>\nルールを実行することで絵を描いていきます。</p>\n<p>この記事ではそのルールをフォーミュラ[Formula]と名付けます。</p>\n<p>では、コードを見てみましょう。\n冒頭でお見せしたCodepenのフォーミュラ部分はこちらです。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">let</span> step <span class=\"token operator\">=</span> <span class=\"token number\">25</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">formula</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">x<span class=\"token punctuation\">,</span> y</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> leftToRight <span class=\"token operator\">=</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> <span class=\"token number\">0.5</span><span class=\"token punctuation\">;</span>\n  p<span class=\"token punctuation\">.</span><span class=\"token function\">stroke</span><span class=\"token punctuation\">(</span><span class=\"token string\">'#FFFFFF'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>leftToRight<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    p<span class=\"token punctuation\">.</span><span class=\"token function\">line</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">,</span> x <span class=\"token operator\">+</span> step<span class=\"token punctuation\">,</span> y <span class=\"token operator\">+</span> step<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    p<span class=\"token punctuation\">.</span><span class=\"token function\">line</span><span class=\"token punctuation\">(</span>x <span class=\"token operator\">+</span> step<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">,</span> x<span class=\"token punctuation\">,</span> y <span class=\"token operator\">+</span> step<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>これは言葉で言い換えると、</p>\n<p>「25pxのマスの中を、ランダムで左上から右下、もしくは右上から左下に線を描く。」</p>\n<p>となります。</p>\n<p><code class=\"language-text\">Math.random()</code>は0〜1の間の少数値をランダムで返します。<br>\nそれが0.5より大きければ左上から右下へ、<br>\nそうでないなら、右上から左上へ線を描くという条件分岐ですね。</p>\n<p>ここで非常に重要なのは、\n<em>マスのいずれかの角に線がつながっている</em>\nということです。</p>\n<p>これでルールは完成です。</p>\n<h2 id=\"フォーミュラをもとに実行する\"><a href=\"#%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9F%E3%83%A5%E3%83%A9%E3%82%92%E3%82%82%E3%81%A8%E3%81%AB%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B\" aria-label=\"フォーミュラをもとに実行する permalink\" class=\"gatsby-remark-autolink-headers-icon\"><svg width=\"22px\" height=\"7px\" viewBox=\"0 0 22 7\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n    <g id=\"Page-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n        <g id=\"icon-link\" fill=\"#23282D\">\n            <path d=\"M14,1 C13.4477153,1 13,1.31979661 13,1.71428571 L13,5.28571429 C13,5.68020339 13.4477153,6 14,6 L20,6 C20.5522847,6 21,5.68020339 21,5.28571429 L21,1.71428571 C21,1.31979661 20.5522847,1 20,1 L14,1 Z M14,0 L20,0 C21.1045695,0 22,0.696445945 22,1.55555556 L22,5.44444444 C22,6.30355406 21.1045695,7 20,7 L14,7 C12.8954305,7 12,6.30355406 12,5.44444444 L12,1.55555556 C12,0.696445945 12.8954305,0 14,0 Z M12,2 L12,5 L13,5 L13,2 L12,2 Z\" id=\"Combined-Shape\" fill-rule=\"nonzero\"></path>\n            <path d=\"M2,1 C1.44771525,1 1,1.31979661 1,1.71428571 L1,5.28571429 C1,5.68020339 1.44771525,6 2,6 L8,6 C8.55228475,6 9,5.68020339 9,5.28571429 L9,1.71428571 C9,1.31979661 8.55228475,1 8,1 L2,1 Z M2,0 L8,0 C9.1045695,0 10,0.696445945 10,1.55555556 L10,5.44444444 C10,6.30355406 9.1045695,7 8,7 L2,7 C0.8954305,7 0,6.30355406 0,5.44444444 L0,1.55555556 C0,0.696445945 0.8954305,0 2,0 Z M9,2 L9,5 L10,5 L10,2 L9,2 Z\" id=\"Combined-Shape\" fill-rule=\"nonzero\"></path>\n            <rect id=\"Rectangle-2\" x=\"6\" y=\"3\" width=\"10\" height=\"1\"></rect>\n        </g>\n    </g>\n</svg></a>フォーミュラをもとに実行する</h2>\n<p>先程25pxのマスの中のルールを考えたので、<br>\nキャンバスすべてが25pxのマスでうまるように、<br>\nxとyを25pxずつ移動させ、先程の線を描く関数を実行します。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> x <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> x <span class=\"token operator\">&lt;</span> p<span class=\"token punctuation\">.</span>width<span class=\"token punctuation\">;</span> x <span class=\"token operator\">+=</span> step<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> y <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> y <span class=\"token operator\">&lt;</span> p<span class=\"token punctuation\">.</span>width<span class=\"token punctuation\">;</span> y <span class=\"token operator\">+=</span> step<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">formula</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>先程のマスの特徴は <em>マスのいずれかの角に線がつながっている</em> ことです。<br>\nそのマスを連続して並べることで、連続した線が完成しました。</p>\n<p>これで完成です。<br>\nいかがでしょうか。<br>\nこのように、ルールを作り、それを実行することで、<br>\n簡単にパターンを生成することができます。<br></p>\n<p>あとは自分の納得の行くまで、このパターンと実行を繰り替えることで、<br>\n美しい自分だけのパターン見つけることができます。</p>","fields":{"slug":"/2019-08-27_フォーミュラによる美しいパターンをjavascriptで描く/"},"tableOfContents":"<ul>\n<li><a href=\"/2019-08-27_%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9F%E3%83%A5%E3%83%A9%E3%81%AB%E3%82%88%E3%82%8B%E7%BE%8E%E3%81%97%E3%81%84%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%82%92javascript%E3%81%A7%E6%8F%8F%E3%81%8F/#%E3%83%AB%E3%83%BC%E3%83%AB%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9F%E3%83%A5%E3%83%A9%E3%82%92%E8%80%83%E3%81%88%E3%82%8B\">ルール(フォーミュラ)を考える</a></li>\n<li><a href=\"/2019-08-27_%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9F%E3%83%A5%E3%83%A9%E3%81%AB%E3%82%88%E3%82%8B%E7%BE%8E%E3%81%97%E3%81%84%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%82%92javascript%E3%81%A7%E6%8F%8F%E3%81%8F/#%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9F%E3%83%A5%E3%83%A9%E3%82%92%E3%82%82%E3%81%A8%E3%81%AB%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B\">フォーミュラをもとに実行する</a></li>\n</ul>","frontmatter":{"date":"2019.08.27","title":"フォーミュラによる美しいパターンをJavaScriptで描く","cover":"","category":"Design","excerpt":"美しいパターンというのは、JavaScriptで簡単に描くことができます。"}}},"pageContext":{"isCreatedByStatefulCreatePages":false,"id":"6447a8c6-ecea-5d34-94f4-b65f0b6f3b70","next":{"path":"/2019-08-24_Bodymovinでサイズを拡大しても綺麗なWeb用アニメーションを作る方法/","title":"Bodymovinでサイズを拡大しても綺麗なWeb用アニメーションを作る方法","category":"Design"},"prev":{"path":"/2019-08-30_BEMSMACCSを受け継いだ書きやすいCSS記法RSCSS/","title":"BEM, SMACCSを受け継いだ書きやすいCSS記法RSCSS","category":"Coding"},"relatedPosts":[]}}