743 lines
60 KiB
HTML
743 lines
60 KiB
HTML
|
||
<!DOCTYPE html>
|
||
|
||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||
<head>
|
||
<meta charset="utf-8" />
|
||
<title>pylib.function — pylib 2019.12.21 documentation</title>
|
||
<link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
|
||
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
|
||
<link rel="stylesheet" href="../../_static/custom.css" type="text/css" />
|
||
<script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
|
||
<script type="text/javascript" src="../../_static/jquery.js"></script>
|
||
<script type="text/javascript" src="../../_static/underscore.js"></script>
|
||
<script type="text/javascript" src="../../_static/doctools.js"></script>
|
||
<script type="text/javascript" src="../../_static/language_data.js"></script>
|
||
<script async="async" type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
|
||
<link rel="index" title="Index" href="../../genindex.html" />
|
||
<link rel="search" title="Search" href="../../search.html" />
|
||
|
||
<link rel="stylesheet" href="../../_static/custom.css" type="text/css" />
|
||
|
||
|
||
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
|
||
|
||
</head><body>
|
||
|
||
|
||
<div class="document">
|
||
<div class="documentwrapper">
|
||
<div class="bodywrapper">
|
||
|
||
|
||
<div class="body" role="main">
|
||
|
||
<h1>Source code for pylib.function</h1><div class="highlight"><pre>
|
||
<span></span><span class="ch">#!/usr/bin/env python</span>
|
||
<span class="c1"># -*- coding: utf-8 -*-</span>
|
||
<span class="sd">"""Mathematical equations.</span>
|
||
|
||
<span class="sd">:Date: 2019-11-15</span>
|
||
|
||
<span class="sd">.. module:: function</span>
|
||
<span class="sd"> :platform: *nix, Windows</span>
|
||
<span class="sd"> :synopsis: Mathematical equations.</span>
|
||
|
||
<span class="sd">.. moduleauthor:: Daniel Weschke <daniel.weschke@directbox.de></span>
|
||
|
||
<span class="sd">Functions returns function to apply conditions.</span>
|
||
<span class="sd">"""</span>
|
||
<span class="kn">import</span> <span class="nn">math</span>
|
||
<span class="kn">from</span> <span class="nn">.data</span> <span class="kn">import</span> <span class="n">seq</span>
|
||
<span class="kn">from</span> <span class="nn">.mathematics</span> <span class="kn">import</span> <span class="n">lcm</span>
|
||
|
||
<div class="viewcode-block" id="transformation"><a class="viewcode-back" href="../../pylib.function.html#pylib.function.transformation">[docs]</a><span class="k">def</span> <span class="nf">transformation</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">scale_vertical</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">scale_horizontal</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
|
||
<span class="n">shift_horizontal</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">shift_vertical</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
|
||
<span class="sa">r</span><span class="sd">"""Transform functions.</span>
|
||
|
||
<span class="sd"> :param f: function or list of functions</span>
|
||
<span class="sd"> :type f: function or list</span>
|
||
<span class="sd"> :param scale_vertical: "a" scale factor in vertical direction (default</span>
|
||
<span class="sd"> = 1)</span>
|
||
<span class="sd"> :type height: float</span>
|
||
<span class="sd"> :param scale_horizontal: "b" scale factor in horizontal direction</span>
|
||
<span class="sd"> (default = 1)</span>
|
||
<span class="sd"> :type height: float</span>
|
||
<span class="sd"> :param shift_horizontal: "c" shift factor in horizontal direction</span>
|
||
<span class="sd"> (default = 0)</span>
|
||
<span class="sd"> :type height: float</span>
|
||
<span class="sd"> :param shift_vertical: "d" shift factor in vertical direction (default</span>
|
||
<span class="sd"> = 0)</span>
|
||
<span class="sd"> :type height: float</span>
|
||
|
||
<span class="sd"> :returns: transformed function or list of transformed functions</span>
|
||
<span class="sd"> :rtype: function or list</span>
|
||
|
||
<span class="sd"> .. math::</span>
|
||
<span class="sd"> y = a \, f(b\,(x-c)) + d</span>
|
||
<span class="sd"> """</span>
|
||
<span class="c1"># shorter variables</span>
|
||
<span class="n">a</span> <span class="o">=</span> <span class="n">scale_vertical</span>
|
||
<span class="n">b</span> <span class="o">=</span> <span class="n">scale_horizontal</span>
|
||
<span class="n">c</span> <span class="o">=</span> <span class="n">shift_horizontal</span>
|
||
<span class="n">d</span> <span class="o">=</span> <span class="n">shift_vertical</span>
|
||
|
||
<span class="c1"># check if f is a function than put it in a list and return only</span>
|
||
<span class="c1"># the function, not the one element list</span>
|
||
<span class="k">if</span> <span class="n">callable</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">transformation</span><span class="p">(</span>
|
||
<span class="p">[</span><span class="n">f</span><span class="p">],</span> <span class="n">scale_vertical</span><span class="o">=</span><span class="n">a</span><span class="p">,</span> <span class="n">scale_horizontal</span><span class="o">=</span><span class="n">b</span><span class="p">,</span> <span class="n">shift_horizontal</span><span class="o">=</span><span class="n">c</span><span class="p">,</span> <span class="n">shift_vertical</span><span class="o">=</span><span class="n">d</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
|
||
|
||
<span class="c1"># otherwise assume list of functions</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="n">f</span><span class="p">:</span> <span class="c1"># if f is empty. End of the recursive fucntion</span>
|
||
<span class="k">return</span> <span class="p">[]</span>
|
||
<span class="k">return</span> <span class="p">[</span><span class="k">lambda</span> <span class="n">x</span><span class="p">,</span> <span class="n">t</span><span class="p">:</span> <span class="n">a</span><span class="o">*</span><span class="n">f</span><span class="p">[</span><span class="mi">0</span><span class="p">](</span><span class="n">b</span><span class="o">*</span><span class="p">(</span><span class="n">x</span><span class="o">-</span><span class="n">c</span><span class="p">),</span> <span class="n">t</span><span class="p">)</span><span class="o">+</span><span class="n">d</span><span class="p">]</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="mi">1</span><span class="p">:],</span> <span class="n">scale_vertical</span><span class="o">=</span><span class="n">a</span><span class="p">,</span> <span class="n">scale_horizontal</span><span class="o">=</span><span class="n">b</span><span class="p">,</span> <span class="n">shift_horizontal</span><span class="o">=</span><span class="n">c</span><span class="p">,</span> <span class="n">shift_vertical</span><span class="o">=</span><span class="n">d</span><span class="p">)</span></div>
|
||
|
||
<div class="viewcode-block" id="sine_wave"><a class="viewcode-back" href="../../pylib.function.html#pylib.function.sine_wave">[docs]</a><span class="k">def</span> <span class="nf">sine_wave</span><span class="p">(</span><span class="n">A</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">k</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">f</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">phi</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">D</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">degree</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
||
<span class="sa">r</span><span class="sd">"""A sine wave or sinusoid is a mathematical curve that describes a</span>
|
||
<span class="sd"> smooth periodic oscillation.</span>
|
||
|
||
<span class="sd"> :param A: amplitude</span>
|
||
<span class="sd"> :type A: float or int</span>
|
||
<span class="sd"> :param k: (angular) wave number</span>
|
||
<span class="sd"> :type k: float or int</span>
|
||
<span class="sd"> :param f: ordinary frequency</span>
|
||
<span class="sd"> :type f: float or int</span>
|
||
<span class="sd"> :param phi: phase</span>
|
||
<span class="sd"> :type phi: float or int</span>
|
||
<span class="sd"> :param D: non-zero center amplitude</span>
|
||
<span class="sd"> :type D: float or int</span>
|
||
<span class="sd"> :param degree: boolean to switch between radians and degree. If</span>
|
||
<span class="sd"> False phi is interpreted in radians and if True then phi is</span>
|
||
<span class="sd"> interpreted in degrees.</span>
|
||
<span class="sd"> :type degree: bool</span>
|
||
|
||
<span class="sd"> :results: sine wave function of spatial variable x and optional</span>
|
||
<span class="sd"> time t</span>
|
||
<span class="sd"> :rtype: function</span>
|
||
|
||
<span class="sd"> In general, the function is:</span>
|
||
|
||
<span class="sd"> .. math::</span>
|
||
<span class="sd"> y(x,t) = A\sin(kx + \omega t + \varphi) + D \\</span>
|
||
<span class="sd"> y(x,t) = A\sin(kx + 2\pi f t + \varphi) + D</span>
|
||
|
||
<span class="sd"> where:</span>
|
||
|
||
<span class="sd"> * A, amplitude, the peak deviation of the function from zero.</span>
|
||
<span class="sd"> * f, ordinary frequency, the number of oscillations (cycles) that</span>
|
||
<span class="sd"> occur each second of time.</span>
|
||
<span class="sd"> * ω = 2πf, angular frequency, the rate of change of the function</span>
|
||
<span class="sd"> argument in units of radians per second. If ω < 0 the wave is</span>
|
||
<span class="sd"> moving to the right, if ω > 0 the wave is moving to the left.</span>
|
||
<span class="sd"> * φ, phase, specifies (in radians) where in its cycle the</span>
|
||
<span class="sd"> oscillation is at t = 0.</span>
|
||
<span class="sd"> * x, spatial variable that represents the position on the</span>
|
||
<span class="sd"> dimension on which the wave propagates.</span>
|
||
<span class="sd"> * k, characteristic parameter called wave number (or angular wave</span>
|
||
<span class="sd"> number), which represents the proportionality between the</span>
|
||
<span class="sd"> angular frequency ω and the linear speed (speed of propagation)</span>
|
||
<span class="sd"> ν.</span>
|
||
<span class="sd"> * D, non-zero center amplitude.</span>
|
||
|
||
<span class="sd"> The wavenumber is related to the angular frequency by:</span>
|
||
|
||
<span class="sd"> .. math::</span>
|
||
<span class="sd"> k={\omega \over v}={2\pi f \over v}={2\pi \over \lambda }</span>
|
||
|
||
<span class="sd"> where λ (lambda) is the wavelength, f is the frequency, and v is the</span>
|
||
<span class="sd"> linear speed.</span>
|
||
|
||
<span class="sd"> .. seealso::</span>
|
||
<span class="sd"> :meth:`cosine_wave`</span>
|
||
<span class="sd"> """</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>
|
||
<span class="k">return</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">,</span> <span class="n">t</span><span class="o">=</span><span class="mi">0</span><span class="p">:</span> <span class="n">A</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">k</span><span class="o">*</span><span class="n">x</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="o">*</span><span class="n">f</span><span class="o">*</span><span class="n">t</span> <span class="o">+</span> <span class="n">phi</span><span class="p">)</span> <span class="o">+</span> <span class="n">D</span></div>
|
||
|
||
<div class="viewcode-block" id="cosine_wave"><a class="viewcode-back" href="../../pylib.function.html#pylib.function.cosine_wave">[docs]</a><span class="k">def</span> <span class="nf">cosine_wave</span><span class="p">(</span><span class="n">A</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">k</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">f</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">phi</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">D</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">degree</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
||
<span class="sa">r</span><span class="sd">"""A cosine wave is said to be sinusoidal, because,</span>
|
||
<span class="sd"> :math:`\cos(x) = \sin(x + \pi/2)`, which is also a sine wave with</span>
|
||
<span class="sd"> a phase-shift of π/2 radians. Because of this head start, it is</span>
|
||
<span class="sd"> often said that the cosine function leads the sine function or</span>
|
||
<span class="sd"> the sine lags the cosine.</span>
|
||
|
||
<span class="sd"> :param A: amplitude</span>
|
||
<span class="sd"> :type A: float or int</span>
|
||
<span class="sd"> :param k: (angular) wave number</span>
|
||
<span class="sd"> :type k: float or int</span>
|
||
<span class="sd"> :param f: ordinary frequency</span>
|
||
<span class="sd"> :type f: float or int</span>
|
||
<span class="sd"> :param phi: phase</span>
|
||
<span class="sd"> :type phi: float or int</span>
|
||
<span class="sd"> :param D: non-zero center amplitude</span>
|
||
<span class="sd"> :type D: float or int</span>
|
||
<span class="sd"> :param degree: boolean to switch between radians and degree. If</span>
|
||
<span class="sd"> False phi is interpreted in radians and if True then phi is</span>
|
||
<span class="sd"> interpreted in degrees.</span>
|
||
<span class="sd"> :type degree: bool</span>
|
||
|
||
<span class="sd"> :results: sine wave function of spatial variable x and optional</span>
|
||
<span class="sd"> time t</span>
|
||
<span class="sd"> :rtype: function</span>
|
||
|
||
<span class="sd"> .. seealso::</span>
|
||
<span class="sd"> :meth:`sine_wave`</span>
|
||
<span class="sd"> """</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>
|
||
<span class="k">else</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="n">math</span><span class="o">.</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span>
|
||
<span class="k">return</span> <span class="n">sine_wave</span><span class="p">(</span><span class="n">A</span><span class="o">=</span><span class="n">A</span><span class="p">,</span> <span class="n">k</span><span class="o">=</span><span class="n">k</span><span class="p">,</span> <span class="n">f</span><span class="o">=</span><span class="n">f</span><span class="p">,</span> <span class="n">phi</span><span class="o">=</span><span class="n">phi</span><span class="p">,</span> <span class="n">D</span><span class="o">=</span><span class="n">D</span><span class="p">,</span> <span class="n">degree</span><span class="o">=</span><span class="n">degree</span><span class="p">)</span></div>
|
||
|
||
<div class="viewcode-block" id="b_spline_basis"><a class="viewcode-back" href="../../pylib.function.html#pylib.function.b_spline_basis">[docs]</a><span class="k">def</span> <span class="nf">b_spline_basis</span><span class="p">(</span><span class="n">knots</span><span class="p">,</span> <span class="n">knot_span</span><span class="p">,</span> <span class="n">degree</span><span class="p">):</span>
|
||
<span class="sa">r</span><span class="sd">"""Cox-de Boor algorithm / recursion formula.</span>
|
||
|
||
<span class="sd"> Calculate the i-th B-spline basis function of degree p:</span>
|
||
<span class="sd"> :math:`N_{i,p}(u)`</span>
|
||
|
||
<span class="sd"> :param knots: Knot vector U. m + 1 non-decreasing numbers / knots,</span>
|
||
<span class="sd"> :math:`u_0 \le u_1 \le u_2 \le \dots \le u_m`</span>
|
||
<span class="sd"> :type knots: list</span>
|
||
<span class="sd"> :param knot_span: i-th knot span</span>
|
||
<span class="sd"> :type knot_span: int</span>
|
||
<span class="sd"> :param degree: degree of B-spline basis function</span>
|
||
<span class="sd"> :type degree: int</span>
|
||
|
||
<span class="sd"> :returns: B-spline basis function using variable,</span>
|
||
<span class="sd"> :math:`u \in [u_0, u_m]`</span>
|
||
<span class="sd"> :rtype: function</span>
|
||
|
||
<span class="sd"> .. math::</span>
|
||
<span class="sd"> N_{i,0}(u) &= \begin{cases}</span>
|
||
<span class="sd"> 1 & \text{if } u_i \le u \lt u_{i+1} \\</span>
|
||
<span class="sd"> 0 & \text{otherwise}\end{cases} \\</span>
|
||
<span class="sd"> N_{i,p}(u) &= \frac{u - u_i}{u_{i+p} - u_i} N_{i,p-1}(u) +</span>
|
||
<span class="sd"> \frac{u_{i+p+1} - u}{u_{i+p+1} - u_{i+1}} N_{i+1,p-1}(u)</span>
|
||
|
||
<span class="sd"> """</span>
|
||
<span class="n">U</span> <span class="o">=</span> <span class="n">knots</span>
|
||
<span class="n">N</span> <span class="o">=</span> <span class="n">b_spline_basis</span>
|
||
<span class="n">i</span> <span class="o">=</span> <span class="n">knot_span</span>
|
||
<span class="n">p</span> <span class="o">=</span> <span class="n">degree</span>
|
||
|
||
<span class="k">if</span> <span class="n">p</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
||
<span class="k">def</span> <span class="nf">Np</span><span class="p">(</span><span class="n">u</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="mi">1</span> <span class="k">if</span> <span class="n">U</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o"><=</span> <span class="n">u</span> <span class="o"><</span> <span class="n">U</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="k">else</span> <span class="mi">0</span>
|
||
<span class="k">else</span><span class="p">:</span>
|
||
<span class="k">def</span> <span class="nf">Np</span><span class="p">(</span><span class="n">u</span><span class="p">):</span>
|
||
<span class="k">try</span><span class="p">:</span>
|
||
<span class="n">term1</span> <span class="o">=</span> <span class="p">(</span><span class="n">u</span> <span class="o">-</span> <span class="n">U</span><span class="p">[</span><span class="n">i</span><span class="p">])</span><span class="o">/</span><span class="p">(</span><span class="n">U</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="n">p</span><span class="p">]</span> <span class="o">-</span> <span class="n">U</span><span class="p">[</span><span class="n">i</span><span class="p">])</span><span class="o">*</span><span class="n">N</span><span class="p">(</span><span class="n">U</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">p</span><span class="o">-</span><span class="mi">1</span><span class="p">)(</span><span class="n">u</span><span class="p">)</span>
|
||
<span class="k">except</span><span class="p">:</span>
|
||
<span class="n">term1</span> <span class="o">=</span> <span class="mi">0</span>
|
||
<span class="k">try</span><span class="p">:</span>
|
||
<span class="n">term2</span> <span class="o">=</span> <span class="p">(</span><span class="n">U</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="n">p</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">u</span><span class="p">)</span><span class="o">/</span><span class="p">(</span><span class="n">U</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="n">p</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">U</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">])</span><span class="o">*</span><span class="n">N</span><span class="p">(</span><span class="n">U</span><span class="p">,</span> <span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">p</span><span class="o">-</span><span class="mi">1</span><span class="p">)(</span><span class="n">u</span><span class="p">)</span>
|
||
<span class="k">except</span><span class="p">:</span>
|
||
<span class="n">term2</span> <span class="o">=</span> <span class="mi">0</span>
|
||
<span class="k">return</span> <span class="n">term1</span> <span class="o">+</span> <span class="n">term2</span>
|
||
<span class="k">return</span> <span class="n">Np</span></div>
|
||
|
||
<span class="c1"># TODO: other types than clamped?</span>
|
||
<div class="viewcode-block" id="b_spline_knots"><a class="viewcode-back" href="../../pylib.function.html#pylib.function.b_spline_knots">[docs]</a><span class="k">def</span> <span class="nf">b_spline_knots</span><span class="p">(</span><span class="n">control_point_spans</span><span class="p">,</span> <span class="n">degree</span><span class="o">=</span><span class="mi">3</span><span class="p">):</span>
|
||
<span class="sd">"""B-spline knots to generate a clamped uniform B-spline curve</span>
|
||
<span class="sd"> of degree p (order + 1).</span>
|
||
|
||
<span class="sd"> The internal knots are equally spaced (uniform B-spline curve)</span>
|
||
|
||
<span class="sd"> :param control_point_spans: number of control points + 1</span>
|
||
<span class="sd"> :type control_point_spans: int</span>
|
||
<span class="sd"> :param degree: degree of B-spline basis functions (default = 3)</span>
|
||
<span class="sd"> :type degree: int</span>
|
||
|
||
<span class="sd"> :returns: knot vector</span>
|
||
<span class="sd"> :rtype: tuple</span>
|
||
|
||
<span class="sd"> .. seealso::</span>
|
||
<span class="sd"> :meth:`b_spline_curve_with_knots`</span>
|
||
<span class="sd"> """</span>
|
||
<span class="n">p</span> <span class="o">=</span> <span class="n">degree</span>
|
||
<span class="n">n</span> <span class="o">=</span> <span class="n">control_point_spans</span>
|
||
<span class="n">m</span> <span class="o">=</span> <span class="n">n</span> <span class="o">+</span> <span class="n">p</span> <span class="o">+</span> <span class="mi">1</span> <span class="c1"># number of knot spans</span>
|
||
|
||
<span class="c1"># number of</span>
|
||
<span class="n">U_outer</span> <span class="o">=</span> <span class="n">p</span> <span class="o">+</span> <span class="mi">1</span> <span class="c1"># at each of the vector</span>
|
||
<span class="n">U_inner</span> <span class="o">=</span> <span class="n">m</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">-</span> <span class="mi">2</span><span class="o">*</span><span class="p">(</span><span class="n">U_outer</span><span class="p">)</span>
|
||
|
||
<span class="n">U</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="p">(</span><span class="n">U_outer</span><span class="p">)</span>
|
||
<span class="n">U</span> <span class="o">+=</span> <span class="p">[</span><span class="n">i</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">U_inner</span><span class="p">)]</span>
|
||
<span class="n">U</span> <span class="o">+=</span> <span class="p">[</span><span class="n">U_inner</span><span class="p">]</span><span class="o">*</span><span class="p">(</span><span class="n">U_outer</span><span class="p">)</span>
|
||
<span class="k">return</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">U</span><span class="p">)</span> <span class="c1"># tuples are hashable</span></div>
|
||
|
||
<div class="viewcode-block" id="b_spline_curve_with_knots"><a class="viewcode-back" href="../../pylib.function.html#pylib.function.b_spline_curve_with_knots">[docs]</a><span class="k">def</span> <span class="nf">b_spline_curve_with_knots</span><span class="p">(</span><span class="n">degree</span><span class="p">,</span> <span class="n">control_points</span><span class="p">,</span> <span class="n">knots</span><span class="p">):</span>
|
||
<span class="sd">"""B-spline curve of degree p (order + 1) on a given set of knots.</span>
|
||
|
||
<span class="sd"> n, m and p must satisfy m = n + p + 1.</span>
|
||
|
||
<span class="sd"> :param degree: degree of B-spline basis functions</span>
|
||
<span class="sd"> :type degree: int</span>
|
||
<span class="sd"> :param control_points: control points P, n + 1 control points</span>
|
||
<span class="sd"> :type control_points: list</span>
|
||
<span class="sd"> :param knots: Knot vector U. m + 1 non-decreasing numbers / knots,</span>
|
||
<span class="sd"> :math:`u_0 \le u_1 \le u_2 \le \dots \le u_m`</span>
|
||
<span class="sd"> :type knots: list</span>
|
||
|
||
<span class="sd"> :returns: B-spline curve using variable, :math:`u \in [u_0, u_m]`</span>
|
||
<span class="sd"> :rtype: function</span>
|
||
|
||
<span class="sd"> .. math::</span>
|
||
<span class="sd"> \mathbf{C}_p(u) = \sum\limits_{i=0}^{n} N_{i,p}(u) \mathbf{P}_i</span>
|
||
|
||
<span class="sd"> * open B-spline curves</span>
|
||
|
||
<span class="sd"> * the curve will not touch the first and last legs of the</span>
|
||
<span class="sd"> control polyline</span>
|
||
<span class="sd"> * the knot vector does not have any particular structure</span>
|
||
<span class="sd"> * for degree p, intervals :math:`[u_0, u_p)` and</span>
|
||
<span class="sd"> :math:`[u_{n-p}, u_n)` will not have "full support" of basis</span>
|
||
<span class="sd"> functions and are ignored when a B-spline curve is open. For</span>
|
||
<span class="sd"> open B-spline curves, the domain is inteval</span>
|
||
<span class="sd"> :math:`[u_p, u_{n-p}]`</span>
|
||
|
||
<span class="sd"> * clamped B-spline curves, nonperiodic B-spline curves</span>
|
||
|
||
<span class="sd"> * the curve is tangent to the first and the last legs just like</span>
|
||
<span class="sd"> a Bézier curve</span>
|
||
<span class="sd"> * the first knot and the last knot must be repeated p+1 times</span>
|
||
<span class="sd"> (i. e., of multiplicity p+1)</span>
|
||
|
||
<span class="sd"> * closed B-spline curves</span>
|
||
|
||
<span class="sd"> * the start and the end of the generated curve join together</span>
|
||
<span class="sd"> forming a closed loop</span>
|
||
<span class="sd"> * repeating some knots and control points (TODO: which?)</span>
|
||
|
||
<span class="sd"> * uniform B-spline curves</span>
|
||
|
||
<span class="sd"> * internal knots are equally spaced</span>
|
||
|
||
<span class="sd"> * Bézier curves</span>
|
||
|
||
<span class="sd"> * a B-spline with no internal knots.</span>
|
||
|
||
<span class="sd"> .. seealso::</span>
|
||
<span class="sd"> :meth:`b_spline_knots`</span>
|
||
<span class="sd"> """</span>
|
||
<span class="n">dim</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">control_points</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
|
||
<span class="k">def</span> <span class="nf">C</span><span class="p">(</span><span class="n">u</span><span class="p">):</span>
|
||
<span class="n">NiPi</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="n">dim</span>
|
||
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">control_points</span><span class="p">)):</span>
|
||
<span class="n">Ni</span> <span class="o">=</span> <span class="n">b_spline_basis</span><span class="p">(</span><span class="n">knots</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">degree</span><span class="p">)</span>
|
||
<span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">dim</span><span class="p">):</span>
|
||
<span class="n">NiPi</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">+=</span> <span class="n">Ni</span><span class="p">(</span><span class="n">u</span><span class="p">)</span><span class="o">*</span><span class="n">control_points</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span>
|
||
<span class="k">return</span> <span class="n">NiPi</span>
|
||
<span class="k">return</span> <span class="n">C</span></div>
|
||
|
||
<div class="viewcode-block" id="sample_half_open"><a class="viewcode-back" href="../../pylib.function.html#pylib.function.sample_half_open">[docs]</a><span class="k">def</span> <span class="nf">sample_half_open</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="n">n</span><span class="o">=</span><span class="mi">50</span><span class="p">,</span> <span class="n">endpoint_epsilon</span><span class="o">=</span><span class="mf">1e-7</span><span class="p">):</span>
|
||
<span class="c1"># hack to sample close to the endpoint</span>
|
||
<span class="n">x</span> <span class="o">=</span> <span class="n">seq</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="p">(</span><span class="n">b</span><span class="o">-</span><span class="n">a</span><span class="p">)</span><span class="o">/</span><span class="n">n</span><span class="p">)</span> <span class="o">+</span> <span class="p">[</span><span class="n">b</span><span class="o">-</span><span class="n">endpoint_epsilon</span><span class="p">]</span>
|
||
<span class="c1"># Sample the function</span>
|
||
<span class="k">return</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="k">for</span> <span class="n">xi</span> <span class="ow">in</span> <span class="n">x</span><span class="p">]</span></div>
|
||
|
||
<div class="viewcode-block" id="sample_half_open_seq"><a class="viewcode-back" href="../../pylib.function.html#pylib.function.sample_half_open_seq">[docs]</a><span class="k">def</span> <span class="nf">sample_half_open_seq</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="n">endpoint_epsilon</span><span class="o">=</span><span class="mf">1e-7</span><span class="p">):</span>
|
||
<span class="c1"># hack to sample close to the endpoint, x[-1] can be present</span>
|
||
<span class="c1"># multiple times.</span>
|
||
<span class="n">xend</span> <span class="o">=</span> <span class="n">x</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
|
||
<span class="n">x</span> <span class="o">=</span> <span class="p">[</span><span class="n">xi</span> <span class="k">for</span> <span class="n">xi</span> <span class="ow">in</span> <span class="n">x</span> <span class="k">if</span> <span class="n">xi</span> <span class="o">!=</span> <span class="n">xend</span><span class="p">]</span> <span class="o">+</span> <span class="p">[</span><span class="n">xend</span><span class="o">-</span><span class="n">endpoint_epsilon</span><span class="p">]</span>
|
||
<span class="c1"># Sample the function</span>
|
||
<span class="k">return</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="k">for</span> <span class="n">xi</span> <span class="ow">in</span> <span class="n">x</span><span class="p">]</span></div>
|
||
|
||
<span class="c1">#</span>
|
||
<span class="c1"># Parametric equations</span>
|
||
<span class="c1"># roulette</span>
|
||
<span class="c1">#</span>
|
||
|
||
<div class="viewcode-block" id="circle"><a class="viewcode-back" href="../../pylib.function.html#pylib.function.circle">[docs]</a><span class="k">def</span> <span class="nf">circle</span><span class="p">(</span><span class="n">r</span><span class="p">):</span>
|
||
<span class="sa">r</span><span class="sd">"""Circle</span>
|
||
|
||
<span class="sd"> :param r: radius of the circle</span>
|
||
<span class="sd"> :type r: float</span>
|
||
|
||
<span class="sd"> :results: functions for x of theta and y of theta and the interval</span>
|
||
<span class="sd"> :rtype: tuple</span>
|
||
|
||
<span class="sd"> .. math::</span>
|
||
<span class="sd"> x(\theta) = r\cos\theta \\</span>
|
||
<span class="sd"> y(\theta) = r\sin\theta \\</span>
|
||
<span class="sd"> \theta = \left[0, 2\pi\right]</span>
|
||
|
||
<span class="sd"> ::</span>
|
||
|
||
<span class="sd"> * *</span>
|
||
<span class="sd"> * r *</span>
|
||
<span class="sd"> * *</span>
|
||
<span class="sd"> * *</span>
|
||
<span class="sd"> * *</span>
|
||
<span class="sd"> * *</span>
|
||
|
||
<span class="sd"> >>> x, y = circle(20)[:2]</span>
|
||
<span class="sd"> >>> x, y, _ = circle(20)</span>
|
||
<span class="sd"> >>> x, y, interval = circle(20)</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">return</span> <span class="n">ellipse</span><span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="n">r</span><span class="p">)</span></div>
|
||
|
||
<div class="viewcode-block" id="ellipse"><a class="viewcode-back" href="../../pylib.function.html#pylib.function.ellipse">[docs]</a><span class="k">def</span> <span class="nf">ellipse</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="sa">r</span><span class="sd">"""Ellipse</span>
|
||
|
||
<span class="sd"> :param a: semi-major axis</span>
|
||
<span class="sd"> :type a: float</span>
|
||
<span class="sd"> :param b: semi-minor axis</span>
|
||
<span class="sd"> :type b: float</span>
|
||
|
||
<span class="sd"> :results: functions for x of theta and y of theta and the interval</span>
|
||
<span class="sd"> :rtype: tuple</span>
|
||
|
||
<span class="sd"> .. math::</span>
|
||
<span class="sd"> x(\theta) = a\cos\theta \\</span>
|
||
<span class="sd"> y(\theta) = b\sin\theta \\</span>
|
||
<span class="sd"> \theta = \left[0, 2\pi\right]</span>
|
||
|
||
<span class="sd"> ::</span>
|
||
|
||
<span class="sd"> * .*</span>
|
||
<span class="sd"> * b : *</span>
|
||
<span class="sd"> * :......*</span>
|
||
<span class="sd"> * a *</span>
|
||
<span class="sd"> * *</span>
|
||
<span class="sd"> * *</span>
|
||
|
||
<span class="sd"> >>> x, y = ellipse(10, 5)[:2]</span>
|
||
<span class="sd"> >>> x, y, _ = ellipse(10, 5)</span>
|
||
<span class="sd"> >>> x, y, interval = ellipse(10, 5)</span>
|
||
<span class="sd"> """</span>
|
||
<span class="n">x</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">theta</span><span class="p">:</span> <span class="n">a</span><span class="o">*</span><span class="n">math</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span>
|
||
<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="n">b</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="k">return</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</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="p">]</span></div>
|
||
|
||
<div class="viewcode-block" id="hypotrochoid"><a class="viewcode-back" href="../../pylib.function.html#pylib.function.hypotrochoid">[docs]</a><span class="k">def</span> <span class="nf">hypotrochoid</span><span class="p">(</span><span class="n">R</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">d</span><span class="p">):</span>
|
||
<span class="sa">r</span><span class="sd">"""Hypotrochoid</span>
|
||
|
||
<span class="sd"> A point is attached with a distance d from the center of a circle</span>
|
||
<span class="sd"> of radius r. The circle is rolling around the inside of a fixed</span>
|
||
<span class="sd"> circle of radius R.</span>
|
||
|
||
<span class="sd"> :param R: radius of the fixed exterior circle</span>
|
||
<span class="sd"> :type R: float</span>
|
||
<span class="sd"> :param r: radius of the rolling circle inside of the fixed circle</span>
|
||
<span class="sd"> :typre r: float</span>
|
||
<span class="sd"> :param d: distance from the center of the interior circle</span>
|
||
<span class="sd"> :type d: float</span>
|
||
|
||
<span class="sd"> :results: functions for x of theta and y of theta and the interval</span>
|
||
<span class="sd"> :rtype: tuple</span>
|
||
|
||
<span class="sd"> .. math::</span>
|
||
<span class="sd"> x(\theta) = (R - r)\cos\theta + d\cos\left(\frac{R-r}{r}\theta\right) \\</span>
|
||
<span class="sd"> y(\theta) = (R - r)\sin\theta - d\sin\left(\frac{R-r}{r}\theta\right) \\</span>
|
||
<span class="sd"> \theta = \left[0, 2\pi\frac{\mathrm{lcm}(r, R)}{R}\right]</span>
|
||
|
||
<span class="sd"> ::</span>
|
||
|
||
<span class="sd"> * * *</span>
|
||
<span class="sd"> * R *</span>
|
||
<span class="sd"> * *</span>
|
||
<span class="sd"> * * * *</span>
|
||
<span class="sd"> * * r **</span>
|
||
<span class="sd"> * * ,.. *</span>
|
||
<span class="sd"> * * d *</span>
|
||
<span class="sd"> * * **</span>
|
||
<span class="sd"> * * * *</span>
|
||
<span class="sd"> * *</span>
|
||
<span class="sd"> * *</span>
|
||
<span class="sd"> * * *</span>
|
||
|
||
<span class="sd"> >>> x, y = hypotrochoid(20, 6, 6)[:2]</span>
|
||
<span class="sd"> >>> x, y, _ = hypotrochoid(20, 6, 6)</span>
|
||
<span class="sd"> >>> x, y, interval = hypotrochoid(20, 6, 6)</span>
|
||
|
||
<span class="sd"> .. seealso::</span>
|
||
<span class="sd"> :meth:`pylib.mathematics.lcm`</span>
|
||
<span class="sd"> """</span>
|
||
<span class="n">x</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">cos</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">cos</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">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="k">return</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</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="o">*</span><span class="n">lcm</span><span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="n">R</span><span class="p">)</span><span class="o">/</span><span class="n">R</span><span class="p">]</span></div>
|
||
|
||
<div class="viewcode-block" id="epitrochoid"><a class="viewcode-back" href="../../pylib.function.html#pylib.function.epitrochoid">[docs]</a><span class="k">def</span> <span class="nf">epitrochoid</span><span class="p">(</span><span class="n">R</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">d</span><span class="p">):</span>
|
||
<span class="sa">r</span><span class="sd">"""Epitrochoid</span>
|
||
|
||
<span class="sd"> A point is attached with a distance d from the center of a circle</span>
|
||
<span class="sd"> of radius r. The circle is rolling around the outside of a fixed</span>
|
||
<span class="sd"> circle of radius R.</span>
|
||
|
||
<span class="sd"> :param R: radius of the fixed interior circle</span>
|
||
<span class="sd"> :type R: float</span>
|
||
<span class="sd"> :param r: radius of the rolling circle outside of the fixed circle</span>
|
||
<span class="sd"> :typre r: float</span>
|
||
<span class="sd"> :param d: distance from the center of the exterior circle</span>
|
||
<span class="sd"> :type d: float</span>
|
||
|
||
<span class="sd"> :results: functions for x of theta and y of theta and the interval</span>
|
||
<span class="sd"> :rtype: tuple</span>
|
||
|
||
<span class="sd"> .. math::</span>
|
||
<span class="sd"> x(\theta) = (R + r)\cos\theta - d\cos\left(\frac{R+r}{r}\theta\right) \\</span>
|
||
<span class="sd"> y(\theta) = (R + r)\sin\theta - d\sin\left(\frac{R+r}{r}\theta\right) \\</span>
|
||
<span class="sd"> \theta = \left[0, 2\pi\right]</span>
|
||
|
||
<span class="sd"> ::</span>
|
||
|
||
<span class="sd"> * * *</span>
|
||
<span class="sd"> * R *</span>
|
||
<span class="sd"> * *</span>
|
||
<span class="sd"> * * * *</span>
|
||
<span class="sd"> * * * r *</span>
|
||
<span class="sd"> * ** .., *</span>
|
||
<span class="sd"> * ** d *</span>
|
||
<span class="sd"> * * * *</span>
|
||
<span class="sd"> * * * *</span>
|
||
<span class="sd"> * *</span>
|
||
<span class="sd"> * *</span>
|
||
<span class="sd"> * * *</span>
|
||
|
||
<span class="sd"> >>> x, y = epitrochoid(3, 1, 0.5)[:2]</span>
|
||
<span class="sd"> >>> x, y, _ = epitrochoid(3, 1, 0.5)</span>
|
||
<span class="sd"> >>> x, y, interval = epitrochoid(3, 1, 0.5)</span>
|
||
<span class="sd"> """</span>
|
||
<span class="n">x</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">cos</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">cos</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">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="k">return</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</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="p">]</span></div>
|
||
|
||
<div class="viewcode-block" id="to_str"><a class="viewcode-back" href="../../pylib.function.html#pylib.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">"line"</span><span class="p">):</span>
|
||
<span class="sd">"""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 "braille" or "block". "braille" uses Unicode</span>
|
||
<span class="sd"> Characters in the Braille Patterns Block (first index U+2800, last</span>
|
||
<span class="sd"> index U+28FF [CUDB]_) and the "block" 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="histogram"</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 "line" or "histogram"</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 'normal' 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 + - | * *|| * *|| * *| ---> 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 + - | --- || --- || --- | ---> 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 <ftp://ftp.unicode.org/Public/UNIDATA/Blocks.txt>`_</span>
|
||
|
||
|
||
<span class="sd"> .. seealso::</span>
|
||
<span class="sd"> :meth:`transformation`</span>
|
||
<span class="sd"> """</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 "positive side".</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">""</span>
|
||
<span class="k">if</span> <span class="n">char_set</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">"line"</span><span class="p">,</span> <span class="s2">"braille"</span><span class="p">]:</span>
|
||
<span class="kn">import</span> <span class="nn">drawille</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">y_i</span> <span class="o">=</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="k">if</span> <span class="mi">0</span> <span class="o">>=</span> <span class="n">y_i</span> <span class="o">>=</span> <span class="o">-</span><span class="n">h</span><span class="o">*</span><span class="n">pixels_vertical</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">y_i</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">"histogram"</span><span class="p">,</span> <span class="s2">"block"</span><span class="p">]:</span>
|
||
<span class="kn">from</span> <span class="nn">.drawblock</span> <span class="kn">import</span> <span class="n">histogram</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">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>
|
||
|
||
</div>
|
||
</div>
|
||
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
|
||
<div class="sphinxsidebarwrapper">
|
||
<h1 class="logo"><a href="../../index.html">pylib</a></h1>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<h3>Navigation</h3>
|
||
<p class="caption"><span class="caption-text">Contents:</span></p>
|
||
<ul>
|
||
<li class="toctree-l1"><a class="reference internal" href="../../modules.html">pylib</a></li>
|
||
</ul>
|
||
|
||
<div class="relations">
|
||
<h3>Related Topics</h3>
|
||
<ul>
|
||
<li><a href="../../index.html">Documentation overview</a><ul>
|
||
<li><a href="../index.html">Module code</a><ul>
|
||
</ul></li>
|
||
</ul></li>
|
||
</ul>
|
||
</div>
|
||
<div id="searchbox" style="display: none" role="search">
|
||
<h3 id="searchlabel">Quick search</h3>
|
||
<div class="searchformwrapper">
|
||
<form class="search" action="../../search.html" method="get">
|
||
<input type="text" name="q" aria-labelledby="searchlabel" />
|
||
<input type="submit" value="Go" />
|
||
</form>
|
||
</div>
|
||
</div>
|
||
<script type="text/javascript">$('#searchbox').show(0);</script>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
</div>
|
||
</div>
|
||
<div class="clearer"></div>
|
||
</div>
|
||
<div class="footer">
|
||
©2019, Daniel Weschke.
|
||
|
||
|
|
||
Powered by <a href="http://sphinx-doc.org/">Sphinx 2.2.1</a>
|
||
& <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
|
||
</body>
|
||
</html> |