{"componentChunkName":"component---src-templates-blog-post-js","path":"/blog/making-a-verlet-physics-engine-in-javascript","result":{"data":{"markdownRemark":{"excerpt":"Have you ever wondered if you can make your own physics engine in JavaScript? If so, you have come to the right place. We are going to build…","html":"<p>Have you ever wondered if you can make your own physics engine in JavaScript? If so, you have come to the right place. We are going to build a Physics engine from scratch in JavaScript.</p>\n<p>Before we start, I should mention that this tutorial assumes you have a good understanding of Vectors.\nDon’t worry if you do not yet have this understanding — Vectors are simple: get the Vector.js.</p>\n<h2 id=\"What-Is-Verlet-Physics\" style=\"position:relative;\"><a href=\"#What-Is-Verlet-Physics\" aria-label=\"What Is Verlet Physics permalink\" class=\"gatsby-remark-autolink 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>What Is Verlet Physics?</h2>\n<p>According to Wikipedia:</p>\n<blockquote>\n<p>Verlet integration is a numerical method used to integrate Newton’s equations of motion. It is frequently used to calculate trajectories of particles in molecular dynamics simulations and computer graphics. The algorithm was first used in 1791 by Delambre and has been rediscovered many times since then, most recently by Loup Verlet in the 1960s for use in molecular dynamics.</p>\n</blockquote>\n<p>In simple terms, Verlet physics is just a system of connected dots.</p>\n<h3 id=\"In-a-Verlet-system-we-have-2-main-components\" style=\"position:relative;\"><a href=\"#In-a-Verlet-system-we-have-2-main-components\" aria-label=\"In a Verlet system we have 2 main components permalink\" class=\"gatsby-remark-autolink 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>In a Verlet system, we have 2 main components:</h3>\n<ol>\n<li>Points (dots)</li>\n<li>Constraints (sticks)</li>\n</ol>\n<p><figure class=\"gatsby-resp-image-figure\" style=\"\">\n    <span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 220px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/939075716d1daed1ba18d841316f59e4/c8042/verlet_box.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 103.37837837837837%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAVCAYAAABG1c6oAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABKklEQVQ4y81UwW7CMAzl/78ATjszLhy5bjekTTvssCMXNm2IbpRkbWhje45baEJHGySYZslq6jgv79lJBnRhG1wNEBEP3737cX/ut3EUYIyfBDyeiLXjNS2GoDNSw1uCj4Rwowg/U3HwHFVGejShcvlerYUuyRaoeHoh3BUyRmsbL60sdhsU82eCrY6TjDoPdg1yko0wxKKUTTubcpDtFjG7VjddnMsgOV9bQrOLYyh1AghZO7BUNbk8Pg+wZijxdQO2L0UvYCDZAwzAfPlnAToQ979uaibddbGaodQwj5RMho9Mwiz5TJ40d4S40/1Xj2V830wJFq+EmamkpdpzJfFsPCP7tooDNHcPFRhLwty0nZmZ+0ep9d/f5arw0P/S1DmdDP/3i30p+wFd7X0wadHw2gAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"A Box. Connected With Dots And Sticks\"\n        title=\"A Box. Connected With Dots And Sticks\"\n        src=\"/static/939075716d1daed1ba18d841316f59e4/c8042/verlet_box.png\"\n        srcset=\"/static/939075716d1daed1ba18d841316f59e4/12f09/verlet_box.png 148w,\n/static/939075716d1daed1ba18d841316f59e4/c8042/verlet_box.png 220w\"\n        sizes=\"(max-width: 220px) 100vw, 220px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span>\n    <figcaption class=\"gatsby-resp-image-figcaption\">A Box. Connected With Dots And Sticks</figcaption>\n  </figure></p>\n<h2 id=\"Dots\" style=\"position:relative;\"><a href=\"#Dots\" aria-label=\"Dots permalink\" class=\"gatsby-remark-autolink 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>Dots</h2>\n<p>The dots have basic physics applied to them.\nWe have to keep track of the dots’ current and old positions to add the physics behavior to them — you'll see this when we implement it.</p>\n<div class=\"gatsby-highlight has-highlighted-lines\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-js line-numbers\"><code class=\"language-js\"><span class=\"token comment\">// Dot.js</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">Dot</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</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=\"gatsby-highlight-code-line\">    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>pos <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Vector</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">)</span></span><span class=\"gatsby-highlight-code-line\">    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>oldpos <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Vector</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">)</span></span>    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>friction <span class=\"token operator\">=</span> <span class=\"token number\">0.97</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>groundFriction <span class=\"token operator\">=</span> <span class=\"token number\">0.7</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>gravity <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Vector</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    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>radius <span class=\"token operator\">=</span> <span class=\"token number\">5</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>color <span class=\"token operator\">=</span> <span class=\"token string\">\"#e62a4f\"</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>mass <span class=\"token operator\">=</span> <span class=\"token number\">1</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>We have the basic setup, now let's render the dots and make them move.</p>\n<div class=\"gatsby-highlight has-highlighted-lines\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-js line-numbers\"><code class=\"language-js\"><span class=\"token comment\">// Dot.js</span>\n<span class=\"token function\">update</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n<span class=\"gatsby-highlight-code-line\">  <span class=\"token keyword\">let</span> vel <span class=\"token operator\">=</span> Vector<span class=\"token punctuation\">.</span><span class=\"token function\">sub</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>pos<span class=\"token punctuation\">,</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>oldpos<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></span>  vel<span class=\"token punctuation\">.</span><span class=\"token function\">mult</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>friction<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token comment\">// if the point touches the ground set groundFriction</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>pos<span class=\"token punctuation\">.</span>y <span class=\"token operator\">>=</span> <span class=\"token constant\">CANVAS_HEIGHT</span> <span class=\"token operator\">-</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>radius <span class=\"token operator\">&amp;&amp;</span> vel<span class=\"token punctuation\">.</span><span class=\"token function\">magSq</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">></span> <span class=\"token number\">0.000001</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">var</span> m <span class=\"token operator\">=</span> vel<span class=\"token punctuation\">.</span><span class=\"token function\">mag</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    vel<span class=\"token punctuation\">.</span>x <span class=\"token operator\">/=</span> m<span class=\"token punctuation\">;</span>\n    vel<span class=\"token punctuation\">.</span>y <span class=\"token operator\">/=</span> m<span class=\"token punctuation\">;</span>\n    vel<span class=\"token punctuation\">.</span><span class=\"token function\">mult</span><span class=\"token punctuation\">(</span>m <span class=\"token operator\">*</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>groundFriction<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"gatsby-highlight-code-line\">  <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>oldpos<span class=\"token punctuation\">.</span><span class=\"token function\">setXY</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>pos<span class=\"token punctuation\">.</span>x<span class=\"token punctuation\">,</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>pos<span class=\"token punctuation\">.</span>y<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></span><span class=\"gatsby-highlight-code-line\">  <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>pos<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span>vel<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></span>  <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>pos<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>gravity<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>The update function will update the position and handle the physics of the dot.</p>\n<p>To do Verlet integration, we have to calculate velocity based on dots old position.</p>\n<p>In the first line, we are <strong>subtracting the current position from the old position to get the desired velocity.</strong> After calculating the velocity, we apply friction to the dots, so they come to rest instead of sliding forever.</p>\n<p>Then, we update the old position by saying <code class=\"language-text\">this.oldpos.setXY(this.pos.x, this.pos.y)</code> and add the velocity and gravity to the position.</p>\n<p>We also want to make them stay inside the canvas, so we have to add some checks. We will also add another function: <code class=\"language-text\">constrain()</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-js line-numbers\"><code class=\"language-js\"><span class=\"token comment\">// Dot.js</span>\n<span class=\"token function\">constrain</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>pos<span class=\"token punctuation\">.</span>x <span class=\"token operator\">></span> <span class=\"token constant\">CANVAS_WIDTH</span> <span class=\"token operator\">-</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>radius<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>pos<span class=\"token punctuation\">.</span>x <span class=\"token operator\">=</span> <span class=\"token constant\">CANVAS_WIDTH</span> <span class=\"token operator\">-</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>radius<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>pos<span class=\"token punctuation\">.</span>x <span class=\"token operator\">&lt;</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>radius<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>pos<span class=\"token punctuation\">.</span>x <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>radius<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>pos<span class=\"token punctuation\">.</span>y <span class=\"token operator\">></span> <span class=\"token constant\">CANVAS_HEIGHT</span> <span class=\"token operator\">-</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>radius<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>pos<span class=\"token punctuation\">.</span>y <span class=\"token operator\">=</span> <span class=\"token constant\">CANVAS_HEIGHT</span> <span class=\"token operator\">-</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>radius<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>pos<span class=\"token punctuation\">.</span>y <span class=\"token operator\">&lt;</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>radius<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>pos<span class=\"token punctuation\">.</span>y <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>radius<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>Let’s add the render method too:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-js line-numbers\"><code class=\"language-js\"><span class=\"token comment\">// Dot.js</span>\n<span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  ctx<span class=\"token punctuation\">.</span><span class=\"token function\">beginPath</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  ctx<span class=\"token punctuation\">.</span>fillStyle <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>color<span class=\"token punctuation\">;</span>\n  ctx<span class=\"token punctuation\">.</span><span class=\"token function\">arc</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>pos<span class=\"token punctuation\">.</span>x<span class=\"token punctuation\">,</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>pos<span class=\"token punctuation\">.</span>y<span class=\"token punctuation\">,</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>radius<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> Math<span class=\"token punctuation\">.</span><span class=\"token constant\">PI</span> <span class=\"token operator\">*</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  ctx<span class=\"token punctuation\">.</span><span class=\"token function\">fill</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  ctx<span class=\"token punctuation\">.</span><span class=\"token function\">closePath</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>Setting up:</p>\n<div class=\"gatsby-highlight has-highlighted-lines\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-js line-numbers\"><code class=\"language-js\"><span class=\"token comment\">// index.js | setup</span>\n<span class=\"token keyword\">let</span> canvas <span class=\"token operator\">=</span> document<span class=\"token punctuation\">.</span><span class=\"token function\">getElementById</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"c\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">let</span> ctx <span class=\"token operator\">=</span> canvas<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 keyword\">let</span> <span class=\"token constant\">CANVAS_WIDTH</span> <span class=\"token operator\">=</span> window<span class=\"token punctuation\">.</span>innerWidth\n<span class=\"token keyword\">let</span> <span class=\"token constant\">CANVAS_HEIGHT</span> <span class=\"token operator\">=</span> window<span class=\"token punctuation\">.</span>innerHeight\ncanvas<span class=\"token punctuation\">.</span>width <span class=\"token operator\">=</span> <span class=\"token constant\">CANVAS_WIDTH</span>\ncanvas<span class=\"token punctuation\">.</span>height <span class=\"token operator\">=</span> <span class=\"token constant\">CANVAS_HEIGHT</span>\n\n<span class=\"token keyword\">let</span> dots <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n\n<span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> <span class=\"token number\">50</span><span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  dots<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>\n<span class=\"gatsby-highlight-code-line\">    <span class=\"token keyword\">new</span> <span class=\"token class-name\">Dot</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> <span class=\"token constant\">CANVAS_WIDTH</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> <span class=\"token constant\">CANVAS_HEIGHT</span><span class=\"token punctuation\">)</span></span>  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">animate</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  ctx<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 constant\">CANVAS_WIDTH</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">CANVAS_HEIGHT</span><span class=\"token punctuation\">)</span>\n\n<span class=\"gatsby-highlight-code-line\">  <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> d <span class=\"token keyword\">of</span> dots<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></span><span class=\"gatsby-highlight-code-line\">    d<span class=\"token punctuation\">.</span><span class=\"token function\">update</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></span><span class=\"gatsby-highlight-code-line\">    d<span class=\"token punctuation\">.</span><span class=\"token function\">constrain</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></span><span class=\"gatsby-highlight-code-line\">    d<span class=\"token punctuation\">.</span><span class=\"token function\">render</span><span class=\"token punctuation\">(</span>ctx<span class=\"token punctuation\">)</span></span><span class=\"gatsby-highlight-code-line\">  <span class=\"token punctuation\">}</span></span>\n  <span class=\"token function\">requestAnimationFrame</span><span class=\"token punctuation\">(</span>animate<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token function\">animate</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>We added a lot more dots in random positions and then <code class=\"language-text\">update()</code> <code class=\"language-text\">constrain()</code> <code class=\"language-text\">render()</code> them.</p>\n<p>Let's see what that looks like:</p>\n<p><iframe src=\"https://codepen.io/anuraghazra/embed/preview/VOpJJR?default-tab=results\" style=\"width:100%; height:300px;\"></iframe></p>\n<p>Excellent — it's just a start, but finally, we have something.</p>\n<p>Now we are going to add the sticks!</p>\n<h2 id=\"Sticks\" style=\"position:relative;\"><a href=\"#Sticks\" aria-label=\"Sticks permalink\" class=\"gatsby-remark-autolink 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>Sticks</h2>\n<p>Sticks are the core of Verlet physics. Sticks make sure that the dots don’t get too far or too close to each other — they constrain dots to a certain distance.</p>\n<p><figure class=\"gatsby-resp-image-figure\" style=\"\">\n    <span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 470px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/56e47ba4ae9abd84b137a79732a1d8a9/f96db/constraint_particle.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 70.27027027027026%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAIAAACgpqunAAAACXBIWXMAAAsTAAALEwEAmpwYAAABCElEQVQoz6VS2XaDIBDN/39bX7qkOXm1ihgDCAmoLGNYUoL2zc7x6Mxl7iwXD8s/7PD8AkBd7SSDc7fz517yAo0WLxjAv/T522CUQ28TWAUm5pdkgKZtCm445ZcLJySFCZFy4AznhBe5w513nHM6WiAL4R/vzPNsIjKhWp6+0porcotDyXEc+77vulCIMyaEMMYghBhjHrlJSaLzp3OLN2MPQgyxcwgjMteVOr5vOzuAirR5PRfP5Omomp+0i4vku1Zs4kngldpXpzZqg+DLNJZqw6/Om3u294+3vffsRyVXgLLu4qxN85daxA1gRTZGE861MVkta62XnVKaEc/z4jNKU1rxb++yBwRDOhRt8pkfAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"https://slsdo.github.io/blob-family/#constraint\"\n        title=\"https://slsdo.github.io/blob-family/#constraint\"\n        src=\"/static/56e47ba4ae9abd84b137a79732a1d8a9/f96db/constraint_particle.png\"\n        srcset=\"/static/56e47ba4ae9abd84b137a79732a1d8a9/12f09/constraint_particle.png 148w,\n/static/56e47ba4ae9abd84b137a79732a1d8a9/e4a3f/constraint_particle.png 295w,\n/static/56e47ba4ae9abd84b137a79732a1d8a9/f96db/constraint_particle.png 470w\"\n        sizes=\"(max-width: 470px) 100vw, 470px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span>\n    <figcaption class=\"gatsby-resp-image-figcaption\">https://slsdo.github.io/blob-family/#constraint</figcaption>\n  </figure></p>\n<p><strong>Stick.js</strong> class is relatively simple. It will take two <strong>Dots</strong> as an argument and a length. But if the length is not defined, we will calculate the length based on the dot’s position.</p>\n<div class=\"gatsby-highlight has-highlighted-lines\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-js line-numbers\"><code class=\"language-js\"><span class=\"token comment\">// Stick.js</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">Stick</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">p1<span class=\"token punctuation\">,</span> p2<span class=\"token punctuation\">,</span> length</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n<span class=\"gatsby-highlight-code-line\">    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>startPoint <span class=\"token operator\">=</span> p1</span><span class=\"gatsby-highlight-code-line\">    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>endPoint <span class=\"token operator\">=</span> p2</span>    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>stiffness <span class=\"token operator\">=</span> <span class=\"token number\">2</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>color <span class=\"token operator\">=</span> <span class=\"token string\">\"#f5476a\"</span>\n\n    <span class=\"token comment\">// if the length is not given then calculate the distance based on the position</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>length<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n<span class=\"gatsby-highlight-code-line\">      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>length <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>startPoint<span class=\"token punctuation\">.</span>pos<span class=\"token punctuation\">.</span><span class=\"token function\">dist</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>endPoint<span class=\"token punctuation\">.</span>pos<span class=\"token punctuation\">)</span></span>    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>length <span class=\"token operator\">=</span> length\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>Now let's add the actual core of the algorithm, This resolves and updates the dot’s position based on the stick’s distance, ultimately constraining it to a certain distance from all other dots.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-js line-numbers\"><code class=\"language-js\"><span class=\"token comment\">// Stick.js</span>\n<span class=\"token function\">update</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// calculate the distance between two dots</span>\n  <span class=\"token keyword\">let</span> dx <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>endPoint<span class=\"token punctuation\">.</span>pos<span class=\"token punctuation\">.</span>x <span class=\"token operator\">-</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>startPoint<span class=\"token punctuation\">.</span>pos<span class=\"token punctuation\">.</span>x<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">let</span> dy <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>endPoint<span class=\"token punctuation\">.</span>pos<span class=\"token punctuation\">.</span>y <span class=\"token operator\">-</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>startPoint<span class=\"token punctuation\">.</span>pos<span class=\"token punctuation\">.</span>y<span class=\"token punctuation\">;</span>\n  <span class=\"token comment\">// pythagoras theorem</span>\n  <span class=\"token keyword\">let</span> dist <span class=\"token operator\">=</span> Math<span class=\"token punctuation\">.</span><span class=\"token function\">sqrt</span><span class=\"token punctuation\">(</span>dx <span class=\"token operator\">*</span> dx <span class=\"token operator\">+</span> dy <span class=\"token operator\">*</span> dy<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token comment\">// calculate the resting distance betwen the dots</span>\n  <span class=\"token keyword\">let</span> diff <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>length <span class=\"token operator\">-</span> dist<span class=\"token punctuation\">)</span> <span class=\"token operator\">/</span> dist <span class=\"token operator\">*</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>stiffness<span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// getting the offset of the points</span>\n  <span class=\"token keyword\">let</span> offsetx <span class=\"token operator\">=</span> dx <span class=\"token operator\">*</span> diff <span class=\"token operator\">*</span> <span class=\"token number\">0.5</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">let</span> offsety <span class=\"token operator\">=</span> dy <span class=\"token operator\">*</span> diff <span class=\"token operator\">*</span> <span class=\"token number\">0.5</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// calculate mass</span>\n  <span class=\"token keyword\">let</span> m1 <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>startPoint<span class=\"token punctuation\">.</span>mass <span class=\"token operator\">+</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>endPoint<span class=\"token punctuation\">.</span>mass<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">let</span> m2 <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>startPoint<span class=\"token punctuation\">.</span>mass <span class=\"token operator\">/</span> m1<span class=\"token punctuation\">;</span>\n  m1 <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>endPoint<span class=\"token punctuation\">.</span>mass <span class=\"token operator\">/</span> m1<span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// and finally apply the offset with calculated mass</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>startPoint<span class=\"token punctuation\">.</span>pinned<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>startPoint<span class=\"token punctuation\">.</span>pos<span class=\"token punctuation\">.</span>x <span class=\"token operator\">-=</span> offsetx <span class=\"token operator\">*</span> m1<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>startPoint<span class=\"token punctuation\">.</span>pos<span class=\"token punctuation\">.</span>y <span class=\"token operator\">-=</span> offsety <span class=\"token operator\">*</span> m1<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>endPoint<span class=\"token punctuation\">.</span>pinned<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>endPoint<span class=\"token punctuation\">.</span>pos<span class=\"token punctuation\">.</span>x <span class=\"token operator\">+=</span> offsetx <span class=\"token operator\">*</span> m2<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>endPoint<span class=\"token punctuation\">.</span>pos<span class=\"token punctuation\">.</span>y <span class=\"token operator\">+=</span> offsety <span class=\"token operator\">*</span> m2<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>Okay, I think we are good to go! Let’s add the render function:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-js line-numbers\"><code class=\"language-js\"><span class=\"token comment\">// Stick.js</span>\n<span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">ctx</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  ctx<span class=\"token punctuation\">.</span><span class=\"token function\">beginPath</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  ctx<span class=\"token punctuation\">.</span>strokeStyle <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>color<span class=\"token punctuation\">;</span>\n  ctx<span class=\"token punctuation\">.</span><span class=\"token function\">moveTo</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>startPoint<span class=\"token punctuation\">.</span>pos<span class=\"token punctuation\">.</span>x<span class=\"token punctuation\">,</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>startPoint<span class=\"token punctuation\">.</span>pos<span class=\"token punctuation\">.</span>y<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  ctx<span class=\"token punctuation\">.</span><span class=\"token function\">lineTo</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>endPoint<span class=\"token punctuation\">.</span>pos<span class=\"token punctuation\">.</span>x<span class=\"token punctuation\">,</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>endPoint<span class=\"token punctuation\">.</span>pos<span class=\"token punctuation\">.</span>y<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  ctx<span class=\"token punctuation\">.</span><span class=\"token function\">stroke</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  ctx<span class=\"token punctuation\">.</span><span class=\"token function\">closePath</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>Setting up:</p>\n<div class=\"gatsby-highlight has-highlighted-lines\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-js line-numbers\"><code class=\"language-js\"><span class=\"token comment\">// index.js | setup</span>\n<span class=\"token keyword\">let</span> canvas <span class=\"token operator\">=</span> document<span class=\"token punctuation\">.</span><span class=\"token function\">getElementById</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"c\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">let</span> ctx <span class=\"token operator\">=</span> canvas<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><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">let</span> <span class=\"token constant\">CANVAS_WIDTH</span> <span class=\"token operator\">=</span> window<span class=\"token punctuation\">.</span>innerWidth<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">let</span> <span class=\"token constant\">CANVAS_HEIGHT</span> <span class=\"token operator\">=</span> window<span class=\"token punctuation\">.</span>innerHeight<span class=\"token punctuation\">;</span>\ncanvas<span class=\"token punctuation\">.</span>width <span class=\"token operator\">=</span> <span class=\"token constant\">CANVAS_WIDTH</span><span class=\"token punctuation\">;</span>\ncanvas<span class=\"token punctuation\">.</span>height <span class=\"token operator\">=</span> <span class=\"token constant\">CANVAS_HEIGHT</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// arrays</span>\n<span class=\"token keyword\">let</span> dots <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"gatsby-highlight-code-line\"><span class=\"token keyword\">let</span> sticks <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span></span>\n<span class=\"token comment\">// forming a BOX</span>\ndots<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Dot</span><span class=\"token punctuation\">(</span><span class=\"token number\">100</span><span class=\"token punctuation\">,</span> <span class=\"token number\">100</span><span class=\"token punctuation\">,</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> <span class=\"token number\">0.5</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">100.0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// x, y, vx, vy</span>\ndots<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Dot</span><span class=\"token punctuation\">(</span><span class=\"token number\">200</span><span class=\"token punctuation\">,</span> <span class=\"token number\">100</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\ndots<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Dot</span><span class=\"token punctuation\">(</span><span class=\"token number\">200</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>\ndots<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Dot</span><span class=\"token punctuation\">(</span><span class=\"token number\">100</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\n<span class=\"token comment\">// sticks</span>\n<span class=\"gatsby-highlight-code-line\">sticks<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Stick</span><span class=\"token punctuation\">(</span>dots<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> dots<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></span><span class=\"gatsby-highlight-code-line\">sticks<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Stick</span><span class=\"token punctuation\">(</span>dots<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> dots<span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></span><span class=\"gatsby-highlight-code-line\">sticks<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Stick</span><span class=\"token punctuation\">(</span>dots<span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> dots<span class=\"token punctuation\">[</span><span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></span><span class=\"gatsby-highlight-code-line\">sticks<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Stick</span><span class=\"token punctuation\">(</span>dots<span class=\"token punctuation\">[</span><span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> dots<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></span><span class=\"gatsby-highlight-code-line\">sticks<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Stick</span><span class=\"token punctuation\">(</span>dots<span class=\"token punctuation\">[</span><span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> dots<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">animate</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  ctx<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 constant\">CANVAS_WIDTH</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">CANVAS_HEIGHT</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> d <span class=\"token keyword\">of</span> dots<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    d<span class=\"token punctuation\">.</span><span class=\"token function\">update</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    d<span class=\"token punctuation\">.</span><span class=\"token function\">constrain</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    d<span class=\"token punctuation\">.</span><span class=\"token function\">render</span><span class=\"token punctuation\">(</span>ctx<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"gatsby-highlight-code-line\">  <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> s <span class=\"token keyword\">of</span> sticks<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></span><span class=\"gatsby-highlight-code-line\">    s<span class=\"token punctuation\">.</span><span class=\"token function\">update</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></span><span class=\"gatsby-highlight-code-line\">    s<span class=\"token punctuation\">.</span><span class=\"token function\">render</span><span class=\"token punctuation\">(</span>ctx<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></span><span class=\"gatsby-highlight-code-line\">  <span class=\"token punctuation\">}</span></span>\n  <span class=\"token function\">requestAnimationFrame</span><span class=\"token punctuation\">(</span>animate<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token function\">animate</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>Let’s see the results:</p>\n<p><iframe src=\"https://codepen.io/anuraghazra/embed/preview/qGmWmZ?default-tab=results\" style=\"width:100%; height:300px;\"></iframe></p>\n<p>As you can see, we have a box! Well, a box that acts like it’s made of Jello, That’s because, in a single frame, one update per stick is not enough to make the dots rest at their length. We have to iterate the simulation as many times as we can — the more the iterations, the more the rigid box will be.</p>\n<p>Adding these lines to the existing code will make the box rigid:</p>\n<div class=\"gatsby-highlight has-highlighted-lines\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-js line-numbers\"><code class=\"language-js\"><span class=\"token comment\">// index.js | setup</span>\n<span class=\"gatsby-highlight-code-line\"><span class=\"token keyword\">const</span> <span class=\"token constant\">ITERATION</span> <span class=\"token operator\">=</span> <span class=\"token number\">100</span> <span class=\"token comment\">// max physics iterations per frame</span></span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">animate</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  ctx<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 constant\">CANVAS_WIDTH</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">CANVAS_HEIGHT</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token comment\">// iterate over the simulation</span>\n<span class=\"gatsby-highlight-code-line\">  <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> <span class=\"token constant\">ITERATION</span><span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></span>    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> d <span class=\"token keyword\">of</span> dots<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      d<span class=\"token punctuation\">.</span><span class=\"token function\">constrain</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> s <span class=\"token keyword\">of</span> sticks<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      s<span class=\"token punctuation\">.</span><span class=\"token function\">update</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> d <span class=\"token keyword\">of</span> dots<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    d<span class=\"token punctuation\">.</span><span class=\"token function\">update</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    d<span class=\"token punctuation\">.</span><span class=\"token function\">render</span><span class=\"token punctuation\">(</span>ctx<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> s <span class=\"token keyword\">of</span> sticks<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    s<span class=\"token punctuation\">.</span><span class=\"token function\">update</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    s<span class=\"token punctuation\">.</span><span class=\"token function\">render</span><span class=\"token punctuation\">(</span>ctx<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">requestAnimationFrame</span><span class=\"token punctuation\">(</span>animate<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token function\">animate</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p><iframe src=\"https://codepen.io/anuraghazra/embed/preview/gJWpmX?default-tab=results\" style=\"width:100%; height:300px;\"></iframe></p>\n<p>Looks amazing, isn’t it?</p>\n<h2 id=\"Entityjs-managing-dots-and-sticks-in-one-place\" style=\"position:relative;\"><a href=\"#Entityjs-managing-dots-and-sticks-in-one-place\" aria-label=\"Entityjs managing dots and sticks in one place permalink\" class=\"gatsby-remark-autolink 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>Entity.js: managing dots and sticks in one place</h2>\n<p>Okay, now we have Dot.js and Stick.js. Both are working nicely, but the problem is we don't have much control over how we use them.</p>\n<p>We will create an Entity Class that will easily handle the Updates and Renders of the Verlet Object. I'm going to paste the whole code here — it’s nothing special:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-js line-numbers\"><code class=\"language-js\"><span class=\"token comment\">// Entity.js</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">Entity</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">iterations</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>dots <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>sticks <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>iterations <span class=\"token operator\">=</span> iterations <span class=\"token operator\">||</span> <span class=\"token number\">16</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">addDot</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">,</span> vx<span class=\"token punctuation\">,</span> vy</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>dots<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Dot</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">,</span> vx<span class=\"token punctuation\">,</span> vy<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">addStick</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">p1<span class=\"token punctuation\">,</span> p2<span class=\"token punctuation\">,</span> length</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>sticks<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Stick</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>dots<span class=\"token punctuation\">[</span>p1<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>dots<span class=\"token punctuation\">[</span>p2<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> length<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">updatePoints</span><span class=\"token punctuation\">(</span><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> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>dots<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>dots<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span><span class=\"token function\">update</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">updateSticks</span><span class=\"token punctuation\">(</span><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> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>sticks<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>sticks<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span><span class=\"token function\">update</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">updateContrains</span><span class=\"token punctuation\">(</span><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> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>dots<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>dots<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span><span class=\"token function\">constrain</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">renderPoints</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">ctx</span><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> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>dots<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>dots<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span><span class=\"token function\">render</span><span class=\"token punctuation\">(</span>ctx<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token function\">renderSticks</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">ctx</span><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> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>sticks<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>sticks<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span><span class=\"token function\">render</span><span class=\"token punctuation\">(</span>ctx<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">update</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">ctx</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">updatePoints</span><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> j <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> j <span class=\"token operator\">&lt;</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>iterations<span class=\"token punctuation\">;</span> j<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">updateSticks</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">updateContrains</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">renderPoints</span><span class=\"token punctuation\">(</span>ctx<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">renderSticks</span><span class=\"token punctuation\">(</span>ctx<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>Using the Entity Class:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-js line-numbers\"><code class=\"language-js\"><span class=\"token comment\">// index.js | setup</span>\n<span class=\"token operator\">...</span>\n<span class=\"token keyword\">let</span> box <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Entity</span><span class=\"token punctuation\">(</span><span class=\"token number\">100</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// x, y, vx, vy added random velocity in first dot to make the box rotate a little bit</span>\nbox<span class=\"token punctuation\">.</span><span class=\"token function\">addDot</span><span class=\"token punctuation\">(</span><span class=\"token number\">100</span><span class=\"token punctuation\">,</span> <span class=\"token number\">100</span><span class=\"token punctuation\">,</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> <span class=\"token number\">0.5</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">100.0</span><span class=\"token punctuation\">)</span>\nbox<span class=\"token punctuation\">.</span><span class=\"token function\">addDot</span><span class=\"token punctuation\">(</span><span class=\"token number\">200</span><span class=\"token punctuation\">,</span> <span class=\"token number\">100</span><span class=\"token punctuation\">)</span>\nbox<span class=\"token punctuation\">.</span><span class=\"token function\">addDot</span><span class=\"token punctuation\">(</span><span class=\"token number\">200</span><span class=\"token punctuation\">,</span> <span class=\"token number\">200</span><span class=\"token punctuation\">)</span>\nbox<span class=\"token punctuation\">.</span><span class=\"token function\">addDot</span><span class=\"token punctuation\">(</span><span class=\"token number\">100</span><span class=\"token punctuation\">,</span> <span class=\"token number\">200</span><span class=\"token punctuation\">)</span>\n\nbox<span class=\"token punctuation\">.</span><span class=\"token function\">addStick</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>\nbox<span class=\"token punctuation\">.</span><span class=\"token function\">addStick</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>\nbox<span class=\"token punctuation\">.</span><span class=\"token function\">addStick</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>\nbox<span class=\"token punctuation\">.</span><span class=\"token function\">addStick</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>\nbox<span class=\"token punctuation\">.</span><span class=\"token function\">addStick</span><span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n<span class=\"token operator\">...</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>Yes, this is looking pretty clean and manageable!</p>\n<p>Let's take a look at the final result:</p>\n<p><iframe src=\"https://codepen.io/anuraghazra/embed/preview/JqNdQW?default-tab=results\" style=\"width:100%; height:300px;\"></iframe></p>\n<p>Now we can create lots of fun Verlet Shapes with this Entity.js class!</p>\n<h2 id=\"Verlyjs-A-physics-engine-I-wrote\" style=\"position:relative;\"><a href=\"#Verlyjs-A-physics-engine-I-wrote\" aria-label=\"Verlyjs A physics engine I wrote permalink\" class=\"gatsby-remark-autolink 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>Verly.js: A physics engine I wrote</h2>\n<p>Verly.js is a Robust Verlet physics engine I wrote. It has many cool features:</p>\n<ol>\n<li>Attraction — Repulsion behavior</li>\n<li>Basic Shapes</li>\n<li>Box, Hexagon, Cloth, Rope, Ragdoll</li>\n<li>Cloth Tearing</li>\n<li>Typography and Text</li>\n</ol>\n<p>With Verly.js you can create a tearable cloth in just 15 lines of code:</p>\n<div class=\"gatsby-highlight has-highlighted-lines\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-js line-numbers\"><code class=\"language-js\"><span class=\"token comment\">// Verly.js | demo</span>\n<span class=\"token keyword\">let</span> canvas <span class=\"token operator\">=</span> document<span class=\"token punctuation\">.</span><span class=\"token function\">getElementById</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"c\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">let</span> ctx <span class=\"token operator\">=</span> canvas<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 keyword\">let</span> width <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>canvas<span class=\"token punctuation\">.</span>width <span class=\"token operator\">=</span> <span class=\"token number\">800</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">let</span> height <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>canvas<span class=\"token punctuation\">.</span>height <span class=\"token operator\">=</span> <span class=\"token number\">600</span><span class=\"token punctuation\">)</span>\n\n<span class=\"gatsby-highlight-code-line\"><span class=\"token keyword\">let</span> verly <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Verly</span><span class=\"token punctuation\">(</span><span class=\"token number\">16</span><span class=\"token punctuation\">)</span></span><span class=\"gatsby-highlight-code-line\"><span class=\"token keyword\">let</span> cloth <span class=\"token operator\">=</span> verly<span class=\"token punctuation\">.</span><span class=\"token function\">createCloth</span><span class=\"token punctuation\">(</span><span class=\"token number\">150</span><span class=\"token punctuation\">,</span> <span class=\"token number\">150</span><span class=\"token punctuation\">,</span> <span class=\"token number\">250</span><span class=\"token punctuation\">,</span> <span class=\"token number\">250</span><span class=\"token punctuation\">,</span> <span class=\"token number\">15</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span></span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">animate</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  ctx<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> width<span class=\"token punctuation\">,</span> height<span class=\"token punctuation\">)</span>\n<span class=\"gatsby-highlight-code-line\">  verly<span class=\"token punctuation\">.</span><span class=\"token function\">update</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></span><span class=\"gatsby-highlight-code-line\">  cloth<span class=\"token punctuation\">.</span><span class=\"token function\">tear</span><span class=\"token punctuation\">(</span><span class=\"token number\">100</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// tear threshold</span></span>  <span class=\"token function\">requestAnimationFrame</span><span class=\"token punctuation\">(</span>animate<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token function\">animate</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>Demo: <a href=\"https://anuraghazra.github.io/Verly.js/\">https://anuraghazra.github.io/Verly.js/</a></p>\n<p>Source-code: <a href=\"https://github.com/anuraghazra/Verly.js\">https://github.com/anuraghazra/Verly.js</a></p>\n<p>Examples: <a href=\"https://anuraghazra.github.io/Verly.js/examples\">https://anuraghazra.github.io/Verly.js/examples</a></p>\n<p>Take a look at some of the examples in my Verly.js Physics Engine, which I created some time ago. I added almost everything in that engine.</p>\n<p><figure class=\"gatsby-resp-image-figure\" style=\"\">\n    <span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 262px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/6a569e78c01efa99e6034f1229bd91e2/8ff13/example1.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 106.08108108108108%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAVCAYAAABG1c6oAAAACXBIWXMAAA7DAAAOwwHHb6hkAAACMklEQVQ4y61Ua08TQRTd//8XjIgfjCZqEIjRWCBotKUV7PIqFC1FqzxbWlq62525M8c7sw8Xdrf1A5M0M3O7c+bcc89cBzOG1jqZ4zXiOWc4M0GUCtc8p+PpuRAwDygE06m1+n/A+x+p4S1kq2PXQW0XWsiZwE5eCtTtgy6vQYdt+PNLoPoh/McLoINjTD6UIU9Os7reZ5j+U37/BX/uDeizC9rYsYDmJ3kfvCzZi1T/BjoQmbNOeqOlxKTMIFsNBquDGFgPRtCcuh77UN0BaO8H5FoN3qPXUBwrTDkOBqUKxOI6VOcc2g+gR+MQ8JoZeRO7p819y1xd9f+5II8hnV6Cqrt8oMEgY3vYHuoxGOtq13yJOu9BrjLLuQWrdRYwumWyVkXwasWmZdlwuursimMlyMo274ch01uP9axDHf1MKp5NOQrIj1tQRjs+pHsDqIueLYRc/8osB6EE/SGovA3/+TvI9u87Xr3LsOLCf7Joi6InQVgQBjUpG2DLzhTnrMuALiRX3ni1UENjA8VGpi9c6eYJNKkQNK60YccakttE8OI92ytKmVSOD6Ng4LKJ5w3LA6tRbBk98ixD+saerO1BsIai0cq8GgcRwzigWB/jN8FeE8ufElMbEKObLG3Ae7qUEEgXpLA5WD1Xq5A7RxAr1bDKbCf/2VvomxHkcYfftUiKmTH2tE4j238gmm27FvutwkYys9tYYKLcXjmthU0FTASPANLPTBd0bQcPPB4c8C+NyV00wxeyiAAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Spherical Shapes anuraghazra.github.io\"\n        title=\"Spherical Shapes anuraghazra.github.io\"\n        src=\"/static/6a569e78c01efa99e6034f1229bd91e2/8ff13/example1.png\"\n        srcset=\"/static/6a569e78c01efa99e6034f1229bd91e2/12f09/example1.png 148w,\n/static/6a569e78c01efa99e6034f1229bd91e2/8ff13/example1.png 262w\"\n        sizes=\"(max-width: 262px) 100vw, 262px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span>\n    <figcaption class=\"gatsby-resp-image-figcaption\">Spherical Shapes anuraghazra.github.io</figcaption>\n  </figure>\n<figure class=\"gatsby-resp-image-figure\" style=\"\">\n    <span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 320px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/935dca25bf391f1a9ba931ef63df78bb/72799/example2.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 109.45945945945948%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAWCAYAAADAQbwGAAAACXBIWXMAAA7DAAAOwwHHb6hkAAADv0lEQVQ4y21VW28NYRSdnyDxL/wE8eDBH/HgnSeJR0KCBwRR6hZCtYq6VFtVtEVL7zelrWp79Ipz5sycuV+2vdZneiR8yZczndlZe6+119618jSTaHhaosk53nh6XuKZBQk/TEn4dlTiL0v6fUai8c/8Tb6tSjg4KenqlsYuSJ6mgpOubUlWrYmVh5HkeS5Z2ZZo4oskCysSjX4iQPz5myRfSxIOTEjYP6JJJjXJmPk2v6zAE5KUNgiIv9OftljJ0qpkfkCQrOYTNJ5dZGBRHcCiEU0yNmuAh6bFf/rGxGoBOHiXRzEA14gef/pqaE/N82Oy+F2TzBIknluSoHdYvJYujV2hFCgA73BAOw9CgXxWpJoly2tGo5EZQ1erCnoGJUA1oKXgQd+wBK8+iN/5VsKPUyamb0Qy25W/j0X+2oR0dZOVhf2jvEHvkAQvBw1I1ztWGnQPsDrQDQfGGQ+5wvfjqrVqr8UREHqhAmZ9/ZHPXtsrBvrPelWGORW8Qk35HVcTQiIwgTRoXO1Ou1iZ7ZAWKMMq3qMecW+0sQr/xXuCFyfzfGrtNraKc/a21JqeS/XUdXHO3xW/vU+dUjUV0kc/yhK+G6NG3oNurbCHtkHn8iw3gK7HStzL98W50CTu1Qdin2gks3SrbDTMs4wPiWoIzbz7XeJcaiaVdPOX6aL6FB0kqGrmtb6gnn5Hv7g32yT3w3pTEEzAxZIEb4aoAyqE+MUppqGoFNNSu/VEnIv3qG0eJ1I+eFLKh04ZyngBM6MJCIRdoBUOvLaxdz912pZHQUAbWoIqTF/asVtKO/eYCovMaLvT0EKB8YxjH7ssS9Yu2dx3oN4cnVkkggP85/18Vz19g9cqNDJdDGgX6FO718HsmVMT+/gVznG92wHdgMZgelDxPxpud1JtBApeS6ckK+uc720t/8TCCU5Ds9SaO8W99pCdL77XAf/8wsSwD8bLa+2mltAYM48YmNi9AtvclcrhM2SEapPSulqvUqdcAKa/bI4V9iJocsMoOByAzQQ7wQXOxSaxjzYQ2L35WFzVHhayMI//O/AgNg/ogxKA4QDvyWttVAO7DJ15lXrlyDm+44JllSEmImOl8GRhJ1TGq43C9IAe/drcIdUztzgt1PL6QzbIwpblgtS1nlWqZvsq3SJRsrxudFRzw6uYeSZLUjOuKgv8GLwc4E6wMIewwf8OulzMaOGCvycHixm6phs/mcxv79WN/X2TCxazyq2L/y/qPVpIf7FwsSSYQGPjueVtV8BikCdd/2GSK9vf7TtF/2Lc9PEAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Attraction Repulsion Behavior anuraghazra.github.io\"\n        title=\"Attraction Repulsion Behavior anuraghazra.github.io\"\n        src=\"/static/935dca25bf391f1a9ba931ef63df78bb/72799/example2.png\"\n        srcset=\"/static/935dca25bf391f1a9ba931ef63df78bb/12f09/example2.png 148w,\n/static/935dca25bf391f1a9ba931ef63df78bb/e4a3f/example2.png 295w,\n/static/935dca25bf391f1a9ba931ef63df78bb/72799/example2.png 320w\"\n        sizes=\"(max-width: 320px) 100vw, 320px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span>\n    <figcaption class=\"gatsby-resp-image-figcaption\">Attraction Repulsion Behavior anuraghazra.github.io</figcaption>\n  </figure>\n<figure class=\"gatsby-resp-image-figure\" style=\"\">\n    <span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 133px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/30c8f50c1d3ee945ea02e660ca28e51f/8ddb9/example3.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 200%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAoCAYAAAD+MdrbAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAENklEQVRIx+1WW29UVRSen2F8MBITEy8JEsODGBNiNKDRiFGMKBDj5QXxRRIjavCpGBMINT4YDcE04AuES4hXpK0KFEoptFR6mw60tDPTzpyZds4MMz1nXz7XXufS0/bMdDT65klOZs/e+3xnrfV969sngX/5SvwP+N8Aaq35DsdCend0zh83Dci/Stdf+zuAUTBdm0f1dCeqP56DdkVDsJUjJADrrT2YvGs934X39v7DlKXk3/muPkzd/SSyazYju/olTK3aAKd/xN+jmgPkt/ubnYEk0vc9g/yjryL/yGakH3wBIjXpl0TFRpmIIEXIUCFoqeUbWOu2w3p8O8oHDocZmD1x9UzUq5+5VDrnpX7kBzinOhfN1SMnEac9MTWD+Z/PQ41nAGLZfnMP7B0thOxApaZQI8ZFNt84wkDA5ip/fRSFJ96AvD4KeSOF6r421Fq/gxq8Cdk7yOlXjnzvPec/E5ty8DaVycE9cxF61oYuVSC7+iEvDUCX70AXS3Dbu6Gy1so1DAFnChyNebswYFeHIPuGIbsHeM5ErqabAfS7Q41NMgjX89J1iN97If7opXS9OdlzA2pyuhlATwqSolNjt73x0C2IX7ogfroAOXzLX09BjozH9vtiHQaAfSNQN9NehJ09HJG8MshRcga0ZtKOBhHPcgBI7aXSM0yKONvt1TRXhPiViLIrUCQreW04tmNiU1bJCU5bUutx+gbQmvP/pzh1U+cVI2QwEm+t7TSRQYyWyqxDlckzqBnruTLEhT5UD56ActxlxCwABoZwbQiFta9BUDcYEYuL/VCjExyROHcVqn8U7skOWLTHGVhex0ScE5d37cfsto9QO3QS+vY0Sru/gP3JlzTOovrVURS3fIDyx/R/ianUjTC35hVk792Iwsu7eK5CJQhazXp2B61tQG7tFrij4w0iDBgmdvNPvYPMqo2w399Huon0Kjl46d0WXrOe3wlZmFumxVg/dKlutWNnqEOuMAmBE7GMfuvx1kibK7qN5x6CGj/PtWOBU4uZchhTNWNJpOiJLDMfHBXxNYwcTCwR6luWSaXq6ZDMQN+pUYckuc+N0APragxI2jKbDaDOeCbKskl6vW3mFgBFE4AkbFM350Q7HPI9Jiq5AOh0dMM5ftarbUNhRyI0xZ8jNgt0JuvqPLedsmbpOHBQfPtTWtvrAbrNAJrij6fhGpchEpgUM29SN6SQrNyOy7wn7uRLLPs4IkZN8zMhFJVxl/CldBxoYxJ/jvGeKGDwfAhoQggmTQ8bezLsLn0gVIDv6Es/nhJxZ6wpuiKrgp9qKGx/3WjROd4eez5HIvQmix8eQP6BTbA/P7TIQKMGbH92kPfM7m6tk3LQx9QhmYc2IXPP05het3WRLKKyyj72Ou/JPPwiZFAWtaSGwURpfxvS9z/HDlMvwvK3p3iP3Xo4BAte+BfLkeBo19DShAAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"RagDoll anuraghazra.github.io\"\n        title=\"RagDoll anuraghazra.github.io\"\n        src=\"/static/30c8f50c1d3ee945ea02e660ca28e51f/8ddb9/example3.png\"\n        srcset=\"/static/30c8f50c1d3ee945ea02e660ca28e51f/8ddb9/example3.png 133w\"\n        sizes=\"(max-width: 133px) 100vw, 133px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span>\n    <figcaption class=\"gatsby-resp-image-figcaption\">RagDoll anuraghazra.github.io</figcaption>\n  </figure>\n<figure class=\"gatsby-resp-image-figure\" style=\"\">\n    <span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 339px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/35b26c6b121352319fc7cbfc61d51bf9/16caa/example4.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 110.8108108108108%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAWCAYAAADAQbwGAAAACXBIWXMAAA7DAAAOwwHHb6hkAAACMUlEQVQ4y62VWU/bQBDH8/0/Q1WJO4DtQNK0OZzAC0foU4GqJVDOVpV44AHktbETDzP/3XV8BBW1jTSZ8czsb3c8u+tamqb0v37CqgkuPh5TcnFL8ZczSr5fUXx6QfHJOcVii298PdPi/8rxb5ds87jzG8TSZAJoTf6eRycULDYpbAxIuX1o2A7b2zukNnsUbg11zGjl+Tqn3kE81UvUwOTsioLlDxrEAOjmLush6x2K2I7Ez7YAkSNa4OsdChmelQwgl6ssUBJldgNWLDfvNuhxswuosjmogoFrH6EBnFrg5c8ZUMT1s0EC+L3QoCenp8s3pWJSWeHqa8AlBnpFoDLPzyh/YHw5oEy40oZ+BehrqAAbGgjJANIQfzbpn4AyO1ZgOq3sBNIcs1oAvRKw0pQfdwxszQVWSpSYzfEMkO0KMBCgawDOW4EcX24jv7JtgsWW3rCuAXq6vEKJnt7s8EuOaNkdvLHnA5HcR0JoBtmBoQVwDBPjuQ+gbO4ikM+jHD0kOyWga4BuCWhyAVz7NA/YypIrwPw7y1aYA662cZaLwKXWbNZcWRaa6XyOBa60S5fDOLfCfPJbgSxFoC3ZMSU7pjzbdZSsdb7LEF6dHIoCUC7L4H0DNwfuNz7w0jl52arOst7V9kZXx+rGzz40c6FZBE7uH3D/RcMRhZ09igYjivoHFPYOtN3b59gRfJEvcsgx9u1+xjmXuzSdmBv7X78p6XRKyfWv4idAoH8r5Y/UC1vzG4hGuOg0AAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Cloth anuraghazra.github.io\"\n        title=\"Cloth anuraghazra.github.io\"\n        src=\"/static/35b26c6b121352319fc7cbfc61d51bf9/16caa/example4.png\"\n        srcset=\"/static/35b26c6b121352319fc7cbfc61d51bf9/12f09/example4.png 148w,\n/static/35b26c6b121352319fc7cbfc61d51bf9/e4a3f/example4.png 295w,\n/static/35b26c6b121352319fc7cbfc61d51bf9/16caa/example4.png 339w\"\n        sizes=\"(max-width: 339px) 100vw, 339px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span>\n    <figcaption class=\"gatsby-resp-image-figcaption\">Cloth anuraghazra.github.io</figcaption>\n  </figure></p>\n<p>Codepen examples:</p>\n<p><iframe src=\"https://codepen.io/anuraghazra/embed/preview/vwmLKo?default-tab=results\" style=\"width:100%; height:300px;\"></iframe></p>\n<p>Verly.js’s API is easy to use and flexible because of its Entity Component Structure.</p>\n<p>Thanks for reading — I hope you learned something!</p>\n<hr>\n<h3 id=\"Other-places-to-learn-about-Verlet-physics\" style=\"position:relative;\"><a href=\"#Other-places-to-learn-about-Verlet-physics\" aria-label=\"Other places to learn about Verlet physics permalink\" class=\"gatsby-remark-autolink 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>Other places to learn about Verlet physics:</h3>\n<blockquote>\n<p><a href=\"https://www.youtube.com/watch?v=3HjO_RGIjCU\">Keith Peter’s CodingMath Verlet Physics Videos.</a></p>\n</blockquote>\n<blockquote>\n<p>Amazing <a href=\"http://datagenetics.com/blog/july22018/index.html\">Article At DataGenetic</a></p>\n</blockquote>","timeToRead":9,"id":"5e71fd2a-4c9c-58ca-9a5d-dd1700b6cf67","frontmatter":{"date":"August 04, 2019","title":"Making a Verlet Physics Engine in Javascript"}}},"pageContext":{"slug":"/blog/making-a-verlet-physics-engine-in-javascript"}},"staticQueryHashes":["1033876704","3435786681","550521386"]}