add mathematical function to string function for braille and block characters

This commit is contained in:
2019-11-15 16:05:54 +01:00
parent 0041abe8f3
commit 1de007a285
48 changed files with 6987 additions and 82 deletions

View File

@@ -147,7 +147,7 @@
<span class="sd"> linear speed.</span>
<span class="sd"> .. seealso::</span>
<span class="sd"> :meth:`function_cosine_wave_degree`</span>
<span class="sd"> :meth:`cosine_wave`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">degree</span><span class="p">:</span>
<span class="n">phi</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">radians</span><span class="p">(</span><span class="n">phi</span><span class="p">)</span>
@@ -179,7 +179,7 @@
<span class="sd"> time t</span>
<span class="sd"> .. seealso::</span>
<span class="sd"> :meth:`function_sine_wave_degree`</span>
<span class="sd"> :meth:`sine_wave`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">degree</span><span class="p">:</span>
<span class="n">phi</span> <span class="o">=</span> <span class="n">phi</span> <span class="o">+</span> <span class="mi">90</span>
@@ -285,6 +285,166 @@
<span class="n">y</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">theta</span><span class="p">:</span> <span class="p">(</span><span class="n">R</span><span class="o">+</span><span class="n">r</span><span class="p">)</span><span class="o">*</span><span class="n">math</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span> <span class="o">-</span> <span class="n">d</span><span class="o">*</span><span class="n">math</span><span class="o">.</span><span class="n">sin</span><span class="p">((</span><span class="n">R</span><span class="o">+</span><span class="n">r</span><span class="p">)</span><span class="o">/</span><span class="n">r</span> <span class="o">*</span> <span class="n">theta</span><span class="p">)</span>
<span class="n">theta_end</span> <span class="o">=</span> <span class="mi">2</span><span class="o">*</span><span class="n">math</span><span class="o">.</span><span class="n">pi</span>
<span class="k">return</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">theta_end</span></div>
<div class="viewcode-block" id="to_str"><a class="viewcode-back" href="../function.html#function.to_str">[docs]</a><span class="k">def</span> <span class="nf">to_str</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">x</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">x_0</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">x_1</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">t</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">h</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">w</span><span class="o">=</span><span class="mi">80</span><span class="p">,</span> <span class="n">density</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">char_set</span><span class="o">=</span><span class="s2">&quot;line&quot;</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Represent functions as string frame with a specific character set.</span>
<span class="sd"> which are normed to the range of [0, 1] to</span>
<span class="sd"> :param f: function or list of functions normed to the range of [0, 1]</span>
<span class="sd"> :type f: function or list</span>
<span class="sd"> :param h: number of chars in vertical direction</span>
<span class="sd"> :type h: int</span>
<span class="sd"> :param w: number of chars in horizontal direction</span>
<span class="sd"> :type w: int</span>
<span class="sd"> :param char_set: either &quot;braille&quot; or &quot;block&quot;. &quot;braille&quot; uses Unicode</span>
<span class="sd"> Characters in the Braille Patterns Block (fisrt index U+2800, last</span>
<span class="sd"> index U+28FF [CUDB]_) and the &quot;block&quot; uses part of the Unicode</span>
<span class="sd"> Characters in the Block Elements Block (fisrt index U+2580, last</span>
<span class="sd"> index U+259F [CUDB]_). Alias for braille is line and alias for</span>
<span class="sd"> block is histogram</span>
<span class="sd"> :type char_set: str</span>
<span class="sd"> Usage:</span>
<span class="sd"> * case dependent arguments</span>
<span class="sd"> * 1 quasi line plot (braille characters)</span>
<span class="sd"> f = lambda function (lambda x, t=0: ...)</span>
<span class="sd"> x_1 = max x value</span>
<span class="sd"> x_0 = min x value</span>
<span class="sd"> t = time (animation)</span>
<span class="sd"> * 2 histogram (block characters)</span>
<span class="sd"> f = lambda function (lambda x, t=0: ...)</span>
<span class="sd"> x_1 = max x value</span>
<span class="sd"> x_0 = min x value</span>
<span class="sd"> t = time (animation)</span>
<span class="sd"> chart=&quot;histogram&quot;</span>
<span class="sd"> * general arguments</span>
<span class="sd"> w = window width in number of chars</span>
<span class="sd"> density = number of data point per pixel (for line chart higher density makes thicker lines)</span>
<span class="sd"> chart = either &quot;line&quot; or &quot;histogram&quot;</span>
<span class="sd"> .. rubric:: Braille Patterns Block</span>
<span class="sd"> * Dots or pixels per character in vertical direction: 6</span>
<span class="sd"> * Dots or pixels per character in horizontal direction: 2</span>
<span class="sd"> First dot (bottom left) is the zero (0) position of the</span>
<span class="sd"> function. So, a function value of zero does not mean to have zero</span>
<span class="sd"> dots but one.</span>
<span class="sd"> Example of 3 columns and 3 rows (upside down view of &#39;normal&#39; braille/drawille position)</span>
<span class="sd"> ::</span>
<span class="sd"> | ^ y axis</span>
<span class="sd"> | |</span>
<span class="sd"> | ,_____,,_____,,_____,</span>
<span class="sd"> 7 + | * *|| * *|| * *|</span>
<span class="sd"> 6 + | * *|| * *|| * *|</span>
<span class="sd"> 5 + | * *|| * *|| * *|</span>
<span class="sd"> 4 + | * *|| * *|| * *|</span>
<span class="sd"> | ;=====;;=====;;=====;</span>
<span class="sd"> 3 + | * *|| * *|| * *|</span>
<span class="sd"> 2 + | * *|| * *|| * *|</span>
<span class="sd"> 1 + | * *|| * *|| * *|</span>
<span class="sd"> 0 + - | * *|| * *|| * *| ---&gt; x axis</span>
<span class="sd"> | ;=====;;=====;;=====;</span>
<span class="sd"> -1 + | * *|| * *|| * *|</span>
<span class="sd"> -2 + | * *|| * *|| * *|</span>
<span class="sd"> -3 + | * *|| * *|| * *|</span>
<span class="sd"> -4 + | * *|| * *|| * *|</span>
<span class="sd"> | `````````````````````</span>
<span class="sd"> | |</span>
<span class="sd"> `-----+--+---+--+---+--+-------------</span>
<span class="sd"> -2 -1 0 1 2 3</span>
<span class="sd"> .. rubric:: Block Elements Block</span>
<span class="sd"> * Dots or pixels per character in vertical direction: 8</span>
<span class="sd"> * Dots or pixels per character in horizontal direction: 1</span>
<span class="sd"> Example of 3 columns and 3 rows</span>
<span class="sd"> ::</span>
<span class="sd"> | ^ y axis</span>
<span class="sd"> | |</span>
<span class="sd"> | ,_____,,_____,,_____,</span>
<span class="sd"> 15 + | --- || --- || --- |</span>
<span class="sd"> 14 + | --- || --- || --- |</span>
<span class="sd"> 13 + | --- || --- || --- |</span>
<span class="sd"> 12 + | --- || --- || --- |</span>
<span class="sd"> 11 + | --- || --- || --- |</span>
<span class="sd"> 10 + | --- || --- || --- |</span>
<span class="sd"> 9 + | --- || --- || --- |</span>
<span class="sd"> 8 + | --- || --- || --- |</span>
<span class="sd"> | ;=====;;=====;;=====;</span>
<span class="sd"> 7 + | --- || --- || --- |</span>
<span class="sd"> 6 + | --- || --- || --- |</span>
<span class="sd"> 5 + | --- || --- || --- |</span>
<span class="sd"> 4 + | --- || --- || --- |</span>
<span class="sd"> 3 + | --- || --- || --- |</span>
<span class="sd"> 2 + | --- || --- || --- |</span>
<span class="sd"> 1 + | --- || --- || --- |</span>
<span class="sd"> 0 + - | --- || --- || --- | ---&gt; x axis</span>
<span class="sd"> | ;=====;;=====;;=====;</span>
<span class="sd"> -1 + | --- || --- || --- |</span>
<span class="sd"> -2 + | --- || --- || --- |</span>
<span class="sd"> -3 + | --- || --- || --- |</span>
<span class="sd"> -4 + | --- || --- || --- |</span>
<span class="sd"> -5 + | --- || --- || --- |</span>
<span class="sd"> -6 + | --- || --- || --- |</span>
<span class="sd"> -7 + | --- || --- || --- |</span>
<span class="sd"> -8 + | --- || --- || --- |</span>
<span class="sd"> | `````````````````````</span>
<span class="sd"> | |</span>
<span class="sd"> `------+------+------+---------------</span>
<span class="sd"> -1 0 1</span>
<span class="sd"> .. rubric:: References</span>
<span class="sd"> .. [CUDB] `Unicode Database - Blocks &lt;ftp://ftp.unicode.org/Public/UNIDATA/Blocks.txt&gt;`_</span>
<span class="sd"> .. seealso::</span>
<span class="sd"> :meth:`pylib.function.transformation`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># scale function to used chars and dots/pixel in y direction (4 for braille characters): from [0, 1] to [0, chars*4-1]</span>
<span class="c1"># negate the function because the y axis is pointing downwards: from [0, 1] to [-1, 0] or from [0, chars*4-1] to [-(chars*4-1), 0]</span>
<span class="c1"># and becasue of the negation shift the function by one dot/pixel, otherwise the function would need another char, because the 0 is on an another char on the &quot;positive side&quot;.</span>
<span class="c1"># devide the time by the number of dots/pixel in x direction (2 for braille characters)</span>
<span class="n">window_factor</span> <span class="o">=</span> <span class="n">w</span><span class="o">/</span><span class="p">(</span><span class="n">x_1</span><span class="o">-</span><span class="n">x_0</span><span class="p">)</span>
<span class="n">frame</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="k">if</span> <span class="n">char_set</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">&quot;line&quot;</span><span class="p">,</span> <span class="s2">&quot;braille&quot;</span><span class="p">]:</span>
<span class="n">pixels_horizontal</span> <span class="o">=</span> <span class="mi">2</span>
<span class="n">pixels_vertical</span> <span class="o">=</span> <span class="mi">4</span>
<span class="n">a</span> <span class="o">=</span> <span class="o">-</span><span class="p">(</span><span class="n">h</span><span class="o">*</span><span class="n">pixels_vertical</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
<span class="n">b</span> <span class="o">=</span> <span class="mi">1</span><span class="o">/</span><span class="n">pixels_horizontal</span>
<span class="n">f</span> <span class="o">=</span> <span class="n">transformation</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
<span class="n">canvas</span> <span class="o">=</span> <span class="n">drawille</span><span class="o">.</span><span class="n">Canvas</span><span class="p">()</span>
<span class="c1"># divide step width of the sequence by 2 (double density, 2 dots/pixel per char)</span>
<span class="c1"># multiplicate x by 2 (2 dots/pixel per char)</span>
<span class="k">for</span> <span class="n">x_i</span> <span class="ow">in</span> <span class="n">seq</span><span class="p">(</span><span class="n">x_0</span><span class="o">*</span><span class="n">window_factor</span><span class="o">*</span><span class="n">pixels_horizontal</span><span class="p">,</span> <span class="n">x_1</span><span class="o">*</span><span class="n">window_factor</span><span class="o">*</span><span class="n">pixels_horizontal</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="n">density</span><span class="p">):</span>
<span class="n">canvas</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">x_i</span><span class="p">,</span> <span class="n">f</span><span class="p">(</span><span class="n">x_i</span><span class="p">,</span> <span class="n">t</span><span class="p">))</span>
<span class="c1">#frame = canvas.frame(min_x=a*pixel_per_char, min_y=1, max_x=b*pixel_per_char, max_y=21)</span>
<span class="n">frame</span> <span class="o">=</span> <span class="n">canvas</span><span class="o">.</span><span class="n">frame</span><span class="p">()</span>
<span class="k">elif</span> <span class="n">char_set</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">&quot;histogram&quot;</span><span class="p">,</span> <span class="s2">&quot;block&quot;</span><span class="p">]:</span>
<span class="n">pixels_horizontal</span> <span class="o">=</span> <span class="mi">1</span>
<span class="n">pixels_vertical</span> <span class="o">=</span> <span class="mi">8</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">h</span><span class="o">*</span><span class="n">pixels_vertical</span><span class="o">-</span><span class="mi">1</span>
<span class="n">f</span> <span class="o">=</span> <span class="n">transformation</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="n">density</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">density</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> <span class="c1"># density max 1!</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">seq</span><span class="p">(</span><span class="n">x_0</span><span class="o">*</span><span class="n">window_factor</span><span class="p">,</span> <span class="n">x_1</span><span class="o">*</span><span class="n">window_factor</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="n">pixels_horizontal</span><span class="o">/</span><span class="n">density</span><span class="p">)</span>
<span class="n">f</span> <span class="o">=</span> <span class="p">[</span><span class="n">f</span><span class="p">(</span><span class="n">xi</span><span class="p">,</span> <span class="n">t</span><span class="p">)</span> <span class="k">for</span> <span class="n">xi</span> <span class="ow">in</span> <span class="n">x</span><span class="p">]</span>
<span class="n">frame</span> <span class="o">=</span> <span class="n">drawblock</span><span class="o">.</span><span class="n">histogram</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span>
<span class="k">return</span> <span class="n">frame</span></div>
</pre></div>
</div>
@@ -339,7 +499,7 @@
&copy;2019, Daniel Weschke.
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 2.2.0</a>
Powered by <a href="http://sphinx-doc.org/">Sphinx 2.2.1</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>