<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Mathematics | Scicho</title><link>https://SadjadAbedi.ir/tags/mathematics/</link><atom:link href="https://SadjadAbedi.ir/tags/mathematics/index.xml" rel="self" type="application/rss+xml"/><description>Mathematics</description><generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Sun, 07 Apr 2024 00:00:00 +0000</lastBuildDate><image><url>https://SadjadAbedi.ir/media/icon_hu2154990329143673713.png</url><title>Mathematics</title><link>https://SadjadAbedi.ir/tags/mathematics/</link></image><item><title>Constructing Complex Shapes with Signed Distance Functions: The Heart Example</title><link>https://SadjadAbedi.ir/post/constructing-complex-shapes-with-signed-distance-functions-the-heart-example/</link><pubDate>Sun, 07 Apr 2024 00:00:00 +0000</pubDate><guid>https://SadjadAbedi.ir/post/constructing-complex-shapes-with-signed-distance-functions-the-heart-example/</guid><description>&lt;p>In this notebook, we&amp;rsquo;ll implement a signed distance function for a heart shape using Python and visualize it using matplotlib.&lt;/p>
&lt;h2 id="function-definitions">Function Definitions&lt;/h2>
&lt;p>The following functions are defined:&lt;/p>
&lt;ul>
&lt;li>&lt;code>line_sdf&lt;/code>: Calculates the signed distance from a point to a line segment.&lt;/li>
&lt;li>&lt;code>circle_sdf&lt;/code>: Calculates the signed distance from a point to a circle.&lt;/li>
&lt;li>&lt;code>intersect_sdf&lt;/code>: Calculates the signed distance field resulting from the intersection of two distance fields.&lt;/li>
&lt;li>&lt;code>union_sdf&lt;/code>: Calculates the signed distance field resulting from the union of two distance fields.&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="ln"> 1&lt;/span>&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">numpy&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">np&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 2&lt;/span>&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">matplotlib.pyplot&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">plt&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 3&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 4&lt;/span>&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">line_sdf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">P&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">x1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">x2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y2&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 5&lt;/span>&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 6&lt;/span>&lt;span class="cl">&lt;span class="s2"> Calculate the signed distance from a point P to a line segment
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 7&lt;/span>&lt;span class="cl">&lt;span class="s2"> defined by two endpoints (x1, y1) and (x2, y2).
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 8&lt;/span>&lt;span class="cl">&lt;span class="s2"> &amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 9&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">10&lt;/span>&lt;span class="cl"> &lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">array&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="n">x2&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">x1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y2&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">y1&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">11&lt;/span>&lt;span class="cl"> &lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">linalg&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">norm&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">12&lt;/span>&lt;span class="cl"> &lt;span class="n">b&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">P&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">array&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="n">x1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y1&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">13&lt;/span>&lt;span class="cl"> &lt;span class="n">d&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">dot&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">array&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]]))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">14&lt;/span>&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">d&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">15&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">16&lt;/span>&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">circle_sdf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">P&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">xc&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">yc&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">17&lt;/span>&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">18&lt;/span>&lt;span class="cl">&lt;span class="s2"> Calculate the signed distance from a point P to a circle defined by its center (xc, yc) and radius r.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">19&lt;/span>&lt;span class="cl">&lt;span class="s2"> &amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">20&lt;/span>&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sqrt&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">P&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">xc&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">**&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">P&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">yc&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">**&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">r&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">21&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">22&lt;/span>&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">intersect_sdf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">d1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">d2&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">23&lt;/span>&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">24&lt;/span>&lt;span class="cl">&lt;span class="s2"> Calculate the signed distance field resulting from the intersection of two distance fields (d1 and d2).
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">25&lt;/span>&lt;span class="cl">&lt;span class="s2"> &amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">26&lt;/span>&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nb">max&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">d1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">d2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">27&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">28&lt;/span>&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">union_sdf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">d1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">d2&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">29&lt;/span>&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">30&lt;/span>&lt;span class="cl">&lt;span class="s2"> Calculate the signed distance field resulting from the union of two distance fields (d1 and d2).
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">31&lt;/span>&lt;span class="cl">&lt;span class="s2"> &amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">32&lt;/span>&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nb">min&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">d1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">d2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="tangent-point-calculation">Tangent Point Calculation&lt;/h1>
&lt;p>The &lt;code>find_tangent_point&lt;/code> function finds the tangent point that has a specified distance from the bottom tip of the heart shape. This function is inspired by
and
.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="ln"> 1&lt;/span>&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">find_tangent_point&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">d1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">x2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">d2&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 2&lt;/span>&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 3&lt;/span>&lt;span class="cl">&lt;span class="s2"> Find the tangent point that has radius(d1) distance from center of circle
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 4&lt;/span>&lt;span class="cl">&lt;span class="s2"> and calculated distance (d2) from the bottom tip of the heart. The result is
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 5&lt;/span>&lt;span class="cl">&lt;span class="s2"> limited to desired tangent point.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 6&lt;/span>&lt;span class="cl">&lt;span class="s2"> &amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 7&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 8&lt;/span>&lt;span class="cl"> &lt;span class="n">centerdx&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">x1&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">x2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 9&lt;/span>&lt;span class="cl"> &lt;span class="n">centerdy&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">y1&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">y2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">10&lt;/span>&lt;span class="cl"> &lt;span class="n">R&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sqrt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">centerdx&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="mi">2&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">centerdy&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">11&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">12&lt;/span>&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nb">abs&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">d1&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">d2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="n">R&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="n">R&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="n">d1&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">d2&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">13&lt;/span>&lt;span class="cl"> &lt;span class="c1"># No intersections&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">14&lt;/span>&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">15&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">16&lt;/span>&lt;span class="cl"> &lt;span class="n">d1d2&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">d1&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="mi">2&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">d2&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="mi">2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">17&lt;/span>&lt;span class="cl"> &lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">d1d2&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">R&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">18&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">19&lt;/span>&lt;span class="cl"> &lt;span class="n">c&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sqrt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">d1&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="mi">2&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">d2&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="n">R&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="mi">2&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">d1d2&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="n">R&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="mi">4&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">20&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">21&lt;/span>&lt;span class="cl"> &lt;span class="n">fx&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">x1&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">x2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">x2&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">x1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">22&lt;/span>&lt;span class="cl"> &lt;span class="n">gx&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">c&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">y2&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">y1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="mi">2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">23&lt;/span>&lt;span class="cl"> &lt;span class="c1"># ix1 = fx + gx&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">24&lt;/span>&lt;span class="cl"> &lt;span class="n">ix2&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">fx&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">gx&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">25&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">26&lt;/span>&lt;span class="cl"> &lt;span class="n">fy&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">y1&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">y2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">y2&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">y1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">27&lt;/span>&lt;span class="cl"> &lt;span class="n">gy&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">c&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">x1&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">x2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="mi">2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">28&lt;/span>&lt;span class="cl"> &lt;span class="c1"># iy1 = fy + gy&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">29&lt;/span>&lt;span class="cl"> &lt;span class="n">iy2&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">fy&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">gy&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">30&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">31&lt;/span>&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">ix2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">iy2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="heart-shape-sdf">Heart Shape SDF&lt;/h1>
&lt;p>The &lt;code>heart_sdf&lt;/code> function calculates the signed distance from a point to a heart shape defined by two circles and three line segments.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="ln"> 1&lt;/span>&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">heart_sdf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 2&lt;/span>&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 3&lt;/span>&lt;span class="cl">&lt;span class="s2"> Calculate the signed distance from a point P to a heart shape defined by two circles and three line segments.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 4&lt;/span>&lt;span class="cl">&lt;span class="s2">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 5&lt;/span>&lt;span class="cl">&lt;span class="s2"> The heart shape consists of two circles representing the left and right sides, and three line segments representing the bottom tip and the tangent lines connecting the circles.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 6&lt;/span>&lt;span class="cl">&lt;span class="s2">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 7&lt;/span>&lt;span class="cl">&lt;span class="s2"> Parameters:
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 8&lt;/span>&lt;span class="cl">&lt;span class="s2"> p (tuple): A tuple containing the coordinates (x, y) of the point P.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 9&lt;/span>&lt;span class="cl">&lt;span class="s2"> r (float): The radius of the heart shape. Default is 4.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">10&lt;/span>&lt;span class="cl">&lt;span class="s2">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">11&lt;/span>&lt;span class="cl">&lt;span class="s2"> Returns:
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">12&lt;/span>&lt;span class="cl">&lt;span class="s2"> float: The signed distance from the point P to the heart shape. Negative values indicate that the point is inside the heart shape, zero indicates that the point is on the boundary, and positive values indicate that the point is outside the heart shape.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">13&lt;/span>&lt;span class="cl">&lt;span class="s2">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">14&lt;/span>&lt;span class="cl">&lt;span class="s2"> Note:
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">15&lt;/span>&lt;span class="cl">&lt;span class="s2"> The heart shape is constructed based on mathematical equations and geometric calculations. The function utilizes signed distance functions (SDFs) for circles and lines to determine the distance from the point P to various components of the heart shape.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">16&lt;/span>&lt;span class="cl">&lt;span class="s2"> &amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">17&lt;/span>&lt;span class="cl"> &lt;span class="c1"># Some experimental ratio for the center of circles based on their radius&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">18&lt;/span>&lt;span class="cl"> &lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">r&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">3&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="mi">4&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">19&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">20&lt;/span>&lt;span class="cl"> &lt;span class="n">circle1&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">circle_sdf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># Left Circle&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">21&lt;/span>&lt;span class="cl"> &lt;span class="n">circle2&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">circle_sdf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># Right Circle&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">22&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">23&lt;/span>&lt;span class="cl"> &lt;span class="c1"># Distance from bottom tip to center of circles&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">24&lt;/span>&lt;span class="cl"> &lt;span class="n">d2c&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sqrt&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">a&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">**&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">**&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">25&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">26&lt;/span>&lt;span class="cl"> &lt;span class="c1"># Distance to tangent point of circle using Pythagorean theorem&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">27&lt;/span>&lt;span class="cl"> &lt;span class="n">d2t&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sqrt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">d2c&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="mi">2&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">28&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">29&lt;/span>&lt;span class="cl"> &lt;span class="n">tpr&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">find_tangent_point&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">30&lt;/span>&lt;span class="cl"> &lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mi">2&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">d2t&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">31&lt;/span>&lt;span class="cl"> &lt;span class="p">)&lt;/span> &lt;span class="c1"># Tangent point on right circle&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">32&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">33&lt;/span>&lt;span class="cl"> &lt;span class="n">line1&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">line_sdf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="n">tpr&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">tpr&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mi">2&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">34&lt;/span>&lt;span class="cl"> &lt;span class="n">line2&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">line_sdf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mi">2&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">tpr&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">tpr&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">35&lt;/span>&lt;span class="cl"> &lt;span class="n">line3&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">line_sdf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">tpr&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">tpr&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="n">tpr&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">tpr&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">36&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">37&lt;/span>&lt;span class="cl"> &lt;span class="c1"># Create a triangle which base is the line that&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">38&lt;/span>&lt;span class="cl"> &lt;span class="c1"># connects tangent points and the vertex point is heart bottom tip&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">39&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">40&lt;/span>&lt;span class="cl"> &lt;span class="n">dl&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">intersect_sdf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">intersect_sdf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">line1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">line2&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">line3&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">41&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">42&lt;/span>&lt;span class="cl"> &lt;span class="n">d&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">union_sdf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">union_sdf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">circle1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">circle2&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">dl&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">43&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">44&lt;/span>&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">d&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="visualization">Visualization&lt;/h1>
&lt;p>The &lt;code>plot_sdf&lt;/code> function plots the signed distance function. This function is adopted from
project.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="ln"> 1&lt;/span>&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">plot_sdf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">SDF&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">BdBox&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">10&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mi">12&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">8&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">300&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 2&lt;/span>&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 3&lt;/span>&lt;span class="cl">&lt;span class="s2"> Plots the signed distance function.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 4&lt;/span>&lt;span class="cl">&lt;span class="s2"> &amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 5&lt;/span>&lt;span class="cl"> &lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">meshgrid&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 6&lt;/span>&lt;span class="cl"> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">linspace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">BdBox&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">BdBox&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 7&lt;/span>&lt;span class="cl"> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">linspace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">BdBox&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">BdBox&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 8&lt;/span>&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 9&lt;/span>&lt;span class="cl"> &lt;span class="n">points&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">hstack&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">reshape&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)),&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">reshape&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">))])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">10&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">11&lt;/span>&lt;span class="cl"> &lt;span class="n">sdf&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">fromiter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">map&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">SDF&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">points&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">dtype&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nb">float&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">12&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">13&lt;/span>&lt;span class="cl"> &lt;span class="n">inner&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">where&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sdf&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">14&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">15&lt;/span>&lt;span class="cl"> &lt;span class="n">_&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ax&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">plt&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">subplots&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">figsize&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">8&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">6&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">16&lt;/span>&lt;span class="cl"> &lt;span class="n">_&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ax&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">imshow&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">17&lt;/span>&lt;span class="cl"> &lt;span class="n">inner&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">reshape&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">)),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">18&lt;/span>&lt;span class="cl"> &lt;span class="n">extent&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">BdBox&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">BdBox&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">BdBox&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">BdBox&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">]),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">19&lt;/span>&lt;span class="cl"> &lt;span class="n">origin&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;lower&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">20&lt;/span>&lt;span class="cl"> &lt;span class="n">cmap&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;Reds&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">21&lt;/span>&lt;span class="cl"> &lt;span class="n">alpha&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mf">0.8&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">22&lt;/span>&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">23&lt;/span>&lt;span class="cl"> &lt;span class="n">ax&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">contour&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">sdf&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">reshape&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">)),&lt;/span> &lt;span class="n">levels&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">colors&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;gold&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">linewidths&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">24&lt;/span>&lt;span class="cl"> &lt;span class="n">ax&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">set_xlabel&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;X&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">fontweight&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;bold&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">25&lt;/span>&lt;span class="cl"> &lt;span class="n">ax&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">set_ylabel&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Y&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">fontweight&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;bold&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">26&lt;/span>&lt;span class="cl"> &lt;span class="n">ax&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">set_title&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;SDF Visualization&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">fontweight&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;bold&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">fontsize&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">16&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">27&lt;/span>&lt;span class="cl"> &lt;span class="n">ax&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">set_aspect&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;equal&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">28&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">29&lt;/span>&lt;span class="cl"> &lt;span class="n">plt&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">show&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Now let&amp;rsquo;s execute the &lt;code>plot_sdf&lt;/code> function to visualize the signed distance function for the heart shape.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">&lt;span class="n">plot_sdf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">heart_sdf&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="png" srcset="
/post/constructing-complex-shapes-with-signed-distance-functions-the-heart-example/featured_hu9725241531771170759.webp 400w,
/post/constructing-complex-shapes-with-signed-distance-functions-the-heart-example/featured_hu9352621534901351034.webp 760w,
/post/constructing-complex-shapes-with-signed-distance-functions-the-heart-example/featured_hu3098947801264897299.webp 1200w"
src="https://SadjadAbedi.ir/post/constructing-complex-shapes-with-signed-distance-functions-the-heart-example/featured_hu9725241531771170759.webp"
width="569"
height="551"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;div class="alert alert-note">
&lt;div>
The full code, ready to copy and try, is also available at
.
&lt;/div>
&lt;/div></description></item><item><title>Exploring Boolean Operations in SDFs: Union, Difference, and Intersection</title><link>https://SadjadAbedi.ir/post/exploring-boolean-operations-in-sdfs-union-difference-and-intersection/</link><pubDate>Mon, 18 Mar 2024 00:00:00 +0000</pubDate><guid>https://SadjadAbedi.ir/post/exploring-boolean-operations-in-sdfs-union-difference-and-intersection/</guid><description>&lt;p>In our
of Signed Distance Functions (SDFs), we unveiled their power in representing and manipulating geometric shapes. We also delved into the intricacies of SDFs for lines and rectangles. Now, let&amp;rsquo;s unlock the potential of Boolean operations on SDFs, enabling the creation of even more complex shapes.&lt;/p>
&lt;h2 id="merging-shapes-with-union-a-powerful-tool">Merging Shapes with Union: A Powerful Tool&lt;/h2>
&lt;p>The &lt;strong>Union&lt;/strong> operation in SDFs allows us to combine two or more shapes, essentially merging them into a single new shape. Mathematically, the union of two SDFs, $SDF_1$ and $SDF_2$, representing shapes A and B respectively, can be expressed as:&lt;/p>
&lt;p>$$
SDF_{Union}(P) = min(SDF_1(P), SDF_2(P))
$$&lt;/p>
&lt;p>This operation essentially takes the minimum distance value from either SDF at each point (P). Points outside of both shape A or B will have a positive SDF value, indicating they lie outside the combined shape. Points within both shapes A and B will have a negative value, signifying their position inside the resulting union shape.&lt;/p>
&lt;h2 style="text-align: center;">Union of Two Circles&lt;/h2>
&lt;iframe src="https://SadjadAbedi.ir/union_sdf.html" width="100%" height="400px" frameborder="0">&lt;/iframe>
&lt;blockquote>
&lt;p>The visualization of the union of two circles SDF is also available at
using
module.&lt;/p>
&lt;/blockquote>
&lt;h2 id="carving-shapes-with-difference-subtracting-one-from-another">Carving Shapes with Difference: Subtracting One from Another&lt;/h2>
&lt;p>The &lt;strong>Difference&lt;/strong> operation in Signed Distance Functions (SDFs) enables us to sculpt one shape by subtracting another. Mathematically, the difference of $SDF1$​ and $SDF2$​, representing shapes A and B respectively, can be defined as:&lt;/p>
&lt;p>$$
SDF_{Difference​}(P)=max(SDF_1​(P),−SDF_2​(P))
$$&lt;/p>
&lt;p>Here, the negative of $SDF_2$​ is taken prior to the maximum operation. This action effectively reverses the sign of distances originating from shape B. Points lying outside both shapes, as well as points residing inside shape A but also within shape B, will yield a positive SDF value. This indicates that they belong to the exterior of the resultant shape after the difference operation. Points situated within shape A but outside shape B will generate a negative value, denoting their inclusion within the final difference shape.&lt;/p>
&lt;h2 style="text-align: center;">Difference of Two Circles (Circle 1 - Circle 2)&lt;/h2>
&lt;iframe src="https://SadjadAbedi.ir/diff_sdf.html" width="100%" height="400px" frameborder="0">&lt;/iframe>
&lt;blockquote>
&lt;p>The visualization of the difference of two circles SDF is also available at
using
module.&lt;/p>
&lt;/blockquote>
&lt;h2 id="finding-the-common-ground-intersection-of-shapes">Finding the Common Ground: Intersection of Shapes&lt;/h2>
&lt;p>The &lt;strong>Intersection&lt;/strong> operation in SDFs allows us to identify the region where two shapes overlap. Mathematically, the intersection of $SDF_1$ and $SDF_2$ can be expressed as:&lt;/p>
&lt;p>$$
SDF_{Intersection}(P) = max(SDF_1(P), SDF_2(P))
$$&lt;/p>
&lt;p>In this case, the maximum distance value is taken. Points outside both shapes A and B will have positive SDF values. Points inside either shape A or B (but not their overlap) will also have positive values. Points that lie within the overlapping region of both shapes A and B will have a negative SDF value, signifying their location within the intersection.&lt;/p>
&lt;h2 style="text-align: center;">Intersection of Two Circles&lt;/h2>
&lt;iframe src="https://SadjadAbedi.ir/intersect_sdf.html" width="100%" height="400px" frameborder="0">&lt;/iframe>
&lt;blockquote>
&lt;p>The visualization of the intersection of two circles SDF is also available at
using
module.&lt;/p>
&lt;/blockquote>
&lt;h2 id="a-composition-of-lines-the-sdf-of-a-rectangle">A Composition of Lines: The SDF of a Rectangle&lt;/h2>
&lt;p>While we&amp;rsquo;ve explored circles and other shapes, it&amp;rsquo;s important to remember that even seemingly basic shapes can be constructed using SDFs and Boolean operations. Take a rectangle, for instance. We can define a rectangle as the &lt;strong>intersection&lt;/strong> of four lines, each representing the distance to an edge:&lt;/p>
&lt;ul>
&lt;li>The distance to the top edge of the rectangle.&lt;/li>
&lt;li>The distance to the bottom edge.&lt;/li>
&lt;li>The distance to the left edge.&lt;/li>
&lt;li>The distance to the right edge.&lt;/li>
&lt;/ul>
&lt;h2 style="text-align: center;">Rectangle SDF&lt;/h2>
&lt;iframe src="https://SadjadAbedi.ir/rect_sdf.html" width="100%" height="400px" frameborder="0">&lt;/iframe>
&lt;blockquote>
&lt;p>The visualization of the rectangle defined by intersection of 4 lines is also available at
using
module.&lt;/p>
&lt;/blockquote>
&lt;p>The order of these intersections does not matter. Taking the maximum distance (intersection) from all four lines simultaneously would define a rectangle. Alternatively, we can perform the intersection progressively.&lt;/p>
&lt;p>This concept extends beyond rectangles. Any polygon can be defined similarly using the intersection of line SDFs representing distances to its edges.&lt;/p>
&lt;h2 id="defining-complex-domains-with-sdf-boolean-operations">Defining Complex Domains with SDF Boolean Operations&lt;/h2>
&lt;p>By mastering Boolean operations on SDFs, we unlock the ability to create mathematically defined representations of even intricate 2D domains. From simple geometric shapes to elaborate, user-defined patterns, these techniques empower us to model a vast array of scenarios. This opens doors for various applications, from scientific simulations to artistic expression, all leveraging the power of mathematics and code to define complex shapes and spaces.&lt;/p></description></item><item><title>Mathematics of 2D Shapes: Line and Rectangle SDFs Unveiled</title><link>https://SadjadAbedi.ir/post/mathematics-of-2d-shapes-line-and-rectangle-sdfs-unveiled/</link><pubDate>Fri, 15 Dec 2023 00:00:00 +0000</pubDate><guid>https://SadjadAbedi.ir/post/mathematics-of-2d-shapes-line-and-rectangle-sdfs-unveiled/</guid><description>&lt;p>In our
of Signed Distance Functions (SDFs), we demystified their role in representing and manipulating geometric shapes. Now, let&amp;rsquo;s delve deeper into the mathematical intricacies of SDFs, focusing specifically on lines and rectangles in 2D geometry.&lt;/p>
&lt;h2 id="the-significance-of-line-sdfs">The Significance of Line SDFs&lt;/h2>
&lt;p>A &lt;strong>Line Signed Distance Function (SDF)&lt;/strong> assigns a real number to each point in space, representing the distance from that point to the nearest point on a specified line. The sign of this distance indicates whether the point lies to the left or right of the line. Mathematically, the signed distance from a point $ P(x,y) $ to a line $L$ defined by two points $ (x_1, y_1) $ and $ (x_2, y_2) $ on it can be calculated in three steps:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Vector Representation:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Define vector $ \mathbf{a} $ as the direction vector of the line:
$$ \mathbf{a} = \begin{bmatrix} x_2 - x_1 \ y_2 - y_1 \end{bmatrix} $$&lt;/li>
&lt;li>Normalize $ \mathbf{a} $ to obtain a unit vector $ \hat{\mathbf{a}} $:
$$ \hat{\mathbf{a}} = \frac{\mathbf{a}}{|\mathbf{a}|} $$&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Position Vector:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Define vector $ \mathbf{b} $ as the position vector from any point on the line $L$ to point $ P $: $$ \mathbf{b} = \begin{bmatrix} x - x_1 \ y - y_1 \end{bmatrix} $$&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Dot Product:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Calculate the dot product of $ \mathbf{b} $ and a vector perpendicular to $ \mathbf{a} $: $$ d = \mathbf{b} \cdot \begin{bmatrix} a_y \ -a_x \end{bmatrix} $$&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;h3 id="understanding-line-sdf-values">Understanding Line SDF Values&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Positive SDF:&lt;/strong> Points to the right of the line (when facing along the line&amp;rsquo;s direction) will have a positive SDF value.&lt;/li>
&lt;li>&lt;strong>Negative SDF:&lt;/strong> Points to the left of the line will have a negative SDF value.&lt;/li>
&lt;li>&lt;strong>Zero SDF:&lt;/strong> Points lying on the line will have an SDF value of zero.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>The visualization of line SDF is available at
using
module.&lt;/p>
&lt;/blockquote>
&lt;h3 id="unraveling-rectangle-sdfs">Unraveling Rectangle SDFs&lt;/h3>
&lt;p>Continuing our exploration of signed distance functions (SDFs), let&amp;rsquo;s delve into rectangles. A rectangle can be defined by its bottom-left corner coordinates $(x_1, y_1)$ and top-right corner coordinates $(x_2, y_2)$. The signed distance function $d_{\text{Rectangle}}$ for a point $P = (x, y)$ to this rectangle is expressed as:&lt;/p>
&lt;p>$$
d_{\text{Rectangle}}(P) = \max\left(x_1 - x, x - x_2, y_1 - y, y - y_2, 0\right)
$$&lt;/p>
&lt;p>The function accounts for the distances to each side of the rectangle, considering negative distances for points inside the rectangle and positive distances for points outside. The overall signed distance is determined by taking the maximum among these distances.&lt;/p>
&lt;h3 id="directionality-matters">Directionality Matters&lt;/h3>
&lt;p>For rectangles, the order of corner points matters, affecting the orientation of the SDF. Ensure consistency in the order to maintain a coherent representation.&lt;/p>
&lt;blockquote>
&lt;p>The visualization of rectangle SDF is available at
using
module.&lt;/p>
&lt;/blockquote>
&lt;h2 id="other-2d-shapes-with-known-sdfs">Other 2D Shapes with Known SDFs&lt;/h2>
&lt;p>In addition to
,
and
, various other 2D shapes have well-defined SDFs. While we won&amp;rsquo;t delve deep into them in this post, some noteworthy shapes include ellipses, triangles, and regular polygons.&lt;/p>
&lt;p>By understanding the mathematics behind SDFs for lines and rectangles, we pave the way for more advanced explorations into 2D geometry and computational modeling. Stay tuned for future posts as we continue our journey through the captivating world of implicit geometry.&lt;/p>
&lt;p>Feel free to experiment with the provided mathematical expressions and incorporate visual illustrations to enhance your understanding. Mathematics becomes a powerful tool when coupled with visualization.&lt;/p>
&lt;p>Happy exploring!&lt;/p></description></item><item><title>Demystifying Signed Distance Functions</title><link>https://SadjadAbedi.ir/post/demystifying-signed-distance-functions/</link><pubDate>Sun, 10 Dec 2023 00:00:00 +0000</pubDate><guid>https://SadjadAbedi.ir/post/demystifying-signed-distance-functions/</guid><description>&lt;h1 id="demystifying-signed-distance-functions">Demystifying Signed Distance Functions&lt;/h1>
&lt;p>In the realm of mathematics and computer graphics, signed distance functions (SDFs) play a pivotal role in representing and manipulating geometric shapes. Unlike traditional polygonal meshes, which store vertices and connectivity information, SDFs define shapes implicitly, offering a powerful and flexible approach to 3D modeling and simulation.&lt;/p>
&lt;h2 id="what-is-a-signed-distance-function">What is a Signed Distance Function?&lt;/h2>
&lt;p>At its core, an SDF is a mathematical function that assigns a real number to each point in space, representing the distance from that point to the nearest boundary of a specified shape. This distance value carries a sign, indicating whether the point lies inside, outside, or on the boundary of the shape.&lt;/p>
&lt;h3 id="properties-of-signed-distance-functions">Properties of Signed Distance Functions&lt;/h3>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Non-parametric Representation:&lt;/strong> SDFs describe shapes without explicit geometric data, making them ideal for representing complex shapes and adapting to deformations.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Global Shape Representation:&lt;/strong> SDFs provide a global representation of a shape, allowing for efficient proximity queries and intersection detection crucial for computational geometry.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Differentiable:&lt;/strong> SDFs are differentiable, enabling smooth transitions between different shape representations and their derivatives, a key aspect in mesh generation.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h3 id="applications-of-signed-distance-functions">Applications of Signed Distance Functions&lt;/h3>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Mesh Generation for Physics Simulations:&lt;/strong> SDFs are widely used in physics simulations to represent objects and their interactions, enabling the creation of high-quality meshes representing objects with complex shapes, realistic collision detection and physics calculations.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Level of Detail (LOD):&lt;/strong> SDFs facilitate efficient LOD management by allowing for the creation of high-quality representations at various levels of detail.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Procedural Modeling:&lt;/strong> SDFs are the foundation of procedural modeling techniques, enabling the creation of organic and complex shapes from simple mathematical rules.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Graphics Rendering:&lt;/strong> SDFs play a crucial role in ray tracing algorithms, enabling ray casting and intersection detection for realistic graphics rendering.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="understanding-the-mathematical-significance">Understanding the Mathematical Significance&lt;/h2>
&lt;p>In mathematical terms, the sign of the distance values generated by the SDF holds crucial information about the relative position of a point to the shape:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Negative Values:&lt;/strong> Points with negative SDF values lie inside the shape&amp;rsquo;s boundary. The magnitude of the negative value represents how far inside the point is relative to the nearest surface.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Positive Values:&lt;/strong> Points with positive SDF values are located outside the shape. Similar to negative values, the magnitude indicates the distance from the point to the nearest surface outside the shape.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Zero Value:&lt;/strong> A point with an SDF value of zero resides exactly on the shape&amp;rsquo;s boundary.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>Mathematically, the SDF function can be represented as follows for a given point $P$ in space:&lt;/p>
&lt;p>$$ SDF(P) = \text{Distance from } P \text{ to the nearest surface} $$&lt;/p>
&lt;p>The sign of $SDF(P)$ provides a concise indication of whether the point $P$ is inside, outside, or on the boundary of the represented shape.&lt;/p>
&lt;p>This mathematical understanding is foundational for computational geometry algorithms and plays a pivotal role in mesh generation processes, guiding the placement of vertices and defining the geometry of the resulting mesh.&lt;/p>
&lt;h3 id="mathematical-example-sdf-for-a-circle">Mathematical Example: SDF for a Circle&lt;/h3>
&lt;p>Consider a two-dimensional space ($x, y$) and a circle centered at the origin with a radius of $r$. The SDF for this circle ($SDF_{\text{circle}}$) at a given point $(x, y)$ can be expressed as follows:&lt;/p>
&lt;p>$$
SDF_{\text{circle}}(x, y) = \sqrt{x^2 + y^2} - r
$$&lt;/p>
&lt;p>In this equation:&lt;/p>
&lt;ul>
&lt;li>$SDF_{\text{circle}}(x, y)$ is the signed distance function for the circle.&lt;/li>
&lt;li>$\sqrt{x^2 + y^2}$ calculates the Euclidean distance from the point $(x, y)$ to the origin.&lt;/li>
&lt;li>$r$ is the radius of the circle.&lt;/li>
&lt;/ul>
&lt;p>Now, let&amp;rsquo;s break down the sign of $SDF_{\text{circle}}(x, y)$ based on the relative position of the point to the circle:&lt;/p>
&lt;ul>
&lt;li>If $SDF_{\text{circle}}(x, y) &amp;lt; 0$, the point $(x, y)$ is inside the circle.&lt;/li>
&lt;li>If $SDF_{\text{circle}}(x, y) &amp;gt; 0$, the point $(x, y)$ is outside the circle.&lt;/li>
&lt;li>If $SDF_{\text{circle}}(x, y) = 0$, the point $(x, y)$ is exactly on the boundary of the circle.&lt;/li>
&lt;/ul>
&lt;p>This mathematical example illustrates how the SDF values can be computed for a simple geometric shape like a circle, forming the basis for more complex computations in computational geometry and mesh generation.&lt;/p>
&lt;h3 id="example-python-code-creating-a-circle-sdf">Example Python Code: Creating a Circle SDF&lt;/h3>
&lt;p>The following Python code defines an SDF function for a circle:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">numpy&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">np&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">circle_sdf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">center&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">radius&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">80&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sqrt&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">center&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">])&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="mi">2&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">y&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">center&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">])&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">radius&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This function takes two-dimensional coordinates as input and returns the distance from the point to the circle&amp;rsquo;s boundary.&lt;/p>
&lt;h2 style="text-align: center;">Signed Distance Function Visualization&lt;/h2>
&lt;iframe src="https://SadjadAbedi.ir/circle_sdf.html" width="100%" height="400px" frameborder="0">&lt;/iframe>
&lt;blockquote>
&lt;p>The visualization of circle SDF is also available at
using
module.&lt;/p>
&lt;/blockquote></description></item></channel></rss>