change data, mathematics, function, geometry and geometry_plot_pylab. add data_step, data_step_std and helper. add an example and more documentation.

inside the data module rename read to read_columns add add new read function to read the whole file as string. add print_list function to print one element per line. add unique_list and unique_list_hashable to reduce the list into a unique list with same order. add find_last, str_between, str_to_list functions.

inside the mathematics module for vector add normalized creating a new object (normalize will change the object), isclose and iscloseto, change ang to round internal number. for matrix improve slicing and add transposed creating a new object (transpose will change object).

inside the function module add b_spline_basis, b_spline_curve_with_knots and b_spline_knots functions. add sample_hal_open and sample_half_open_seq. add circle and ellipse.

inside the geometry module change CS init from using lists to Directions and add new constructor CS.init_xzy using lists. rename Wireframe to Polyline. add classes B_spline_curve_with_knots, Ellipse, ArcCircle, ArcEllipse, ArcBSplineCurveWithKnots. add function sample_half_open to create a list of Points.

inside the geometry_plot_pylab module change the help text.

add step_and data data_step_std module to read a step file to list and draw the content.

add helper module with context manager and decorator timeit to meassure the time for a section or function.

add example for b_spline function.
This commit is contained in:
2020-01-08 21:59:53 +01:00
parent 4b42d7b508
commit 4fc4903dc2
56 changed files with 8756 additions and 947 deletions

View File

@@ -34,6 +34,8 @@
<h1>All modules for which code is available</h1>
<ul><li><a href="pylib/data.html">pylib.data</a></li>
<li><a href="pylib/data_step.html">pylib.data_step</a></li>
<li><a href="pylib/data_step_std.html">pylib.data_step_std</a></li>
<li><a href="pylib/date.html">pylib.date</a></li>
<li><a href="pylib/drawblock.html">pylib.drawblock</a></li>
<li><a href="pylib/function.html">pylib.function</a></li>
@@ -41,6 +43,7 @@
<li><a href="pylib/geometry2d.html">pylib.geometry2d</a></li>
<li><a href="pylib/geometry2d_plot.html">pylib.geometry2d_plot</a></li>
<li><a href="pylib/geometry_plot_pylab.html">pylib.geometry_plot_pylab</a></li>
<li><a href="pylib/helper.html">pylib.helper</a></li>
<li><a href="pylib/mathematics.html">pylib.mathematics</a></li>
<li><a href="pylib/numerical/fit.html">pylib.numerical.fit</a></li>
<li><a href="pylib/numerical/integration.html">pylib.numerical.integration</a></li>

View File

@@ -35,9 +35,10 @@
<h1>Source code for pylib.data</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">&quot;&quot;&quot;Read and write data to or from file and manipulate data structures.</span>
<span class="sd">&quot;&quot;&quot;Read and write data to or from file and manipulate data</span>
<span class="sd">structures.</span>
<span class="sd">:Date: 2019-10-11</span>
<span class="sd">:Date: 2019-12-28</span>
<span class="sd">.. module:: data</span>
<span class="sd"> :platform: *nix, Windows</span>
@@ -48,6 +49,7 @@
<span class="kn">import</span> <span class="nn">math</span>
<span class="kn">import</span> <span class="nn">pickle</span>
<span class="kn">import</span> <span class="nn">collections</span>
<span class="kn">import</span> <span class="nn">re</span>
<div class="viewcode-block" id="issequence"><a class="viewcode-back" href="../../pylib.data.html#pylib.data.issequence">[docs]</a><span class="k">def</span> <span class="nf">issequence</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
@@ -78,11 +80,25 @@
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">collections</span><span class="o">.</span><span class="n">abc</span><span class="o">.</span><span class="n">Sequence</span><span class="p">)</span></div>
<div class="viewcode-block" id="read"><a class="viewcode-back" href="../../pylib.data.html#pylib.data.read">[docs]</a><span class="k">def</span> <span class="nf">read</span><span class="p">(</span><span class="n">file_name</span><span class="p">,</span> <span class="n">x_column</span><span class="p">,</span> <span class="n">y_column</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">verbose</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<div class="viewcode-block" id="read"><a class="viewcode-back" href="../../pylib.data.html#pylib.data.read">[docs]</a><span class="k">def</span> <span class="nf">read</span><span class="p">(</span><span class="n">file_name</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Read ascii data file.</span>
<span class="sd"> :param filename: file to read</span>
<span class="sd"> :type filename: str</span>
<span class="sd"> :returns: file content</span>
<span class="sd"> :rtype: str</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">file_str</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">file_name</span><span class="p">)</span> <span class="k">as</span> <span class="n">file</span><span class="p">:</span>
<span class="n">file_str</span> <span class="o">=</span> <span class="n">file</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
<span class="k">return</span> <span class="n">file_str</span></div>
<div class="viewcode-block" id="read_columns"><a class="viewcode-back" href="../../pylib.data.html#pylib.data.read_columns">[docs]</a><span class="k">def</span> <span class="nf">read_columns</span><span class="p">(</span><span class="n">file_name</span><span class="p">,</span> <span class="n">x_column</span><span class="p">,</span> <span class="n">y_column</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">verbose</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Read ascii data file.</span>
<span class="sd"> :param file_name: file to read</span>
<span class="sd"> :type file_name: str</span>
<span class="sd"> :param x_column: column index for the x data (first column is 0)</span>
<span class="sd"> :type x_column: int</span>
<span class="sd"> :param y_column: column index for the y data (first column is 0)</span>
@@ -95,8 +111,6 @@
<span class="sd"> :returns: x and y</span>
<span class="sd"> :rtype: tuple(list, list)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">re</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">default</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">default</span>
@@ -167,6 +181,14 @@
<span class="c1"># every dump needs a load</span>
<span class="n">pickle</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="n">object_data</span><span class="p">,</span> <span class="n">output</span><span class="p">,</span> <span class="n">pickle</span><span class="o">.</span><span class="n">HIGHEST_PROTOCOL</span><span class="p">)</span></div>
<div class="viewcode-block" id="print_list"><a class="viewcode-back" href="../../pylib.data.html#pylib.data.print_list">[docs]</a><span class="k">def</span> <span class="nf">print_list</span><span class="p">(</span><span class="n">lst</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Print list, one list element per line.</span>
<span class="sd"> :param lst: list to print</span>
<span class="sd"> :type lst: list</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="p">[</span><span class="nb">print</span><span class="p">(</span><span class="n">row</span><span class="p">)</span> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">lst</span><span class="p">]</span></div>
<div class="viewcode-block" id="fold_list"><a class="viewcode-back" href="../../pylib.data.html#pylib.data.fold_list">[docs]</a><span class="k">def</span> <span class="nf">fold_list</span><span class="p">(</span><span class="n">lst</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Convert one-dimensional kx1 array (list) to two-dimensional mxn</span>
<span class="sd"> array. m = k / n</span>
@@ -238,6 +260,24 @@
<span class="n">lst</span> <span class="o">=</span> <span class="p">[</span><span class="nb">round</span><span class="p">(</span><span class="n">start</span> <span class="o">+</span> <span class="n">step</span><span class="o">*</span><span class="n">i</span><span class="p">,</span> <span class="n">exponent</span><span class="p">)</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="n">n</span><span class="p">)]</span>
<span class="k">return</span> <span class="n">lst</span></div>
<div class="viewcode-block" id="unique_list_hashable"><a class="viewcode-back" href="../../pylib.data.html#pylib.data.unique_list_hashable">[docs]</a><span class="k">def</span> <span class="nf">unique_list_hashable</span><span class="p">(</span><span class="n">sequence</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> faster using set() but elements of the sequence must be hashable.</span>
<span class="sd"> unhashable types: &#39;list&#39;</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># https://stackoverflow.com/a/37163210</span>
<span class="n">used</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="c1"># .add(x) will always be falsy</span>
<span class="k">return</span> <span class="p">[</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">sequence</span> <span class="k">if</span> <span class="n">x</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">used</span> <span class="ow">and</span> <span class="p">(</span><span class="n">used</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="ow">or</span> <span class="kc">True</span><span class="p">)]</span></div>
<div class="viewcode-block" id="unique_list"><a class="viewcode-back" href="../../pylib.data.html#pylib.data.unique_list">[docs]</a><span class="k">def</span> <span class="nf">unique_list</span><span class="p">(</span><span class="n">sequence</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># https://stackoverflow.com/a/37163210</span>
<span class="n">used</span> <span class="o">=</span> <span class="p">[]</span>
<span class="c1"># .append(x) will always be falsy</span>
<span class="k">return</span> <span class="p">[</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">sequence</span> <span class="k">if</span> <span class="n">x</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">used</span> <span class="ow">and</span> <span class="p">(</span><span class="n">used</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="ow">or</span> <span class="kc">True</span><span class="p">)]</span></div>
<div class="viewcode-block" id="unique_ending"><a class="viewcode-back" href="../../pylib.data.html#pylib.data.unique_ending">[docs]</a><span class="k">def</span> <span class="nf">unique_ending</span><span class="p">(</span><span class="n">ids</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;From id list get list with unique ending.</span>
@@ -249,12 +289,11 @@
<span class="sd"> :returns: unique ending of ids</span>
<span class="sd"> :rtype: list</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">ids</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">x</span> <span class="o">=</span> <span class="p">[</span><span class="n">idi</span><span class="p">[</span><span class="o">-</span><span class="n">n</span><span class="p">:]</span> <span class="k">for</span> <span class="n">idi</span> <span class="ow">in</span> <span class="n">ids</span><span class="p">]</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">&gt;</span> <span class="nb">len</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">x</span><span class="p">)):</span>
<span class="k">return</span> <span class="n">unique_ending</span><span class="p">(</span><span class="n">ids</span><span class="p">,</span> <span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">x</span></div>
<span class="n">x</span> <span class="o">=</span> <span class="p">[</span><span class="n">idi</span><span class="p">[</span><span class="o">-</span><span class="n">n</span><span class="p">:]</span> <span class="k">for</span> <span class="n">idi</span> <span class="ow">in</span> <span class="n">ids</span><span class="p">]</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">&gt;</span> <span class="nb">len</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">x</span><span class="p">)):</span>
<span class="k">return</span> <span class="n">unique_ending</span><span class="p">(</span><span class="n">ids</span><span class="p">,</span> <span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">x</span></div>
<div class="viewcode-block" id="get_id"><a class="viewcode-back" href="../../pylib.data.html#pylib.data.get_id">[docs]</a><span class="k">def</span> <span class="nf">get_id</span><span class="p">(</span><span class="n">ids</span><span class="p">,</span> <span class="n">uide</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Get full id from unique id ending.</span>
@@ -269,6 +308,87 @@
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># take first element, because we know it is a unique ending</span>
<span class="k">return</span> <span class="p">[</span><span class="n">idi</span> <span class="k">for</span> <span class="n">idi</span> <span class="ow">in</span> <span class="n">ids</span> <span class="k">if</span> <span class="n">idi</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="n">uide</span><span class="p">)][</span><span class="mi">0</span><span class="p">]</span></div>
<div class="viewcode-block" id="find_last"><a class="viewcode-back" href="../../pylib.data.html#pylib.data.find_last">[docs]</a><span class="k">def</span> <span class="nf">find_last</span><span class="p">(</span><span class="n">sequence</span><span class="p">,</span> <span class="n">pattern</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Find last last occurance in sequence (text)</span>
<span class="sd"> :param sequence: text to search in</span>
<span class="sd"> :type sequence: str</span>
<span class="sd"> :param pattern: search pattern</span>
<span class="sd"> :type pattern: str</span>
<span class="sd"> :returns: index (-1 if pattern not in sequence)</span>
<span class="sd"> :rtype: int</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">pattern</span> <span class="ow">in</span> <span class="n">sequence</span><span class="p">:</span>
<span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="n">sequence</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span> <span class="o">-</span> <span class="n">sequence</span><span class="p">[::</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">pattern</span><span class="p">)</span>
<span class="k">return</span> <span class="o">-</span><span class="mi">1</span></div>
<div class="viewcode-block" id="str_between"><a class="viewcode-back" href="../../pylib.data.html#pylib.data.str_between">[docs]</a><span class="k">def</span> <span class="nf">str_between</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">left</span><span class="p">,</span> <span class="n">right</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Get text between two pattern.</span>
<span class="sd"> Text can be multi-line.</span>
<span class="sd"> :param text: text to search in</span>
<span class="sd"> :type text: str</span>
<span class="sd"> :param left: left pattern</span>
<span class="sd"> :type left: str</span>
<span class="sd"> :param right: right pattern</span>
<span class="sd"> :type right: str</span>
<span class="sd"> :returns: text between the left and right pattern</span>
<span class="sd"> :rtype: str</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">left</span><span class="o">+</span><span class="s1">&#39;(.+?)&#39;</span><span class="o">+</span><span class="n">right</span><span class="p">,</span> <span class="n">text</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">DOTALL</span><span class="p">)</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="k">except</span><span class="p">:</span>
<span class="k">return</span> <span class="s1">&#39;&#39;</span></div>
<div class="viewcode-block" id="str_to_list"><a class="viewcode-back" href="../../pylib.data.html#pylib.data.str_to_list">[docs]</a><span class="k">def</span> <span class="nf">str_to_list</span><span class="p">(</span><span class="n">string</span><span class="p">,</span> <span class="n">delimiter</span><span class="o">=</span><span class="s1">&#39;;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">newline_replacement</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Converts a string with block information into a list.</span>
<span class="sd"> This function un-wraps multi-line block information into one line.</span>
<span class="sd"> :param string: string with block information</span>
<span class="sd"> :type string: str</span>
<span class="sd"> :param delimiter: block delimiter (default = &#39;;\n&#39;). This will be</span>
<span class="sd"> removed from the resulting list.</span>
<span class="sd"> :type delimiter: str</span>
<span class="sd"> :param newline_replacement: block lines replacement (default = &#39;&#39;)</span>
<span class="sd"> :type newline_replacement: str</span>
<span class="sd"> :returns: list of block information</span>
<span class="sd"> :rtype: list</span>
<span class="sd"> .. note:: Every line is left striped. Empty line are ignored.</span>
<span class="sd"> :Example:</span>
<span class="sd"> ::</span>
<span class="sd"> before (string):</span>
<span class="sd"> FILE_DESCRIPTION((&#39;Open CASCADE Model&#39;),&#39;2;1&#39;);</span>
<span class="sd"> FILE_NAME(&#39;Open CASCADE Shape Model&#39;,&#39;2019-10-14T14:32:20&#39;,(&#39;Author&#39;),(</span>
<span class="sd"> &#39;Open CASCADE&#39;),&#39;Open CASCADE STEP processor 7.1&#39;,&#39;Open CASCADE 7.1&#39;</span>
<span class="sd"> ,&#39;Unknown&#39;);</span>
<span class="sd"> FILE_SCHEMA((&#39;AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }&#39;));</span>
<span class="sd"> after (list elements one per line):</span>
<span class="sd"> FILE_DESCRIPTION((&#39;Open CASCADE Model&#39;),&#39;2;1&#39;)</span>
<span class="sd"> FILE_NAME(&#39;Open CASCADE Shape Model&#39;,&#39;2019-10-14T14:32:20&#39;,(&#39;Author&#39;),(&#39;Open CASCADE&#39;),&#39;Open CASCADE STEP processor 7.1&#39;,&#39;Open CASCADE 7.1&#39;,&#39;Unknown&#39;)</span>
<span class="sd"> FILE_SCHEMA((&#39;AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }&#39;))</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># for example blocks are seperated by ;\n</span>
<span class="n">blocks</span> <span class="o">=</span> <span class="n">string</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">delimiter</span><span class="p">)</span>
<span class="n">lines</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">block</span> <span class="ow">in</span> <span class="n">blocks</span><span class="p">:</span>
<span class="c1"># un-wrap block to single line</span>
<span class="c1"># remove \n and replace with newline_replacement</span>
<span class="n">line</span> <span class="o">=</span> <span class="n">newline_replacement</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">row</span><span class="o">.</span><span class="n">lstrip</span><span class="p">()</span> <span class="k">for</span>
<span class="n">row</span> <span class="ow">in</span> <span class="n">block</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)])</span>
<span class="c1"># append line if True (if it has some content)</span>
<span class="n">lines</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">line</span><span class="p">)</span> <span class="k">if</span> <span class="nb">bool</span><span class="p">(</span><span class="n">line</span><span class="p">)</span> <span class="k">else</span> <span class="kc">False</span>
<span class="k">return</span> <span class="n">lines</span></div>
</pre></div>
</div>

View File

@@ -0,0 +1,785 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title>pylib.data_step &#8212; 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.data_step</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">&quot;&quot;&quot;STEP reader.</span>
<span class="sd">:Date: 2020-01-03</span>
<span class="sd">.. module:: data_step</span>
<span class="sd"> :platform: *nix, Windows</span>
<span class="sd"> :synopsis: STEP reader.</span>
<span class="sd">.. moduleauthor:: Daniel Weschke &lt;daniel.weschke@directbox.de&gt;</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">.data</span> <span class="kn">import</span> <span class="n">read</span><span class="p">,</span> <span class="n">find_last</span><span class="p">,</span> <span class="n">str_between</span><span class="p">,</span> <span class="n">str_to_list</span>
<span class="kn">from</span> <span class="nn">.data_step_std</span> <span class="kn">import</span> <span class="p">(</span>
<span class="n">CARTESIAN_POINT</span><span class="p">,</span> <span class="n">VERTEX_POINT</span><span class="p">,</span> <span class="n">DIRECTION</span><span class="p">,</span> <span class="n">VECTOR</span><span class="p">,</span> <span class="n">LINE</span><span class="p">,</span>
<span class="n">AXIS2_PLACEMENT_2D</span><span class="p">,</span> <span class="n">AXIS2_PLACEMENT_3D</span><span class="p">,</span> <span class="n">CIRCLE</span><span class="p">,</span> <span class="n">SURFACE_CURVE</span><span class="p">,</span>
<span class="n">SEAM_CURVE</span><span class="p">,</span> <span class="n">EDGE_CURVE</span><span class="p">,</span> <span class="n">B_SPLINE_CURVE_WITH_KNOTS</span><span class="p">,</span>
<span class="n">ORIENTED_EDGE</span><span class="p">,</span> <span class="n">EDGE_LOOP</span><span class="p">,</span> <span class="n">ELLIPSE</span>
<span class="p">)</span>
<span class="kn">from</span> <span class="nn">.mathematics</span> <span class="kn">import</span> <span class="n">vector</span>
<span class="kn">from</span> <span class="nn">.geometry</span> <span class="kn">import</span> <span class="p">(</span>
<span class="n">World</span><span class="p">,</span> <span class="n">Line</span><span class="p">,</span> <span class="n">Point</span><span class="p">,</span> <span class="n">Circle</span><span class="p">,</span> <span class="n">CS</span><span class="p">,</span> <span class="n">ArcCircle</span><span class="p">,</span> <span class="n">ArcEllipse</span><span class="p">,</span> <span class="n">Direction</span><span class="p">,</span>
<span class="n">Polyline</span><span class="p">,</span> <span class="n">Ellipse</span><span class="p">,</span> <span class="n">B_spline_curve_with_knots</span><span class="p">,</span> <span class="n">ArcBSplineCurveWithKnots</span>
<span class="p">)</span>
<div class="viewcode-block" id="step"><a class="viewcode-back" href="../../pylib.data_step.html#pylib.data_step.step">[docs]</a><span class="k">class</span> <span class="nc">step</span><span class="p">:</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;STEP reader class.</span>
<span class="sd"> 1st read a STEP file.</span>
<span class="sd"> 2nd convert header and data section string to list of commands.</span>
<span class="sd"> The STEP file string can have commands distributed over several</span>
<span class="sd"> lines, the commands are seperated by ``;\n``. This class un-wraps</span>
<span class="sd"> each command into one line (remove ``\n``) and removes empty lines.</span>
<span class="sd"> :Example:</span>
<span class="sd"> ::</span>
<span class="sd"> header part of a step file (between HEADER; and ENDSEC;):</span>
<span class="sd"> FILE_DESCRIPTION((&#39;Open CASCADE Model&#39;),&#39;2;1&#39;);</span>
<span class="sd"> FILE_NAME(&#39;Open CASCADE Shape Model&#39;,&#39;2019-10-14T14:32:20&#39;,(&#39;Author&#39;),(</span>
<span class="sd"> &#39;Open CASCADE&#39;),&#39;Open CASCADE STEP processor 7.1&#39;,&#39;Open CASCADE 7.1&#39;</span>
<span class="sd"> ,&#39;Unknown&#39;);</span>
<span class="sd"> FILE_SCHEMA((&#39;AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }&#39;));</span>
<span class="sd"> will result in (but as a list):</span>
<span class="sd"> FILE_DESCRIPTION((&#39;Open CASCADE Model&#39;),&#39;2;1&#39;)</span>
<span class="sd"> FILE_NAME(&#39;Open CASCADE Shape Model&#39;,&#39;2019-10-14T14:32:20&#39;,(&#39;Author&#39;),(&#39;Open CASCADE&#39;),&#39;Open CASCADE STEP processor 7.1&#39;,&#39;Open CASCADE 7.1&#39;,&#39;Unknown&#39;)</span>
<span class="sd"> FILE_SCHEMA((&#39;AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }&#39;))</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">file_name</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">file_str</span> <span class="o">=</span> <span class="n">read</span><span class="p">(</span><span class="n">file_name</span><span class="p">)</span>
<span class="n">step_str</span> <span class="o">=</span> <span class="n">str_between</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">file_str</span><span class="p">,</span> <span class="s1">&#39;ISO-10303-21;&#39;</span><span class="p">,</span>
<span class="s1">&#39;END-ISO-10303-21;&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">step_str</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;File is not a step file&#39;</span><span class="p">)</span>
<span class="n">header_str</span> <span class="o">=</span> <span class="n">str_between</span><span class="p">(</span><span class="n">step_str</span><span class="p">,</span> <span class="s1">&#39;HEADER;&#39;</span><span class="p">,</span> <span class="s1">&#39;ENDSEC;&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">header</span> <span class="o">=</span> <span class="n">str_to_list</span><span class="p">(</span><span class="n">string</span><span class="o">=</span><span class="n">header_str</span><span class="p">,</span> <span class="n">delimiter</span><span class="o">=</span><span class="s1">&#39;;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span>
<span class="n">newline_replacement</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">)</span>
<span class="n">data_str</span> <span class="o">=</span> <span class="n">str_between</span><span class="p">(</span><span class="n">step_str</span><span class="p">,</span> <span class="s1">&#39;DATA;&#39;</span><span class="p">,</span> <span class="s1">&#39;ENDSEC;&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">str_to_list</span><span class="p">(</span><span class="n">string</span><span class="o">=</span><span class="n">data_str</span><span class="p">,</span> <span class="n">delimiter</span><span class="o">=</span><span class="s1">&#39;;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span>
<span class="n">newline_replacement</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">)</span></div>
<div class="viewcode-block" id="str_to_cmd_args"><a class="viewcode-back" href="../../pylib.data_step.html#pylib.data_step.str_to_cmd_args">[docs]</a><span class="k">def</span> <span class="nf">str_to_cmd_args</span><span class="p">(</span><span class="n">cmd_str</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Using negative lookahead to match all the commas which are not</span>
<span class="sd"> inside a parenthesis and then split the string at the commas.</span>
<span class="sd"> :Example:</span>
<span class="sd"> ::</span>
<span class="sd"> CARTESIAN_POINT(&#39;&#39;,(0.E+000,0.E+000,0.E+000))</span>
<span class="sd"> will become</span>
<span class="sd"> command = &#39;CARTESIAN_POINT&#39;</span>
<span class="sd"> arguments = [&#39;&#39;, &#39;(0.E+000,0.E+000,0.E+000)&#39;]</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">re</span>
<span class="n">command</span> <span class="o">=</span> <span class="n">cmd_str</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="n">cmd_str</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">&#39;(&#39;</span><span class="p">)]</span>
<span class="n">inside_parenthesis</span> <span class="o">=</span> <span class="n">cmd_str</span><span class="p">[(</span><span class="n">cmd_str</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">&#39;(&#39;</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span><span class="n">find_last</span><span class="p">(</span><span class="n">cmd_str</span><span class="p">,</span> <span class="s1">&#39;)&#39;</span><span class="p">)]</span>
<span class="n">arguments</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;,\s*(?![^()]*\))&#39;</span><span class="p">,</span> <span class="n">inside_parenthesis</span><span class="p">)</span>
<span class="c1"># arguments = [i.strip() for i in inside_parenthesis.split(&#39;,&#39;)] # does not work for arguments with commas inside the parenthsis</span>
<span class="k">return</span> <span class="n">command</span><span class="p">,</span> <span class="n">arguments</span></div>
<div class="viewcode-block" id="data_cmds_to_data_dict"><a class="viewcode-back" href="../../pylib.data_step.html#pylib.data_step.data_cmds_to_data_dict">[docs]</a><span class="k">def</span> <span class="nf">data_cmds_to_data_dict</span><span class="p">(</span><span class="n">data_cmds</span><span class="p">,</span> <span class="n">verbose</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Create dict with step objects</span>
<span class="sd"> 1st it creats keys equal to the number id string and values with</span>
<span class="sd"> the command string.</span>
<span class="sd"> 2nd it creats keys for different step object types to dict all</span>
<span class="sd"> commands as new created objects of that type.</span>
<span class="sd"> :Example:</span>
<span class="sd"> ::</span>
<span class="sd"> from:</span>
<span class="sd"> [&quot;#12 = CARTESIAN_POINT(&#39;&#39;,(0.E+000,0.E+000,0.E+000))&quot;,</span>
<span class="sd"> &quot;#22 = VERTEX_POINT(&#39;&#39;,#23)&quot;]</span>
<span class="sd"> to:</span>
<span class="sd"> {&#39;#12&#39;: &#39;CARTESIAN_POINT(&#39;&#39;,(0.E+000,0.E+000,0.E+000))&#39;,</span>
<span class="sd"> &#39;#22&#39;: &#39;VERTEX_POINT(&#39;&#39;,#23)&#39;}</span>
<span class="sd"> additional</span>
<span class="sd"> {</span>
<span class="sd"> &#39;cartesian_points&#39;: {</span>
<span class="sd"> &#39;#12&#39;: pointer_to_new_created_point_object,</span>
<span class="sd"> ...</span>
<span class="sd"> },</span>
<span class="sd"> &#39;vertex_points&#39;: {</span>
<span class="sd"> &#39;#22&#39;: pointer_to_new_created_vertex_object,</span>
<span class="sd"> ...</span>
<span class="sd"> },</span>
<span class="sd"> ...</span>
<span class="sd"> }</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">data_dict</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cartesian_point&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;vertex_point&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;direction&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;vector&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;line&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;circle&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;ellipse&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;axis2_placement_2d&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;axis2_placement_3d&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;surface_curve&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;seam_curve&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;b_spline_curve_with_knots&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;edge_curve&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;oriented_edge&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;edge_loop&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">processed_cmds</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">ignored_cmds</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">for</span> <span class="n">data_cmd</span> <span class="ow">in</span> <span class="n">data_cmds</span><span class="p">:</span>
<span class="c1">#print(data_cmd)</span>
<span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="n">data_cmd</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;=&#39;</span><span class="p">)</span>
<span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="n">key</span><span class="o">.</span><span class="n">strip</span><span class="p">(),</span> <span class="n">value</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="n">command</span><span class="p">,</span> <span class="n">arguments</span> <span class="o">=</span> <span class="n">str_to_cmd_args</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">command</span><span class="p">,</span> <span class="n">arguments</span><span class="p">)</span>
<span class="c1"># command can be empty (empty string: &#39;&#39;)</span>
<span class="c1"># #2052 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT(&#39;2D SPACE&#39;,&#39;&#39;) )</span>
<span class="k">try</span><span class="p">:</span> <span class="c1"># do if command.lower() is in data_dict else do nothing</span>
<span class="n">data_dict</span><span class="p">[</span><span class="n">command</span><span class="o">.</span><span class="n">lower</span><span class="p">()][</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">processed_cmds</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">except</span><span class="p">:</span>
<span class="n">ignored_cmds</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;processed_cmds&#39;</span><span class="p">,</span> <span class="n">processed_cmds</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;ignored_cmds&#39;</span><span class="p">,</span> <span class="n">ignored_cmds</span><span class="p">)</span>
<span class="c1">#</span>
<span class="c1"># Order is important!</span>
<span class="c1">#</span>
<span class="c1">#</span>
<span class="c1"># POINT objects</span>
<span class="c1">#</span>
<span class="c1"># create point objects, these will be referenced by vertex_points</span>
<span class="c1"># #12 = CARTESIAN_POINT(&#39;&#39;,(0.E+000,0.E+000,0.E+000));</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cartesian_point&#39;</span><span class="p">]:</span>
<span class="n">command</span><span class="p">,</span> <span class="n">arguments</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cartesian_point&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">CARTESIAN_POINT</span><span class="p">(</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
<span class="nb">eval</span><span class="p">(</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span> <span class="c1"># tuple of floats # TODO: not use eval!</span>
<span class="c1"># vertex_points references to cartesian_points</span>
<span class="c1"># #22 = VERTEX_POINT(&#39;&#39;,#23);</span>
<span class="c1"># #23 = CARTESIAN_POINT(&#39;&#39;,(0.E+000,0.E+000,0.E+000));</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;vertex_point&#39;</span><span class="p">]:</span>
<span class="n">command</span><span class="p">,</span> <span class="n">arguments</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;vertex_point&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">VERTEX_POINT</span><span class="p">(</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cartesian_point&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]])</span>
<span class="c1">#</span>
<span class="c1"># EDGE objects</span>
<span class="c1">#</span>
<span class="c1"># DIRECTIONs</span>
<span class="c1"># #30 = DIRECTION(&#39;&#39;,(0.E+000,0.E+000,1.));</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;direction&#39;</span><span class="p">]:</span>
<span class="n">command</span><span class="p">,</span> <span class="n">arguments</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;direction&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">DIRECTION</span><span class="p">(</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
<span class="nb">eval</span><span class="p">(</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span> <span class="c1"># tuple of floats # TODO: not use eval!</span>
<span class="c1"># VECTORs references to DIRECTIONs</span>
<span class="c1"># #29 = VECTOR(&#39;&#39;,#30,1.);</span>
<span class="c1"># #30 = DIRECTION(&#39;&#39;,(0.E+000,0.E+000,1.));</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;vector&#39;</span><span class="p">]:</span>
<span class="n">command</span><span class="p">,</span> <span class="n">arguments</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;vector&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">VECTOR</span><span class="p">(</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;direction&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]],</span>
<span class="nb">eval</span><span class="p">(</span><span class="n">arguments</span><span class="p">[</span><span class="mi">2</span><span class="p">]))</span> <span class="c1"># TODO: not use eval!</span>
<span class="c1"># LINEs references to cartesian_point and vector</span>
<span class="c1"># #27 = LINE(&#39;&#39;,#28,#29);</span>
<span class="c1"># #28 = CARTESIAN_POINT(&#39;&#39;,(0.E+000,0.E+000,0.E+000));</span>
<span class="c1"># #29 = VECTOR(&#39;&#39;,#30,1.);</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;line&#39;</span><span class="p">]:</span>
<span class="n">command</span><span class="p">,</span> <span class="n">arguments</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;line&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">LINE</span><span class="p">(</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cartesian_point&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]],</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;vector&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">2</span><span class="p">]])</span>
<span class="c1"># AXIS2_PLACEMENT_2Ds references to location (CARTESIAN_POINT) and ref_direction (DIRECTION)</span>
<span class="c1"># #50 = AXIS2_PLACEMENT_2D(&#39;&#39;,#51,#52);</span>
<span class="c1"># #51 = CARTESIAN_POINT(&#39;&#39;,(0.,0.));</span>
<span class="c1"># #52 = DIRECTION(&#39;&#39;,(1.,0.));</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;axis2_placement_2d&#39;</span><span class="p">]:</span>
<span class="n">command</span><span class="p">,</span> <span class="n">arguments</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;axis2_placement_2d&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">AXIS2_PLACEMENT_2D</span><span class="p">(</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cartesian_point&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]],</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;direction&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">2</span><span class="p">]])</span>
<span class="c1"># AXIS2_PLACEMENT_3Ds references to location (CARTESIAN_POINT), axis (DIRECTION) and ref_direction (DIRECTION)</span>
<span class="c1"># #26 = AXIS2_PLACEMENT_3D(&#39;&#39;,#27,#28,#29);</span>
<span class="c1"># #27 = CARTESIAN_POINT(&#39;&#39;,(0.,0.,10.));</span>
<span class="c1"># #28 = DIRECTION(&#39;&#39;,(0.,0.,1.));</span>
<span class="c1"># #29 = DIRECTION(&#39;&#39;,(1.,0.,-0.));</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;axis2_placement_3d&#39;</span><span class="p">]:</span>
<span class="n">command</span><span class="p">,</span> <span class="n">arguments</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;axis2_placement_3d&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">AXIS2_PLACEMENT_3D</span><span class="p">(</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cartesian_point&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]],</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;direction&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">2</span><span class="p">]],</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;direction&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">3</span><span class="p">]])</span>
<span class="c1"># CIRCLE references to AXIS2_PLACEMENT_3D and radius</span>
<span class="c1"># #25 = CIRCLE(&#39;&#39;,#26,5.);</span>
<span class="c1"># #26 = AXIS2_PLACEMENT_3D(&#39;&#39;,#27,#28,#29);</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;circle&#39;</span><span class="p">]:</span>
<span class="n">command</span><span class="p">,</span> <span class="n">arguments</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span>
<span class="n">axis2_placement_cmd</span><span class="p">,</span> <span class="n">axis2_placement_args</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span>
<span class="k">if</span> <span class="n">axis2_placement_cmd</span> <span class="o">==</span> <span class="s1">&#39;AXIS2_PLACEMENT_3D&#39;</span><span class="p">:</span>
<span class="n">axis2_placement</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;axis2_placement_3d&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span>
<span class="k">elif</span> <span class="n">axis2_placement_cmd</span> <span class="o">==</span> <span class="s1">&#39;AXIS2_PLACEMENT_2D&#39;</span><span class="p">:</span>
<span class="n">axis2_placement</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;axis2_placement_2d&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;circle&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">CIRCLE</span><span class="p">(</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
<span class="n">axis2_placement</span><span class="p">,</span>
<span class="nb">eval</span><span class="p">(</span><span class="n">arguments</span><span class="p">[</span><span class="mi">2</span><span class="p">]))</span> <span class="c1"># TODO: not use eval!</span>
<span class="c1"># ELLIPSE references to AXIS2_PLACEMENT_3D and both semi axes</span>
<span class="c1"># #1049 = ELLIPSE(&#39;&#39;,#1050,176.13914953808,100.);</span>
<span class="c1"># #1050 = AXIS2_PLACEMENT_3D(&#39;&#39;,#1051,#1052,#1053);</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;ellipse&#39;</span><span class="p">]:</span>
<span class="n">command</span><span class="p">,</span> <span class="n">arguments</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span>
<span class="n">axis2_placement_cmd</span><span class="p">,</span> <span class="n">axis2_placement_args</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span>
<span class="k">if</span> <span class="n">axis2_placement_cmd</span> <span class="o">==</span> <span class="s1">&#39;AXIS2_PLACEMENT_3D&#39;</span><span class="p">:</span>
<span class="n">axis2_placement</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;axis2_placement_3d&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span>
<span class="k">elif</span> <span class="n">axis2_placement_cmd</span> <span class="o">==</span> <span class="s1">&#39;AXIS2_PLACEMENT_2D&#39;</span><span class="p">:</span>
<span class="n">axis2_placement</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;axis2_placement_2d&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;ellipse&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">ELLIPSE</span><span class="p">(</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
<span class="n">axis2_placement</span><span class="p">,</span>
<span class="nb">eval</span><span class="p">(</span><span class="n">arguments</span><span class="p">[</span><span class="mi">2</span><span class="p">]),</span> <span class="c1"># TODO: not use eval!</span>
<span class="nb">eval</span><span class="p">(</span><span class="n">arguments</span><span class="p">[</span><span class="mi">3</span><span class="p">]))</span> <span class="c1"># TODO: not use eval!</span>
<span class="c1"># B_SPLINE_CURVE_WITH_KNOTS references to list of CARTESIAN_POINTs</span>
<span class="c1"># #2195=B_SPLINE_CURVE_WITH_KNOTS(&#39;&#39;,3,(#43614,#43615,#43616,#43617,#43618,</span>
<span class="c1"># #43619,#43620,#43621,#43622,#43623,#43624,#43625,#43626,#43627,#43628,#43629,</span>
<span class="c1"># #43630,#43631,#43632,#43633),.UNSPECIFIED.,.F.,.F.,(4,2,2,2,2,2,2,2,2,4),</span>
<span class="c1"># (-0.540362356556626,-0.521155983847334,-0.45632355837375,-0.391167894616668,</span>
<span class="c1"># -0.32606569132423,-0.260898117378603,-0.19567917747905,-0.130414239126491,</span>
<span class="c1"># -0.0649893846296135,-0.0228378692889149),.UNSPECIFIED.);</span>
<span class="c1"># #43614=CARTESIAN_POINT(&#39;Ctrl Pts&#39;,(-0.852590969048745,68.3094592905054,1.00613961606655E-15));</span>
<span class="c1"># #43615=CARTESIAN_POINT(&#39;Ctrl Pts&#39;,(-0.879956199816603,68.2515804555212,8.67420237522527E-16));</span>
<span class="c1"># ...</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;b_spline_curve_with_knots&#39;</span><span class="p">]:</span>
<span class="n">command</span><span class="p">,</span> <span class="n">arguments</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;b_spline_curve_with_knots&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">B_SPLINE_CURVE_WITH_KNOTS</span><span class="p">(</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
<span class="nb">int</span><span class="p">(</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]),</span>
<span class="nb">tuple</span><span class="p">(</span><span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cartesian_point&#39;</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="k">for</span>
<span class="n">i</span> <span class="ow">in</span> <span class="n">str_to_cmd_args</span><span class="p">(</span><span class="n">arguments</span><span class="p">[</span><span class="mi">2</span><span class="p">])[</span><span class="mi">1</span><span class="p">]),</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">3</span><span class="p">],</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">4</span><span class="p">],</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">5</span><span class="p">],</span>
<span class="nb">eval</span><span class="p">(</span><span class="n">arguments</span><span class="p">[</span><span class="mi">6</span><span class="p">]),</span> <span class="c1"># TODO: not use eval!</span>
<span class="nb">eval</span><span class="p">(</span><span class="n">arguments</span><span class="p">[</span><span class="mi">7</span><span class="p">]),</span> <span class="c1"># TODO: not use eval!</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">8</span><span class="p">]</span>
<span class="p">)</span>
<span class="c1"># SURFACE_CURVE references to a LINE and a list of (two) PCURVEs and a ?</span>
<span class="c1"># #26 = SURFACE_CURVE(&#39;&#39;,#27,(#31,#43),.PCURVE_S1.);</span>
<span class="c1"># #27 = LINE(&#39;&#39;,#28,#29);</span>
<span class="c1"># #31 = PCURVE(&#39;&#39;,#32,#37);</span>
<span class="c1"># #32 = PLANE(&#39;&#39;,#33);</span>
<span class="c1"># #33 = AXIS2_PLACEMENT_3D(&#39;&#39;,#34,#35,#36);</span>
<span class="c1"># #37 = DEFINITIONAL_REPRESENTATION(&#39;&#39;,(#38),#42);</span>
<span class="c1"># #38 = LINE(&#39;&#39;,#39,#40);</span>
<span class="c1"># #42 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT(&#39;2D SPACE&#39;,&#39;&#39;) );</span>
<span class="c1"># #43 = PCURVE(&#39;&#39;,#44,#49);</span>
<span class="c1"># #44 = PLANE(&#39;&#39;,#45);</span>
<span class="c1"># #45 = AXIS2_PLACEMENT_3D(&#39;&#39;,#46,#47,#48);</span>
<span class="c1"># #49 = DEFINITIONAL_REPRESENTATION(&#39;&#39;,(#50),#54);</span>
<span class="c1"># #50 = LINE(&#39;&#39;,#51,#52);</span>
<span class="c1"># #54 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT(&#39;2D SPACE&#39;,&#39;&#39;) );</span>
<span class="c1"># #24 = SURFACE_CURVE(&#39;&#39;,#25,(#30,#42),.PCURVE_S1.);</span>
<span class="c1"># #25 = CIRCLE(&#39;&#39;,#26,5.);</span>
<span class="c1"># #30 = PCURVE(&#39;&#39;,#31,#36);</span>
<span class="c1"># #31 = CONICAL_SURFACE(&#39;&#39;,#32,10.,0.463647609001);</span>
<span class="c1"># #32 = AXIS2_PLACEMENT_3D(&#39;&#39;,#33,#34,#35);</span>
<span class="c1"># #36 = DEFINITIONAL_REPRESENTATION(&#39;&#39;,(#37),#41);</span>
<span class="c1"># #37 = LINE(&#39;&#39;,#38,#39);</span>
<span class="c1"># #41 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT(&#39;2D SPACE&#39;,&#39;&#39;) );</span>
<span class="c1"># #42 = PCURVE(&#39;&#39;,#43,#48);</span>
<span class="c1"># #43 = PLANE(&#39;&#39;,#44);</span>
<span class="c1"># #44 = AXIS2_PLACEMENT_3D(&#39;&#39;,#45,#46,#47);</span>
<span class="c1"># #48 = DEFINITIONAL_REPRESENTATION(&#39;&#39;,(#49),#53);</span>
<span class="c1"># #49 = CIRCLE(&#39;&#39;,#50,5.);</span>
<span class="c1"># #50 = AXIS2_PLACEMENT_2D(&#39;&#39;,#51,#52);</span>
<span class="c1"># #51 = CARTESIAN_POINT(&#39;&#39;,(0.,0.));</span>
<span class="c1"># #52 = DIRECTION(&#39;&#39;,(1.,0.));</span>
<span class="c1"># #53 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT(&#39;2D SPACE&#39;,&#39;&#39;) );</span>
<span class="c1"># #243 = SURFACE_CURVE(&#39;&#39;,#244,(#319,#415),.PCURVE_S1.);</span>
<span class="c1"># #244 = B_SPLINE_CURVE_WITH_KNOTS();</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;surface_curve&#39;</span><span class="p">]:</span>
<span class="n">command</span><span class="p">,</span> <span class="n">arguments</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span>
<span class="n">curve_3d_cmd</span><span class="p">,</span> <span class="n">curve3d_args</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span>
<span class="k">if</span> <span class="n">curve_3d_cmd</span> <span class="o">==</span> <span class="s1">&#39;LINE&#39;</span><span class="p">:</span>
<span class="n">curve_3d</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;line&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span>
<span class="k">elif</span> <span class="n">curve_3d_cmd</span> <span class="o">==</span> <span class="s1">&#39;CIRCLE&#39;</span><span class="p">:</span>
<span class="n">curve_3d</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;circle&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span>
<span class="k">elif</span> <span class="n">curve_3d_cmd</span> <span class="o">==</span> <span class="s1">&#39;ELLIPSE&#39;</span><span class="p">:</span>
<span class="n">curve_3d</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;ellipse&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span>
<span class="k">elif</span> <span class="n">curve_3d_cmd</span> <span class="o">==</span> <span class="s1">&#39;B_SPLINE_CURVE_WITH_KNOTS&#39;</span><span class="p">:</span>
<span class="n">curve_3d</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;b_spline_curve_with_knots&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">curve_3d</span> <span class="o">=</span> <span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="k">if</span> <span class="n">verbose</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;surface_curve&#39;</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="s1">&#39;unknown curve_3d&#39;</span><span class="p">,</span> <span class="n">curve_3d</span><span class="p">)</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;surface_curve&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">SURFACE_CURVE</span><span class="p">(</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
<span class="n">curve_3d</span><span class="p">,</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">3</span><span class="p">])</span>
<span class="c1"># SEAM_CURVE references to a Line and a list of (two) PCURVEs and a ?</span>
<span class="c1"># #58 = SEAM_CURVE(&#39;&#39;,#59,(#63,#70),.PCURVE_S1.);</span>
<span class="c1"># #59 = LINE(&#39;&#39;,#60,#61);</span>
<span class="c1"># #63 = PCURVE(&#39;&#39;,#31,#64);</span>
<span class="c1"># #31 = CONICAL_SURFACE(&#39;&#39;,#32,10.,0.463647609001);</span>
<span class="c1"># #32 = AXIS2_PLACEMENT_3D(&#39;&#39;,#33,#34,#35);</span>
<span class="c1"># #33 = CARTESIAN_POINT(&#39;&#39;,(0.,0.,0.));</span>
<span class="c1"># #34 = DIRECTION(&#39;&#39;,(-0.,-0.,-1.));</span>
<span class="c1"># #35 = DIRECTION(&#39;&#39;,(1.,0.,-0.));</span>
<span class="c1"># #64 = DEFINITIONAL_REPRESENTATION(&#39;&#39;,(#65),#69);</span>
<span class="c1"># #65 = LINE(&#39;&#39;,#66,#67);</span>
<span class="c1"># #69 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT(&#39;2D SPACE&#39;,&#39;&#39;) );</span>
<span class="c1"># #70 = PCURVE(&#39;&#39;,#31,#71);</span>
<span class="c1"># #31 = CONICAL_SURFACE(&#39;&#39;,#32,10.,0.463647609001);</span>
<span class="c1"># #32 = AXIS2_PLACEMENT_3D(&#39;&#39;,#33,#34,#35);</span>
<span class="c1"># #33 = CARTESIAN_POINT(&#39;&#39;,(0.,0.,0.));</span>
<span class="c1"># #34 = DIRECTION(&#39;&#39;,(-0.,-0.,-1.));</span>
<span class="c1"># #35 = DIRECTION(&#39;&#39;,(1.,0.,-0.));</span>
<span class="c1"># #71 = DEFINITIONAL_REPRESENTATION(&#39;&#39;,(#72),#76);</span>
<span class="c1"># #72 = LINE(&#39;&#39;,#73,#74);</span>
<span class="c1"># #76 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT(&#39;2D SPACE&#39;,&#39;&#39;) );</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;seam_curve&#39;</span><span class="p">]:</span>
<span class="n">command</span><span class="p">,</span> <span class="n">arguments</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span>
<span class="n">curve_3d_cmd</span><span class="p">,</span> <span class="n">curve3d_args</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span>
<span class="k">if</span> <span class="n">curve_3d_cmd</span> <span class="o">==</span> <span class="s1">&#39;LINE&#39;</span><span class="p">:</span>
<span class="n">curve_3d</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;line&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span>
<span class="k">elif</span> <span class="n">curve_3d_cmd</span> <span class="o">==</span> <span class="s1">&#39;CIRCLE&#39;</span><span class="p">:</span>
<span class="n">curve_3d</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;circle&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">curve_3d</span> <span class="o">=</span> <span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="k">if</span> <span class="n">verbose</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;seam_curve&#39;</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="s1">&#39;unknown curve_3d&#39;</span><span class="p">,</span> <span class="n">curve_3d</span><span class="p">)</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;seam_curve&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">SEAM_CURVE</span><span class="p">(</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
<span class="n">curve_3d</span><span class="p">,</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">3</span><span class="p">])</span>
<span class="c1"># EDGE_CURVE references to two VERTEX_POINTs, a CURVE and a BOOLEAN</span>
<span class="c1"># #21 = EDGE_CURVE(&#39;&#39;,#22,#24,#26,.T.);</span>
<span class="c1"># #22 = VERTEX_POINT(&#39;&#39;,#23);</span>
<span class="c1"># #24 = VERTEX_POINT(&#39;&#39;,#25);</span>
<span class="c1"># #26 = SURFACE_CURVE(&#39;&#39;,#27,(#31,#43),.PCURVE_S1.);</span>
<span class="c1"># #55 = EDGE_CURVE(&#39;&#39;,#56,#22,#58,.T.);</span>
<span class="c1"># #56 = VERTEX_POINT(&#39;&#39;,#57);</span>
<span class="c1"># #22 = VERTEX_POINT(&#39;&#39;,#23);</span>
<span class="c1"># #58 = SEAM_CURVE(&#39;&#39;,#59,(#63,#70),.PCURVE_S1.);</span>
<span class="c1"># #21187=EDGE_CURVE(&#39;&#39;,#15685,#15685,#12509,.T.);</span>
<span class="c1"># #15685=VERTEX_POINT(&#39;&#39;,#230114);</span>
<span class="c1"># #15685=VERTEX_POINT(&#39;&#39;,#230114);</span>
<span class="c1"># #12509=CIRCLE(&#39;&#39;,#37712,11.1464466094067);</span>
<span class="c1"># #15689=EDGE_CURVE(&#39;&#39;,#12514,#12512,#2195,.T.);</span>
<span class="c1"># #12514=VERTEX_POINT(&#39;&#39;,#43613);</span>
<span class="c1"># #12512=VERTEX_POINT(&#39;&#39;,#43610);</span>
<span class="c1"># #2195=B_SPLINE_CURVE_WITH_KNOTS(...)</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;edge_curve&#39;</span><span class="p">]:</span>
<span class="n">command</span><span class="p">,</span> <span class="n">arguments</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span>
<span class="n">geometry_cmd</span><span class="p">,</span> <span class="n">geometry_args</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">3</span><span class="p">]]</span>
<span class="k">if</span> <span class="n">geometry_cmd</span> <span class="o">==</span> <span class="s1">&#39;SURFACE_CURVE&#39;</span><span class="p">:</span>
<span class="n">edge_geometry</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;surface_curve&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">3</span><span class="p">]]</span>
<span class="k">elif</span> <span class="n">geometry_cmd</span> <span class="o">==</span> <span class="s1">&#39;SEAM_CURVE&#39;</span><span class="p">:</span>
<span class="n">edge_geometry</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;seam_curve&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">3</span><span class="p">]]</span>
<span class="k">elif</span> <span class="n">geometry_cmd</span> <span class="o">==</span> <span class="s1">&#39;LINE&#39;</span><span class="p">:</span>
<span class="n">edge_geometry</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;line&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">3</span><span class="p">]]</span>
<span class="k">elif</span> <span class="n">geometry_cmd</span> <span class="o">==</span> <span class="s1">&#39;CIRCLE&#39;</span><span class="p">:</span>
<span class="n">edge_geometry</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;circle&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">3</span><span class="p">]]</span>
<span class="k">elif</span> <span class="n">geometry_cmd</span> <span class="o">==</span> <span class="s1">&#39;B_SPLINE_CURVE_WITH_KNOTS&#39;</span><span class="p">:</span>
<span class="n">edge_geometry</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;b_spline_curve_with_knots&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">3</span><span class="p">]]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">edge_geometry</span> <span class="o">=</span> <span class="n">arguments</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span>
<span class="k">if</span> <span class="n">verbose</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;edge_curve&#39;</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="s1">&#39;unknown edge_geometry&#39;</span><span class="p">,</span> <span class="n">geometry_cmd</span><span class="p">)</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;edge_curve&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">EDGE_CURVE</span><span class="p">(</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;vertex_point&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]],</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;vertex_point&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">2</span><span class="p">]],</span>
<span class="n">edge_geometry</span><span class="p">,</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span>
<span class="p">)</span>
<span class="c1">#</span>
<span class="c1"># poly-curve objects</span>
<span class="c1"># to speed things up use EDGE_LOOP to create wireframes instead</span>
<span class="c1"># of plotting every single EDGE_CURVE in it&#39;s own plot cmd</span>
<span class="c1">#</span>
<span class="c1"># ORIENTED_EDGE references to two re-declared attributes from a CURVE, a CURVE and a BOOLEAN</span>
<span class="c1"># 83 = ORIENTED_EDGE(&#39;&#39;,*,*,#84,.F.);</span>
<span class="c1"># #84 = EDGE_CURVE(&#39;&#39;,#85,#87,#89,.T.);</span>
<span class="c1"># ORIENTED_EDGE will have multiple same edges, because connected faces</span>
<span class="c1"># use the same curve (about double as EDGE_CURVE)</span>
<span class="c1"># BUT combined with EDGE_LOOP the number of concatenated curves decrease.</span>
<span class="c1"># (about half to 2/3 of EDGE_CURVE)</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;oriented_edge&#39;</span><span class="p">]:</span>
<span class="n">command</span><span class="p">,</span> <span class="n">arguments</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span>
<span class="n">edge_element_cmd</span><span class="p">,</span> <span class="n">edge_element_args</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">3</span><span class="p">]]</span>
<span class="k">if</span> <span class="n">edge_element_cmd</span> <span class="o">==</span> <span class="s1">&#39;EDGE_CURVE&#39;</span><span class="p">:</span>
<span class="n">edge_element</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;edge_curve&#39;</span><span class="p">][</span><span class="n">arguments</span><span class="p">[</span><span class="mi">3</span><span class="p">]]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">edge_element</span> <span class="o">=</span> <span class="n">arguments</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span>
<span class="k">if</span> <span class="n">verbose</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;oriented_edge&#39;</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="s1">&#39;unknown edge_element&#39;</span><span class="p">,</span> <span class="n">edge_element_cmd</span><span class="p">)</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;oriented_edge&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">ORIENTED_EDGE</span><span class="p">(</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span>
<span class="n">edge_element</span><span class="p">,</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span>
<span class="p">)</span>
<span class="c1"># EDGE_LOOP</span>
<span class="c1"># #82 = EDGE_LOOP(&#39;&#39;,(#83,#118,#146,#174));</span>
<span class="c1"># #83 = ORIENTED_EDGE(&#39;&#39;,*,*,#84,.F.);</span>
<span class="c1"># #118 = ORIENTED_EDGE(&#39;&#39;,*,*,#119,.T.);</span>
<span class="c1"># #146 = ORIENTED_EDGE(&#39;&#39;,*,*,#147,.T.);</span>
<span class="c1"># #174 = ORIENTED_EDGE(&#39;&#39;,*,*,#175,.F.);</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;edge_loop&#39;</span><span class="p">]:</span>
<span class="n">command</span><span class="p">,</span> <span class="n">arguments</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;cmds&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;edge_loop&#39;</span><span class="p">][</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">EDGE_LOOP</span><span class="p">(</span>
<span class="n">arguments</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
<span class="nb">tuple</span><span class="p">(</span><span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;oriented_edge&#39;</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="k">for</span>
<span class="n">i</span> <span class="ow">in</span> <span class="n">str_to_cmd_args</span><span class="p">(</span><span class="n">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">])[</span><span class="mi">1</span><span class="p">]),</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">data_dict</span></div>
<div class="viewcode-block" id="data_section_dict"><a class="viewcode-back" href="../../pylib.data_step.html#pylib.data_step.data_section_dict">[docs]</a><span class="k">def</span> <span class="nf">data_section_dict</span><span class="p">(</span><span class="n">step</span><span class="p">,</span> <span class="n">verbose</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="k">return</span> <span class="n">data_cmds_to_data_dict</span><span class="p">(</span><span class="n">step</span><span class="o">.</span><span class="n">data</span><span class="p">,</span> <span class="n">verbose</span><span class="p">)</span></div>
<div class="viewcode-block" id="line_geometry"><a class="viewcode-back" href="../../pylib.data_step.html#pylib.data_step.line_geometry">[docs]</a><span class="k">def</span> <span class="nf">line_geometry</span><span class="p">(</span><span class="n">p1</span><span class="p">,</span> <span class="n">p2</span><span class="p">):</span>
<span class="c1"># (normally)</span>
<span class="c1"># edge_curve.edge_geometry.curve_3d.pnt.coordinates is</span>
<span class="c1"># equal to p1 (see above) this is</span>
<span class="c1"># edge_curve.edge_start.vertex_geometry.coordinates</span>
<span class="c1"># p2 could be calculated from</span>
<span class="c1"># edge_curve.edge_geometry.curve_3d.dir.orientation.direction_ratios</span>
<span class="c1"># and edge_curve.edge_geometry.curve_3d.dir.magnitude</span>
<span class="c1"># vector = [i*edge_curve.edge_geometry.curve_3d.dir.magnitude for</span>
<span class="c1"># i in edge_curve.edge_geometry.curve_3d.dir.orientation.direction_ratios]</span>
<span class="k">return</span> <span class="n">Line</span><span class="p">(</span><span class="n">point1</span><span class="o">=</span><span class="n">p1</span><span class="p">,</span> <span class="n">point2</span><span class="o">=</span><span class="n">p2</span><span class="p">)</span></div>
<span class="kn">import</span> <span class="nn">math</span>
<div class="viewcode-block" id="arc_circle_geometry"><a class="viewcode-back" href="../../pylib.data_step.html#pylib.data_step.arc_circle_geometry">[docs]</a><span class="k">def</span> <span class="nf">arc_circle_geometry</span><span class="p">(</span><span class="n">conic</span><span class="p">,</span> <span class="n">p1</span><span class="p">,</span> <span class="n">p2</span><span class="p">,</span> <span class="n">ellipse</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="n">z</span> <span class="o">=</span> <span class="n">Direction</span><span class="p">(</span><span class="o">*</span><span class="n">conic</span><span class="o">.</span><span class="n">position</span><span class="o">.</span><span class="n">axis</span><span class="o">.</span><span class="n">direction_ratios</span><span class="p">)</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">Direction</span><span class="p">(</span><span class="o">*</span><span class="n">conic</span><span class="o">.</span><span class="n">position</span><span class="o">.</span><span class="n">ref_direction</span><span class="o">.</span><span class="n">direction_ratios</span><span class="p">)</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">Direction</span><span class="o">.</span><span class="n">cross</span><span class="p">(</span><span class="n">z</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span>
<span class="n">cs_gl</span> <span class="o">=</span> <span class="n">CS</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span><span class="p">)</span> <span class="c1"># transform from global to local</span>
<span class="n">cs_lg</span> <span class="o">=</span> <span class="n">CS</span><span class="o">.</span><span class="n">transposed</span><span class="p">(</span><span class="n">cs_gl</span><span class="p">)</span> <span class="c1"># transform from local to global</span>
<span class="n">location</span> <span class="o">=</span> <span class="n">vector</span><span class="p">(</span><span class="n">conic</span><span class="o">.</span><span class="n">position</span><span class="o">.</span><span class="n">location</span><span class="o">.</span><span class="n">coordinates</span><span class="p">)</span>
<span class="k">if</span> <span class="n">p1</span> <span class="o">==</span> <span class="n">p2</span><span class="p">:</span> <span class="c1"># Full Circle or Ellipse</span>
<span class="k">if</span> <span class="n">ellipse</span><span class="p">:</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">conic</span><span class="o">.</span><span class="n">semi_axis_1</span>
<span class="n">b</span> <span class="o">=</span> <span class="n">conic</span><span class="o">.</span><span class="n">semi_axis_2</span>
<span class="k">return</span> <span class="n">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="o">.</span><span class="n">ch_cs</span><span class="p">(</span><span class="n">cs_lg</span><span class="p">)</span><span class="o">.</span><span class="n">translate</span><span class="p">(</span><span class="o">*</span><span class="n">location</span><span class="p">)</span>
<span class="c1"># else Circle</span>
<span class="n">radius</span> <span class="o">=</span> <span class="n">conic</span><span class="o">.</span><span class="n">radius</span>
<span class="k">return</span> <span class="n">Circle</span><span class="p">(</span><span class="n">radius</span><span class="p">)</span><span class="o">.</span><span class="n">ch_cs</span><span class="p">(</span><span class="n">cs_lg</span><span class="p">)</span><span class="o">.</span><span class="n">translate</span><span class="p">(</span><span class="o">*</span><span class="n">location</span><span class="p">)</span>
<span class="c1"># else Arc</span>
<span class="c1"># points relative to the location</span>
<span class="n">v1</span><span class="p">,</span> <span class="n">v2</span> <span class="o">=</span> <span class="n">p1</span> <span class="o">-</span> <span class="n">location</span><span class="p">,</span> <span class="n">p2</span> <span class="o">-</span> <span class="n">location</span>
<span class="c1">#ang1, ang2 = vector.ang(x, v1), vector.ang(x, v2)</span>
<span class="c1"># relative points transformed into circle coordinate system</span>
<span class="c1"># relative point lay in local xy-plane</span>
<span class="n">vl1</span><span class="p">,</span> <span class="n">vl2</span> <span class="o">=</span> <span class="n">vector</span><span class="p">(</span><span class="n">v1</span><span class="p">)</span><span class="o">.</span><span class="n">ch_cs</span><span class="p">(</span><span class="n">cs_gl</span><span class="p">),</span> <span class="n">vector</span><span class="p">(</span><span class="n">v2</span><span class="p">)</span><span class="o">.</span><span class="n">ch_cs</span><span class="p">(</span><span class="n">cs_gl</span><span class="p">)</span>
<span class="n">ang1</span><span class="p">,</span> <span class="n">ang2</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">atan2</span><span class="p">(</span><span class="o">*</span><span class="n">vl1</span><span class="p">[:</span><span class="mi">2</span><span class="p">][::</span><span class="o">-</span><span class="mi">1</span><span class="p">]),</span> <span class="n">math</span><span class="o">.</span><span class="n">atan2</span><span class="p">(</span><span class="o">*</span><span class="n">vl2</span><span class="p">[:</span><span class="mi">2</span><span class="p">][::</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
<span class="k">if</span> <span class="n">ellipse</span><span class="p">:</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">conic</span><span class="o">.</span><span class="n">semi_axis_1</span>
<span class="n">b</span> <span class="o">=</span> <span class="n">conic</span><span class="o">.</span><span class="n">semi_axis_2</span>
<span class="k">return</span> <span class="n">ArcEllipse</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">ang1</span><span class="p">,</span> <span class="n">ang2</span><span class="p">)</span><span class="o">.</span><span class="n">ch_cs</span><span class="p">(</span><span class="n">cs_lg</span><span class="p">)</span><span class="o">.</span><span class="n">translate</span><span class="p">(</span><span class="o">*</span><span class="n">location</span><span class="p">)</span>
<span class="n">radius</span> <span class="o">=</span> <span class="n">conic</span><span class="o">.</span><span class="n">radius</span>
<span class="k">return</span> <span class="n">ArcCircle</span><span class="p">(</span><span class="n">radius</span><span class="p">,</span> <span class="n">ang1</span><span class="p">,</span> <span class="n">ang2</span><span class="p">)</span><span class="o">.</span><span class="n">ch_cs</span><span class="p">(</span><span class="n">cs_lg</span><span class="p">)</span><span class="o">.</span><span class="n">translate</span><span class="p">(</span><span class="o">*</span><span class="n">location</span><span class="p">)</span></div>
<span class="kn">import</span> <span class="nn">copy</span>
<div class="viewcode-block" id="b_spline_curve_with_knots_geometry"><a class="viewcode-back" href="../../pylib.data_step.html#pylib.data_step.b_spline_curve_with_knots_geometry">[docs]</a><span class="k">def</span> <span class="nf">b_spline_curve_with_knots_geometry</span><span class="p">(</span><span class="n">b_spline</span><span class="p">,</span> <span class="n">p1</span><span class="p">,</span> <span class="n">p2</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Currently only clamped b_spline curves and assumed, i. e. closed</span>
<span class="sd"> = False.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">control_points</span> <span class="o">=</span> <span class="p">[</span><span class="n">i</span><span class="o">.</span><span class="n">coordinates</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">b_spline</span><span class="o">.</span><span class="n">control_points</span><span class="p">]</span>
<span class="c1"># es_near = [vector.isclose(p1, i.coordinates, abs_tol=2.1) for i in b_spline.control_points].index(True)</span>
<span class="n">es_near</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">b_spline</span><span class="o">.</span><span class="n">control_points</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">-</span> <span class="p">[</span><span class="n">vector</span><span class="o">.</span><span class="n">isclose</span><span class="p">(</span><span class="n">p1</span><span class="p">,</span> <span class="n">i</span><span class="o">.</span><span class="n">coordinates</span><span class="p">,</span> <span class="n">abs_tol</span><span class="o">=</span><span class="mf">2.1</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">b_spline</span><span class="o">.</span><span class="n">control_points</span><span class="p">[::</span><span class="o">-</span><span class="mi">1</span><span class="p">]]</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="kc">True</span><span class="p">)</span>
<span class="c1"># ee_near = len(b_spline.control_points) - 1 - [vector.isclose(p2, i.coordinates, abs_tol=2.1) for i in b_spline.control_points[::-1]].index(True)</span>
<span class="n">ee_near</span> <span class="o">=</span> <span class="p">[</span><span class="n">vector</span><span class="o">.</span><span class="n">isclose</span><span class="p">(</span><span class="n">p2</span><span class="p">,</span> <span class="n">i</span><span class="o">.</span><span class="n">coordinates</span><span class="p">,</span> <span class="n">abs_tol</span><span class="o">=</span><span class="mf">2.1</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">b_spline</span><span class="o">.</span><span class="n">control_points</span><span class="p">]</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="kc">True</span><span class="p">)</span>
<span class="n">knots</span> <span class="o">=</span> <span class="p">[</span><span class="n">b_spline</span><span class="o">.</span><span class="n">knots</span><span class="p">[</span><span class="n">i</span><span class="p">]</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">b_spline</span><span class="o">.</span><span class="n">knots</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">b_spline</span><span class="o">.</span><span class="n">knot_multiplicities</span><span class="p">[</span><span class="n">i</span><span class="p">])]</span>
<span class="c1"># print(&#39;bs es, ee in:&#39;, es_near, ee_near,</span>
<span class="c1"># knots[es_near], knots[ee_near+b_spline.degree])</span>
<span class="c1"># print(&#39; knots, knote:&#39;, knots[0], knots[-1], len(knots))</span>
<span class="k">if</span> <span class="n">es_near</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">ee_near</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="c1">#print(&#39;yes&#39;)</span>
<span class="n">bs</span> <span class="o">=</span> <span class="n">ArcBSplineCurveWithKnots</span><span class="p">(</span>
<span class="n">b_spline</span><span class="o">.</span><span class="n">degree</span><span class="p">,</span> <span class="n">control_points</span><span class="p">,</span> <span class="n">b_spline</span><span class="o">.</span><span class="n">knot_multiplicities</span><span class="p">,</span>
<span class="n">b_spline</span><span class="o">.</span><span class="n">knots</span><span class="p">,</span> <span class="n">knots</span><span class="p">[</span><span class="n">es_near</span><span class="o">+</span><span class="mi">1</span><span class="p">],</span> <span class="n">knots</span><span class="p">[</span><span class="n">ee_near</span><span class="o">+</span><span class="n">b_spline</span><span class="o">.</span><span class="n">degree</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
<span class="n">bs</span><span class="o">.</span><span class="n">_points</span> <span class="o">=</span> <span class="p">[</span><span class="n">copy</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="n">p1</span><span class="p">)]</span> <span class="o">+</span> <span class="n">bs</span><span class="o">.</span><span class="n">_points</span> <span class="o">+</span> <span class="p">[</span><span class="n">copy</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="n">p2</span><span class="p">)]</span>
<span class="k">return</span> <span class="n">bs</span>
<span class="c1"># +1 so not the last near point but the following, also -1</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;error&#39;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">B_spline_curve_with_knots</span><span class="p">(</span>
<span class="n">b_spline</span><span class="o">.</span><span class="n">degree</span><span class="p">,</span> <span class="n">control_points</span><span class="p">,</span> <span class="n">b_spline</span><span class="o">.</span><span class="n">knot_multiplicities</span><span class="p">,</span>
<span class="n">b_spline</span><span class="o">.</span><span class="n">knots</span><span class="p">)</span></div>
<span class="c1"># TODO: backup solution to draw each edge_curve,</span>
<span class="c1"># new is to put edge_curves to edge_loops and draw these loops</span>
<span class="c1"># see data_dict_to_geometry_world</span>
<div class="viewcode-block" id="data_dict_to_geometry_world_edge_curve"><a class="viewcode-back" href="../../pylib.data_step.html#pylib.data_step.data_dict_to_geometry_world_edge_curve">[docs]</a><span class="k">def</span> <span class="nf">data_dict_to_geometry_world_edge_curve</span><span class="p">(</span><span class="n">data_dict</span><span class="p">):</span>
<span class="n">w</span> <span class="o">=</span> <span class="n">World</span><span class="p">()</span>
<span class="n">data_dict_edge_curve_to_geometry</span><span class="p">(</span><span class="n">data_dict</span><span class="p">)</span>
<span class="n">edges</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;geometry_edge_curves&#39;</span><span class="p">]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">edges</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
<span class="n">w</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
<span class="k">return</span> <span class="n">w</span></div>
<div class="viewcode-block" id="data_dict_edge_curve_to_geometry"><a class="viewcode-back" href="../../pylib.data_step.html#pylib.data_step.data_dict_edge_curve_to_geometry">[docs]</a><span class="k">def</span> <span class="nf">data_dict_edge_curve_to_geometry</span><span class="p">(</span><span class="n">data_dict</span><span class="p">):</span>
<span class="n">edges</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">edge_curve</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;edge_curve&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="n">p1</span> <span class="o">=</span> <span class="n">Point</span><span class="p">(</span><span class="o">*</span><span class="n">edge_curve</span><span class="o">.</span><span class="n">edge_start</span><span class="o">.</span><span class="n">vertex_geometry</span><span class="o">.</span><span class="n">coordinates</span><span class="p">)</span>
<span class="n">p2</span> <span class="o">=</span> <span class="n">Point</span><span class="p">(</span><span class="o">*</span><span class="n">edge_curve</span><span class="o">.</span><span class="n">edge_end</span><span class="o">.</span><span class="n">vertex_geometry</span><span class="o">.</span><span class="n">coordinates</span><span class="p">)</span>
<span class="n">idn</span> <span class="o">=</span> <span class="n">edge_curve</span><span class="o">.</span><span class="n">idn</span>
<span class="c1"># if SURFACE_CURVE or SEAM_CURVE, b/c SEAM_CURVE(SURFACE_CURVE)</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">edge_curve</span><span class="o">.</span><span class="n">edge_geometry</span><span class="p">,</span> <span class="n">SURFACE_CURVE</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">edge_curve</span><span class="o">.</span><span class="n">edge_geometry</span><span class="o">.</span><span class="n">curve_3d</span><span class="p">,</span> <span class="n">LINE</span><span class="p">):</span>
<span class="n">edges</span><span class="p">[</span><span class="n">idn</span><span class="p">]</span> <span class="o">=</span> <span class="n">line_geometry</span><span class="p">(</span><span class="n">p1</span><span class="p">,</span> <span class="n">p2</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">edge_curve</span><span class="o">.</span><span class="n">edge_geometry</span><span class="o">.</span><span class="n">curve_3d</span><span class="p">,</span> <span class="n">CIRCLE</span><span class="p">):</span>
<span class="n">circle</span> <span class="o">=</span> <span class="n">edge_curve</span><span class="o">.</span><span class="n">edge_geometry</span><span class="o">.</span><span class="n">curve_3d</span>
<span class="n">edges</span><span class="p">[</span><span class="n">idn</span><span class="p">]</span> <span class="o">=</span> <span class="n">arc_circle_geometry</span><span class="p">(</span><span class="n">circle</span><span class="p">,</span> <span class="n">p1</span><span class="p">,</span> <span class="n">p2</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">edge_curve</span><span class="o">.</span><span class="n">edge_geometry</span><span class="o">.</span><span class="n">curve_3d</span><span class="p">,</span> <span class="n">ELLIPSE</span><span class="p">):</span>
<span class="n">ellipse</span> <span class="o">=</span> <span class="n">edge_curve</span><span class="o">.</span><span class="n">edge_geometry</span><span class="o">.</span><span class="n">curve_3d</span>
<span class="n">edges</span><span class="p">[</span><span class="n">idn</span><span class="p">]</span> <span class="o">=</span> <span class="n">arc_circle_geometry</span><span class="p">(</span><span class="n">ellipse</span><span class="p">,</span> <span class="n">p1</span><span class="p">,</span> <span class="n">p2</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">edge_curve</span><span class="o">.</span><span class="n">edge_geometry</span><span class="o">.</span><span class="n">curve_3d</span><span class="p">,</span> <span class="n">B_SPLINE_CURVE_WITH_KNOTS</span><span class="p">):</span>
<span class="n">b_spline</span> <span class="o">=</span> <span class="n">edge_curve</span><span class="o">.</span><span class="n">edge_geometry</span><span class="o">.</span><span class="n">curve_3d</span>
<span class="n">edges</span><span class="p">[</span><span class="n">idn</span><span class="p">]</span> <span class="o">=</span> <span class="n">b_spline_curve_with_knots_geometry</span><span class="p">(</span><span class="n">b_spline</span><span class="p">,</span> <span class="n">p1</span><span class="p">,</span> <span class="n">p2</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;edge_curve&#39;</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="s1">&#39;unknown SURFACE_CURVE&#39;</span><span class="p">,</span>
<span class="nb">type</span><span class="p">(</span><span class="n">edge_curve</span><span class="o">.</span><span class="n">edge_geometry</span><span class="o">.</span><span class="n">curve_3d</span><span class="p">))</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">edge_curve</span><span class="o">.</span><span class="n">edge_geometry</span><span class="p">,</span> <span class="n">LINE</span><span class="p">):</span>
<span class="n">edges</span><span class="p">[</span><span class="n">idn</span><span class="p">]</span> <span class="o">=</span> <span class="n">line_geometry</span><span class="p">(</span><span class="n">p1</span><span class="p">,</span> <span class="n">p2</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">edge_curve</span><span class="o">.</span><span class="n">edge_geometry</span><span class="p">,</span> <span class="n">CIRCLE</span><span class="p">):</span>
<span class="n">circle</span> <span class="o">=</span> <span class="n">edge_curve</span><span class="o">.</span><span class="n">edge_geometry</span>
<span class="n">edges</span><span class="p">[</span><span class="n">idn</span><span class="p">]</span> <span class="o">=</span> <span class="n">arc_circle_geometry</span><span class="p">(</span><span class="n">circle</span><span class="p">,</span> <span class="n">p1</span><span class="p">,</span> <span class="n">p2</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">edge_curve</span><span class="o">.</span><span class="n">edge_geometry</span><span class="p">,</span> <span class="n">B_SPLINE_CURVE_WITH_KNOTS</span><span class="p">):</span>
<span class="n">b_spline</span> <span class="o">=</span> <span class="n">edge_curve</span><span class="o">.</span><span class="n">edge_geometry</span>
<span class="n">edges</span><span class="p">[</span><span class="n">idn</span><span class="p">]</span> <span class="o">=</span> <span class="n">b_spline_curve_with_knots_geometry</span><span class="p">(</span><span class="n">b_spline</span><span class="p">,</span> <span class="n">p1</span><span class="p">,</span> <span class="n">p2</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span> <span class="c1"># fallback to straight line</span>
<span class="n">edges</span><span class="p">[</span><span class="n">idn</span><span class="p">]</span> <span class="o">=</span> <span class="n">line_geometry</span><span class="p">(</span><span class="n">p1</span><span class="p">,</span> <span class="n">p2</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;edge_curve&#39;</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="s1">&#39;unknown type&#39;</span><span class="p">,</span> <span class="nb">type</span><span class="p">(</span><span class="n">edge_curve</span><span class="p">))</span>
<span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;geometry_edge_curves&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">edges</span></div>
<div class="viewcode-block" id="data_dict_to_geometry_world"><a class="viewcode-back" href="../../pylib.data_step.html#pylib.data_step.data_dict_to_geometry_world">[docs]</a><span class="k">def</span> <span class="nf">data_dict_to_geometry_world</span><span class="p">(</span><span class="n">data_dict</span><span class="p">):</span>
<span class="n">w</span> <span class="o">=</span> <span class="n">World</span><span class="p">()</span>
<span class="n">data_dict_edge_curve_to_geometry</span><span class="p">(</span><span class="n">data_dict</span><span class="p">)</span>
<span class="n">edges</span> <span class="o">=</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;geometry_edge_curves&#39;</span><span class="p">]</span>
<span class="c1"># add all but the last point, it is a path.</span>
<span class="kn">import</span> <span class="nn">math</span>
<span class="nb">iter</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">edge_loop</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;edge_loop&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="n">points</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">last_end_point</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">for</span> <span class="n">oriented_edge</span> <span class="ow">in</span> <span class="n">edge_loop</span><span class="o">.</span><span class="n">edge_list</span><span class="p">:</span>
<span class="n">edge_curve</span> <span class="o">=</span> <span class="n">oriented_edge</span><span class="o">.</span><span class="n">edge_element</span>
<span class="n">idn</span> <span class="o">=</span> <span class="n">edge_curve</span><span class="o">.</span><span class="n">idn</span>
<span class="k">if</span> <span class="n">idn</span> <span class="ow">in</span> <span class="n">edges</span><span class="p">:</span>
<span class="n">pts</span> <span class="o">=</span> <span class="n">edges</span><span class="p">[</span><span class="n">idn</span><span class="p">]</span><span class="o">.</span><span class="n">points</span><span class="p">()</span>
<span class="k">if</span> <span class="n">oriented_edge</span><span class="o">.</span><span class="n">orientation</span><span class="p">:</span>
<span class="c1">#[points.append(i) for i in pts[:-1]]</span>
<span class="p">[</span><span class="n">points</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">pts</span><span class="p">]</span>
<span class="n">start_point</span> <span class="o">=</span> <span class="n">pts</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">end_point</span> <span class="o">=</span> <span class="n">pts</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1">#[points.append(i) for i in pts[:0:-1]]</span>
<span class="p">[</span><span class="n">points</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">pts</span><span class="p">[::</span><span class="o">-</span><span class="mi">1</span><span class="p">]]</span>
<span class="n">start_point</span> <span class="o">=</span> <span class="n">pts</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="n">end_point</span> <span class="o">=</span> <span class="n">pts</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">if</span> <span class="n">last_end_point</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="c1"># TODO: some points are only near because of the current</span>
<span class="c1"># b-spline cut in b_spline_curve_with_knots_geometry</span>
<span class="n">isclose</span> <span class="o">=</span> <span class="nb">all</span><span class="p">([</span><span class="n">math</span><span class="o">.</span><span class="n">isclose</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="n">abs_tol</span><span class="o">=</span><span class="mf">1e-3</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">start_point</span><span class="p">,</span> <span class="n">last_end_point</span><span class="p">)])</span>
<span class="k">if</span> <span class="n">isclose</span><span class="p">:</span>
<span class="k">pass</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">pass</span>
<span class="nb">print</span><span class="p">(</span><span class="n">isclose</span><span class="p">,</span> <span class="n">start_point</span><span class="p">,</span> <span class="n">last_end_point</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">pass</span>
<span class="c1">#print(&#39;start of loop&#39;)</span>
<span class="n">last_end_point</span> <span class="o">=</span> <span class="n">end_point</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">pass</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;error&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">points</span><span class="p">:</span>
<span class="c1"># add last end point of path</span>
<span class="c1"># if oriented_edge.orientation:</span>
<span class="c1"># points.append(Point(*edge_curve.edge_end.vertex_geometry.coordinates))</span>
<span class="c1"># else:</span>
<span class="c1"># points.append(Point(*edge_curve.edge_start.vertex_geometry.coordinates))</span>
<span class="c1">#points.append(Point(*oriented_edge.edge_end.vertex_geometry.coordinates))</span>
<span class="n">w</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">Polyline</span><span class="p">(</span><span class="o">*</span><span class="n">points</span><span class="p">))</span>
<span class="c1"># if iter == 4:</span>
<span class="c1"># print()</span>
<span class="c1"># print(key)</span>
<span class="c1"># break</span>
<span class="c1"># iter += 1</span>
<span class="k">return</span> <span class="n">w</span></div>
<span class="c1"># TODO: delete this testing def</span>
<div class="viewcode-block" id="print_edge_loop"><a class="viewcode-back" href="../../pylib.data_step.html#pylib.data_step.print_edge_loop">[docs]</a><span class="k">def</span> <span class="nf">print_edge_loop</span><span class="p">(</span><span class="n">data_dict</span><span class="p">,</span> <span class="n">instance_name</span><span class="p">):</span>
<span class="kn">from</span> <span class="nn">pylib.mathematics</span> <span class="kn">import</span> <span class="n">vector</span>
<span class="kn">from</span> <span class="nn">pylib.data_step_std</span> <span class="kn">import</span> <span class="n">LINE</span><span class="p">,</span> <span class="n">B_SPLINE_CURVE_WITH_KNOTS</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;edge_loop:&#39;</span><span class="p">,</span> <span class="n">instance_name</span><span class="p">,</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;edge_loop&#39;</span><span class="p">][</span><span class="n">instance_name</span><span class="p">]</span><span class="o">.</span><span class="n">idn</span><span class="p">)</span>
<span class="k">for</span> <span class="n">oriented_edge</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;edge_loop&#39;</span><span class="p">][</span><span class="n">instance_name</span><span class="p">]</span><span class="o">.</span><span class="n">edge_list</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39; orientation: &#39;</span><span class="p">,</span> <span class="n">oriented_edge</span><span class="o">.</span><span class="n">orientation</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39; edge_start: &#39;</span><span class="p">,</span> <span class="n">oriented_edge</span><span class="o">.</span><span class="n">edge_start</span><span class="o">.</span><span class="n">vertex_geometry</span><span class="o">.</span><span class="n">coordinates</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39; edge_end: &#39;</span><span class="p">,</span> <span class="n">oriented_edge</span><span class="o">.</span><span class="n">edge_end</span><span class="o">.</span><span class="n">vertex_geometry</span><span class="o">.</span><span class="n">coordinates</span><span class="p">)</span>
<span class="n">edge_element</span> <span class="o">=</span> <span class="n">oriented_edge</span><span class="o">.</span><span class="n">edge_element</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39; edge_element&#39;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39; same_sense: &#39;</span><span class="p">,</span> <span class="n">edge_element</span><span class="o">.</span><span class="n">same_sense</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39; edge_start: &#39;</span><span class="p">,</span> <span class="n">edge_element</span><span class="o">.</span><span class="n">edge_start</span><span class="o">.</span><span class="n">vertex_geometry</span><span class="o">.</span><span class="n">coordinates</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39; edge_end: &#39;</span><span class="p">,</span> <span class="n">edge_element</span><span class="o">.</span><span class="n">edge_end</span><span class="o">.</span><span class="n">vertex_geometry</span><span class="o">.</span><span class="n">coordinates</span><span class="p">)</span>
<span class="n">curve_3d</span> <span class="o">=</span> <span class="n">edge_element</span><span class="o">.</span><span class="n">edge_geometry</span><span class="o">.</span><span class="n">curve_3d</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39; edge_geometry.curve_3d&#39;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39; type: &#39;</span><span class="p">,</span> <span class="nb">type</span><span class="p">(</span><span class="n">curve_3d</span><span class="p">))</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">curve_3d</span><span class="p">,</span> <span class="n">LINE</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39; es in: &#39;</span><span class="p">,</span>
<span class="n">vector</span><span class="o">.</span><span class="n">isclose</span><span class="p">(</span><span class="n">edge_element</span><span class="o">.</span><span class="n">edge_start</span><span class="o">.</span><span class="n">vertex_geometry</span><span class="o">.</span><span class="n">coordinates</span><span class="p">,</span> <span class="n">curve_3d</span><span class="o">.</span><span class="n">pnt</span><span class="o">.</span><span class="n">coordinates</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39; ee in: &#39;</span><span class="p">,</span>
<span class="n">vector</span><span class="o">.</span><span class="n">isclose</span><span class="p">(</span><span class="n">edge_element</span><span class="o">.</span><span class="n">edge_end</span><span class="o">.</span><span class="n">vertex_geometry</span><span class="o">.</span><span class="n">coordinates</span><span class="p">,</span> <span class="n">curve_3d</span><span class="o">.</span><span class="n">pnt</span><span class="o">.</span><span class="n">coordinates</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39; pnt: &#39;</span><span class="p">,</span> <span class="n">curve_3d</span><span class="o">.</span><span class="n">pnt</span><span class="o">.</span><span class="n">coordinates</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39; pnt2: &#39;</span><span class="p">,</span> <span class="p">[</span><span class="n">curve_3d</span><span class="o">.</span><span class="n">dir</span><span class="o">.</span><span class="n">magnitude</span><span class="o">*</span><span class="n">i</span><span class="o">+</span><span class="n">j</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span><span class="n">j</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">curve_3d</span><span class="o">.</span><span class="n">dir</span><span class="o">.</span><span class="n">orientation</span><span class="o">.</span><span class="n">direction_ratios</span><span class="p">,</span> <span class="n">curve_3d</span><span class="o">.</span><span class="n">pnt</span><span class="o">.</span><span class="n">coordinates</span><span class="p">)])</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">curve_3d</span><span class="p">,</span> <span class="n">B_SPLINE_CURVE_WITH_KNOTS</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39; es in: &#39;</span><span class="p">,</span>
<span class="nb">any</span><span class="p">([</span><span class="n">vector</span><span class="o">.</span><span class="n">isclose</span><span class="p">(</span><span class="n">edge_element</span><span class="o">.</span><span class="n">edge_start</span><span class="o">.</span><span class="n">vertex_geometry</span><span class="o">.</span><span class="n">coordinates</span><span class="p">,</span> <span class="n">i</span><span class="o">.</span><span class="n">coordinates</span><span class="p">,</span> <span class="n">abs_tol</span><span class="o">=</span><span class="mf">2.1</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">curve_3d</span><span class="o">.</span><span class="n">control_points</span><span class="p">]))</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39; ee in: &#39;</span><span class="p">,</span>
<span class="nb">any</span><span class="p">([</span><span class="n">vector</span><span class="o">.</span><span class="n">isclose</span><span class="p">(</span><span class="n">edge_element</span><span class="o">.</span><span class="n">edge_end</span><span class="o">.</span><span class="n">vertex_geometry</span><span class="o">.</span><span class="n">coordinates</span><span class="p">,</span> <span class="n">i</span><span class="o">.</span><span class="n">coordinates</span><span class="p">,</span> <span class="n">abs_tol</span><span class="o">=</span><span class="mf">2.1</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">curve_3d</span><span class="o">.</span><span class="n">control_points</span><span class="p">]))</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39; control_points&#39;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="n">curve_3d</span><span class="o">.</span><span class="n">control_points</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">coordinates</span><span class="p">,</span> <span class="s1">&#39;...&#39;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="n">curve_3d</span><span class="o">.</span><span class="n">control_points</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">coordinates</span><span class="p">)</span></div>
<span class="c1"># print()</span>
<span class="c1"># print_edge_loop(data_dict, &#39;#1306&#39;)</span>
</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">
&copy;2019, Daniel Weschke.
|
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>
</body>
</html>

File diff suppressed because it is too large Load Diff

View File

@@ -44,10 +44,12 @@
<span class="sd"> :synopsis: Mathematical equations.</span>
<span class="sd">.. moduleauthor:: Daniel Weschke &lt;daniel.weschke@directbox.de&gt;</span>
<span class="sd">Functions returns function to apply conditions.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">math</span>
<span class="kn">from</span> <span class="nn">pylib.data</span> <span class="kn">import</span> <span class="n">seq</span>
<span class="kn">from</span> <span class="nn">pylib.mathematics</span> <span class="kn">import</span> <span class="n">lcm</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>
@@ -114,12 +116,13 @@
<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 + 2\pi f t + \varphi) + D \\</span>
<span class="sd"> y(x,t) = A\sin(kx + \omega t + \varphi) + D</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>
@@ -178,6 +181,7 @@
<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>
@@ -188,12 +192,225 @@
<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">&quot;&quot;&quot;Cox-de Boor algorithm / recursion formula.</span>
<span class="sd"> Calculate the i-th B-spline basis function of degree p: 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 &lt;= u_1 &lt;= u_2 &lt;= ... &lt;= 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, 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) &amp;= \begin{cases} 1 &amp; \text{if } u_i \le u \lt u_{i+1} \\</span>
<span class="sd"> 0 &amp; \text{otherwise}\end{cases} \\</span>
<span class="sd"> N_{i,p}(u) &amp;= \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"> &quot;&quot;&quot;</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">&lt;=</span> <span class="n">u</span> <span class="o">&lt;</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">&quot;&quot;&quot;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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;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 &lt;= u_1 &lt;= u_2 &lt;= ... &lt;= u_m`</span>
<span class="sd"> :type knots: list</span>
<span class="sd"> :returns: B-spline curve using variable, 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 [u_0, u_p) and [u_{n-p}, u_n) will not</span>
<span class="sd"> have &quot;full support&quot; of basis functions and are ignored when a</span>
<span class="sd"> B-spline curve is open. For open B-spline curves, the domain</span>
<span class="sd"> is inteval [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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;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"> &gt;&gt;&gt; x, y = circle(20)[:2]</span>
<span class="sd"> &gt;&gt;&gt; x, y, _ = circle(20)</span>
<span class="sd"> &gt;&gt;&gt; x, y, interval = circle(20)</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;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"> &gt;&gt;&gt; x, y = ellipse(10, 5)[:2]</span>
<span class="sd"> &gt;&gt;&gt; x, y, _ = ellipse(10, 5)</span>
<span class="sd"> &gt;&gt;&gt; x, y, interval = ellipse(10, 5)</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;Hypotrochoid</span>
@@ -208,7 +425,7 @@
<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</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>
@@ -223,7 +440,7 @@
<span class="sd"> * *</span>
<span class="sd"> * * * *</span>
<span class="sd"> * * r **</span>
<span class="sd"> * * .... *</span>
<span class="sd"> * * ,.. *</span>
<span class="sd"> * * d *</span>
<span class="sd"> * * **</span>
<span class="sd"> * * * *</span>
@@ -231,16 +448,16 @@
<span class="sd"> * *</span>
<span class="sd"> * * *</span>
<span class="sd"> &gt;&gt;&gt; x, y = hyotrochoid(20, 6, 6)[:1]</span>
<span class="sd"> &gt;&gt;&gt; x, y, theta_end = hyotrochoid(20, 6, 6)</span>
<span class="sd"> &gt;&gt;&gt; x, y = hyotrochoid(20, 6, 6)[:2]</span>
<span class="sd"> &gt;&gt;&gt; x, y, _ = hyotrochoid(20, 6, 6)</span>
<span class="sd"> &gt;&gt;&gt; x, y, interval = hyotrochoid(20, 6, 6)</span>
<span class="sd"> .. seealso::</span>
<span class="sd"> :meth:`pylib.mathematics.lcm`</span>
<span class="sd"> &quot;&quot;&quot;</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="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="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="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>
<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">&quot;&quot;&quot;Epitrochoid</span>
@@ -256,7 +473,7 @@
<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</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>
@@ -271,7 +488,7 @@
<span class="sd"> * *</span>
<span class="sd"> * * * *</span>
<span class="sd"> * * * r *</span>
<span class="sd"> * ** .... *</span>
<span class="sd"> * ** .., *</span>
<span class="sd"> * ** d *</span>
<span class="sd"> * * * *</span>
<span class="sd"> * * * *</span>
@@ -279,13 +496,13 @@
<span class="sd"> * *</span>
<span class="sd"> * * *</span>
<span class="sd"> &gt;&gt;&gt; x, y = epitrochoid(3, 1, 0.5)[:1]</span>
<span class="sd"> &gt;&gt;&gt; x, y, theta_end = epitrochoid(3, 1, 0.5)</span>
<span class="sd"> &gt;&gt;&gt; x, y = epitrochoid(3, 1, 0.5)[:2]</span>
<span class="sd"> &gt;&gt;&gt; x, y, _ = epitrochoid(3, 1, 0.5)</span>
<span class="sd"> &gt;&gt;&gt; x, y, interval = epitrochoid(3, 1, 0.5)</span>
<span class="sd"> &quot;&quot;&quot;</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="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>
<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">&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>
@@ -299,7 +516,7 @@
<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"> Characters in the Braille Patterns Block (first 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>
@@ -433,7 +650,9 @@
<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="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">&gt;=</span> <span class="n">y_i</span> <span class="o">&gt;=</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">&quot;histogram&quot;</span><span class="p">,</span> <span class="s2">&quot;block&quot;</span><span class="p">]:</span>

View File

@@ -45,8 +45,8 @@
<span class="sd">.. moduleauthor:: Daniel Weschke &lt;daniel.weschke@directbox.de&gt;</span>
<span class="sd">Affine transforms</span>
<span class="sd">-----------------</span>
<span class="sd">.. rubric:: Affine transforms</span>
<span class="sd">Functions in augmented space, in homogenous coordinates.</span>
<span class="sd">Points are augment to 4 dimensions, by adding a dummy coordinate.</span>
@@ -56,12 +56,21 @@
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">math</span>
<span class="kn">import</span> <span class="nn">copy</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">vector</span><span class="p">,</span> <span class="n">matrix</span>
<span class="kn">from</span> <span class="nn">.function</span> <span class="kn">import</span> <span class="n">circle</span><span class="p">,</span> <span class="n">ellipse</span><span class="p">,</span> <span class="n">b_spline_curve_with_knots</span>
<div class="viewcode-block" id="Properties"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Properties">[docs]</a><span class="k">class</span> <span class="nc">Properties</span><span class="p">():</span>
<span class="n">circle_sectors</span> <span class="o">=</span> <span class="mi">12</span> <span class="c1"># 12 = 30°</span></div>
<div class="viewcode-block" id="Direction"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Direction">[docs]</a><span class="k">class</span> <span class="nc">Direction</span><span class="p">(</span><span class="n">vector</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Direction in local coordinate system&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">z</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">([</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span><span class="p">,</span> <span class="mi">0</span><span class="p">])</span></div>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">([</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span><span class="p">,</span> <span class="mi">0</span><span class="p">])</span>
<div class="viewcode-block" id="Direction.cross"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Direction.cross">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">cross</span><span class="p">(</span><span class="bp">cls</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="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">*</span><span class="n">vector</span><span class="o">.</span><span class="n">cross</span><span class="p">(</span><span class="n">a</span><span class="p">[:</span><span class="mi">3</span><span class="p">],</span> <span class="n">b</span><span class="p">[:</span><span class="mi">3</span><span class="p">]))</span></div></div>
<div class="viewcode-block" id="Point"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Point">[docs]</a><span class="k">class</span> <span class="nc">Point</span><span class="p">(</span><span class="n">vector</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Point in local coordinate system&quot;&quot;&quot;</span>
@@ -79,32 +88,41 @@
<div class="viewcode-block" id="CS"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.CS">[docs]</a><span class="k">class</span> <span class="nc">CS</span><span class="p">(</span><span class="n">matrix</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Coordinate system</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="o">=</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">y</span><span class="o">=</span><span class="p">[</span><span class="mi">0</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="n">z</span><span class="o">=</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="mi">1</span><span class="p">]):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">([[</span><span class="o">*</span><span class="n">x</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="o">*</span><span class="n">y</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="o">*</span><span class="n">z</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</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="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">]])</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="o">=</span><span class="n">Direction</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">y</span><span class="o">=</span><span class="n">Direction</span><span class="p">(</span><span class="mi">0</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="n">z</span><span class="o">=</span><span class="n">Direction</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="mi">1</span><span class="p">)):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">([</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span><span class="p">,</span> <span class="n">vector</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="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">])])</span>
<div class="viewcode-block" id="CS.x90"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.CS.x90">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">x90</span><span class="p">():</span>
<span class="k">return</span> <span class="n">CS</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="p">(</span><span class="mi">0</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="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">))</span></div>
<div class="viewcode-block" id="CS.init_xyz"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.CS.init_xyz">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">init_xyz</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">x</span><span class="o">=</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">y</span><span class="o">=</span><span class="p">[</span><span class="mi">0</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="n">z</span><span class="o">=</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="mi">1</span><span class="p">]):</span>
<span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="n">Direction</span><span class="p">(</span><span class="o">*</span><span class="n">x</span><span class="p">),</span> <span class="n">Direction</span><span class="p">(</span><span class="o">*</span><span class="n">y</span><span class="p">),</span> <span class="n">Direction</span><span class="p">(</span><span class="o">*</span><span class="n">z</span><span class="p">))</span></div>
<div class="viewcode-block" id="CS.xm90"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.CS.xm90">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">xm90</span><span class="p">():</span>
<span class="k">return</span> <span class="n">CS</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="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</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="mi">0</span><span class="p">))</span></div>
<div class="viewcode-block" id="CS.x90"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.CS.x90">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">x90</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="n">Direction</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">Direction</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="o">-</span><span class="mi">1</span><span class="p">),</span>
<span class="n">Direction</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">))</span></div>
<div class="viewcode-block" id="CS.y90"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.CS.y90">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">y90</span><span class="p">():</span>
<span class="k">return</span> <span class="n">CS</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="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</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="p">(</span><span class="o">-</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></div>
<div class="viewcode-block" id="CS.xm90"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.CS.xm90">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">xm90</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="n">Direction</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">Direction</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="mi">1</span><span class="p">),</span>
<span class="n">Direction</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="mi">0</span><span class="p">))</span></div>
<div class="viewcode-block" id="CS.ym90"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.CS.ym90">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">ym90</span><span class="p">():</span>
<span class="k">return</span> <span class="n">CS</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="o">-</span><span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</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="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></div>
<div class="viewcode-block" id="CS.y90"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.CS.y90">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">y90</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="n">Direction</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="mi">1</span><span class="p">),</span> <span class="n">Direction</span><span class="p">(</span><span class="mi">0</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="n">Direction</span><span class="p">(</span><span class="o">-</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></div>
<div class="viewcode-block" id="CS.ym90"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.CS.ym90">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">ym90</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="n">Direction</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="o">-</span><span class="mi">1</span><span class="p">),</span> <span class="n">Direction</span><span class="p">(</span><span class="mi">0</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="n">Direction</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></div>
<div class="viewcode-block" id="CS.get_coordinates"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.CS.get_coordinates">[docs]</a> <span class="k">def</span> <span class="nf">get_coordinates</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Get coordinates in 3d space&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="p">[:</span><span class="mi">3</span><span class="p">,:</span><span class="mi">3</span><span class="p">]</span></div></div>
<span class="c1"># TODO: Wireframe(list) or Wireframe(matrix) ?</span>
<span class="c1"># TODO: Polyline(list) or Polyline(matrix) ?</span>
<span class="c1"># list of Points</span>
<div class="viewcode-block" id="Wireframe"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Wireframe">[docs]</a><span class="k">class</span> <span class="nc">Wireframe</span><span class="p">:</span>
<div class="viewcode-block" id="Polyline"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Polyline">[docs]</a><span class="k">class</span> <span class="nc">Polyline</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;Open and closed wireframe object in local coordinate system</span>
<span class="sd"> This class create its own points (copy).</span>
@@ -113,44 +131,48 @@
<span class="bp">self</span><span class="o">.</span><span class="n">_points</span> <span class="o">=</span> <span class="p">[</span><span class="n">copy</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">points</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">closed</span> <span class="o">=</span> <span class="n">closed</span>
<div class="viewcode-block" id="Wireframe.__str__"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Wireframe.__str__">[docs]</a> <span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<div class="viewcode-block" id="Polyline.__str__"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Polyline.__str__">[docs]</a> <span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s1">&#39;[&#39;</span> <span class="o">+</span> <span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="nb">str</span><span class="p">(</span><span class="n">point</span><span class="p">)</span> <span class="k">for</span> <span class="n">point</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_points</span><span class="p">])</span> <span class="o">+</span> <span class="s1">&#39;]&#39;</span></div>
<div class="viewcode-block" id="Wireframe.__iter__"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Wireframe.__iter__">[docs]</a> <span class="k">def</span> <span class="fm">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<div class="viewcode-block" id="Polyline.__repr__"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Polyline.__repr__">[docs]</a> <span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span> <span class="o">+</span> \
<span class="s1">&#39;(&#39;</span> <span class="o">+</span> <span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="nb">str</span><span class="p">(</span><span class="n">point</span><span class="p">)</span> <span class="k">for</span> <span class="n">point</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_points</span><span class="p">])</span> <span class="o">+</span> <span class="s1">&#39;)&#39;</span></div>
<div class="viewcode-block" id="Polyline.__iter__"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Polyline.__iter__">[docs]</a> <span class="k">def</span> <span class="fm">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Returns the Iterator object&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">points</span><span class="p">())</span></div>
<div class="viewcode-block" id="Wireframe.points"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Wireframe.points">[docs]</a> <span class="k">def</span> <span class="nf">points</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<div class="viewcode-block" id="Polyline.points"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Polyline.points">[docs]</a> <span class="k">def</span> <span class="nf">points</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Get coordinates in 3d space&quot;&quot;&quot;</span>
<span class="n">result</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="bp">self</span><span class="o">.</span><span class="n">_points</span><span class="p">]</span>
<span class="k">return</span> <span class="n">result</span> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">closed</span> <span class="k">else</span> <span class="n">result</span> <span class="o">+</span> <span class="p">[</span><span class="n">result</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span></div>
<div class="viewcode-block" id="Wireframe.xy"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Wireframe.xy">[docs]</a> <span class="k">def</span> <span class="nf">xy</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<div class="viewcode-block" id="Polyline.xy"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Polyline.xy">[docs]</a> <span class="k">def</span> <span class="nf">xy</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Get coordinates in 3d space&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="o">*</span><span class="p">[</span><span class="n">i</span><span class="p">[:</span><span class="mi">2</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">points</span><span class="p">()]))</span></div>
<div class="viewcode-block" id="Wireframe.xyz"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Wireframe.xyz">[docs]</a> <span class="k">def</span> <span class="nf">xyz</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<div class="viewcode-block" id="Polyline.xyz"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Polyline.xyz">[docs]</a> <span class="k">def</span> <span class="nf">xyz</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Get coordinates in 3d space&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="o">*</span><span class="p">[</span><span class="n">i</span><span class="p">[:</span><span class="mi">3</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">points</span><span class="p">()]))</span></div>
<div class="viewcode-block" id="Wireframe.rotate_x"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Wireframe.rotate_x">[docs]</a> <span class="k">def</span> <span class="nf">rotate_x</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">theta</span><span class="p">):</span>
<div class="viewcode-block" id="Polyline.rotate_x"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Polyline.rotate_x">[docs]</a> <span class="k">def</span> <span class="nf">rotate_x</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">theta</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_points</span> <span class="o">=</span> <span class="p">[</span><span class="n">point</span><span class="o">.</span><span class="n">rotate_x</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span> <span class="k">for</span> <span class="n">point</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_points</span><span class="p">]</span>
<span class="k">return</span> <span class="bp">self</span></div>
<div class="viewcode-block" id="Wireframe.rotate_y"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Wireframe.rotate_y">[docs]</a> <span class="k">def</span> <span class="nf">rotate_y</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">theta</span><span class="p">):</span>
<div class="viewcode-block" id="Polyline.rotate_y"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Polyline.rotate_y">[docs]</a> <span class="k">def</span> <span class="nf">rotate_y</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">theta</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_points</span> <span class="o">=</span> <span class="p">[</span><span class="n">point</span><span class="o">.</span><span class="n">rotate_y</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span> <span class="k">for</span> <span class="n">point</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_points</span><span class="p">]</span>
<span class="k">return</span> <span class="bp">self</span></div>
<div class="viewcode-block" id="Wireframe.rotate_z"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Wireframe.rotate_z">[docs]</a> <span class="k">def</span> <span class="nf">rotate_z</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">theta</span><span class="p">):</span>
<div class="viewcode-block" id="Polyline.rotate_z"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Polyline.rotate_z">[docs]</a> <span class="k">def</span> <span class="nf">rotate_z</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">theta</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_points</span> <span class="o">=</span> <span class="p">[</span><span class="n">point</span><span class="o">.</span><span class="n">rotate_z</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span> <span class="k">for</span> <span class="n">point</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_points</span><span class="p">]</span>
<span class="k">return</span> <span class="bp">self</span></div>
<div class="viewcode-block" id="Wireframe.translate"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Wireframe.translate">[docs]</a> <span class="k">def</span> <span class="nf">translate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tx</span><span class="p">,</span> <span class="n">ty</span><span class="p">,</span> <span class="n">tz</span><span class="p">):</span>
<div class="viewcode-block" id="Polyline.translate"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Polyline.translate">[docs]</a> <span class="k">def</span> <span class="nf">translate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tx</span><span class="p">,</span> <span class="n">ty</span><span class="p">,</span> <span class="n">tz</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_points</span> <span class="o">=</span> <span class="p">[</span><span class="n">point</span><span class="o">.</span><span class="n">translate</span><span class="p">(</span><span class="n">tx</span><span class="p">,</span> <span class="n">ty</span><span class="p">,</span> <span class="n">tz</span><span class="p">)</span> <span class="k">for</span>
<span class="n">point</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_points</span><span class="p">]</span>
<span class="k">return</span> <span class="bp">self</span></div>
<div class="viewcode-block" id="Wireframe.scale"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Wireframe.scale">[docs]</a> <span class="k">def</span> <span class="nf">scale</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sx</span><span class="p">,</span> <span class="n">sy</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">sz</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<div class="viewcode-block" id="Polyline.scale"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Polyline.scale">[docs]</a> <span class="k">def</span> <span class="nf">scale</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sx</span><span class="p">,</span> <span class="n">sy</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">sz</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="c1"># if not sy is not suitable because 0 is also false</span>
<span class="k">if</span> <span class="n">sy</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">sy</span> <span class="o">=</span> <span class="n">sx</span>
@@ -159,28 +181,113 @@
<span class="n">point</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_points</span><span class="p">]</span>
<span class="k">return</span> <span class="bp">self</span></div>
<div class="viewcode-block" id="Wireframe.ch_cs"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Wireframe.ch_cs">[docs]</a> <span class="k">def</span> <span class="nf">ch_cs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cs</span><span class="p">):</span>
<div class="viewcode-block" id="Polyline.ch_cs"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Polyline.ch_cs">[docs]</a> <span class="k">def</span> <span class="nf">ch_cs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cs</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_points</span> <span class="o">=</span> <span class="p">[</span><span class="n">point</span><span class="o">.</span><span class="n">ch_cs</span><span class="p">(</span><span class="n">cs</span><span class="p">)</span> <span class="k">for</span> <span class="n">point</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_points</span><span class="p">]</span>
<span class="k">return</span> <span class="bp">self</span></div></div>
<div class="viewcode-block" id="Line"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Line">[docs]</a><span class="k">class</span> <span class="nc">Line</span><span class="p">(</span><span class="n">Wireframe</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Line a open wireframe object in local coordinate system&quot;&quot;&quot;</span>
<div class="viewcode-block" id="Line"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Line">[docs]</a><span class="k">class</span> <span class="nc">Line</span><span class="p">(</span><span class="n">Polyline</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Line, an open wireframe object in local coordinate system&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">point1</span><span class="o">=</span><span class="n">Point</span><span class="p">(</span><span class="o">-</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">point2</span><span class="o">=</span><span class="n">Point</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="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">point1</span><span class="p">,</span> <span class="n">point2</span><span class="p">)</span></div>
<div class="viewcode-block" id="Polygon"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Polygon">[docs]</a><span class="k">class</span> <span class="nc">Polygon</span><span class="p">(</span><span class="n">Wireframe</span><span class="p">):</span>
<span class="c1"># TODO: combining wit non Arc version?</span>
<div class="viewcode-block" id="ArcCircle"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.ArcCircle">[docs]</a><span class="k">class</span> <span class="nc">ArcCircle</span><span class="p">(</span><span class="n">Polyline</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Arc of a circle, an open wireframe object in local coordinate</span>
<span class="sd"> system</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">radius</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">ang1</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">ang2</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="p">,</span> <span class="n">n</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">interval</span> <span class="o">=</span> <span class="n">circle</span><span class="p">(</span><span class="n">radius</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">n</span><span class="p">:</span>
<span class="n">n</span> <span class="o">=</span> <span class="n">Properties</span><span class="o">.</span><span class="n">circle_sectors</span>
<span class="n">delta</span> <span class="o">=</span> <span class="n">interval</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">/</span><span class="n">n</span>
<span class="n">points</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">points</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">Point</span><span class="p">(</span><span class="n">x</span><span class="p">(</span><span class="n">ang1</span><span class="p">),</span> <span class="n">y</span><span class="p">(</span><span class="n">ang1</span><span class="p">),</span> <span class="mi">0</span><span class="p">))</span>
<span class="k">if</span> <span class="n">ang1</span> <span class="o">&gt;</span> <span class="n">ang2</span> <span class="p">:</span>
<span class="n">ang1</span> <span class="o">=</span> <span class="n">ang1</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="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">ang1</span> <span class="o">//</span> <span class="n">delta</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">ang2</span> <span class="o">//</span> <span class="n">delta</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</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="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="n">points</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">Point</span><span class="p">(</span><span class="n">x</span><span class="p">(</span><span class="n">i</span><span class="o">*</span><span class="n">delta</span><span class="p">),</span> <span class="n">y</span><span class="p">(</span><span class="n">i</span><span class="o">*</span><span class="n">delta</span><span class="p">),</span> <span class="mi">0</span><span class="p">))</span>
<span class="n">points</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">Point</span><span class="p">(</span><span class="n">x</span><span class="p">(</span><span class="n">ang2</span><span class="p">),</span> <span class="n">y</span><span class="p">(</span><span class="n">ang2</span><span class="p">),</span> <span class="mi">0</span><span class="p">))</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">points</span><span class="p">)</span></div>
<span class="c1"># TODO: combining wit non Arc version?</span>
<div class="viewcode-block" id="ArcEllipse"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.ArcEllipse">[docs]</a><span class="k">class</span> <span class="nc">ArcEllipse</span><span class="p">(</span><span class="n">Polyline</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Arc of an ellipse, an open wireframe object in local</span>
<span class="sd"> coordinate system</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</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">b</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">ang1</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">ang2</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="p">,</span> <span class="n">n</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">interval</span> <span class="o">=</span> <span class="n">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="k">if</span> <span class="ow">not</span> <span class="n">n</span><span class="p">:</span>
<span class="n">n</span> <span class="o">=</span> <span class="n">Properties</span><span class="o">.</span><span class="n">circle_sectors</span>
<span class="n">delta</span> <span class="o">=</span> <span class="n">interval</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">/</span><span class="n">n</span>
<span class="n">points</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">points</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">Point</span><span class="p">(</span><span class="n">x</span><span class="p">(</span><span class="n">ang1</span><span class="p">),</span> <span class="n">y</span><span class="p">(</span><span class="n">ang1</span><span class="p">),</span> <span class="mi">0</span><span class="p">))</span>
<span class="k">if</span> <span class="n">ang1</span> <span class="o">&gt;</span> <span class="n">ang2</span> <span class="p">:</span>
<span class="n">ang1</span> <span class="o">=</span> <span class="n">ang1</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="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">ang1</span> <span class="o">//</span> <span class="n">delta</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">ang2</span> <span class="o">//</span> <span class="n">delta</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</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="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="n">points</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">Point</span><span class="p">(</span><span class="n">x</span><span class="p">(</span><span class="n">i</span><span class="o">*</span><span class="n">delta</span><span class="p">),</span> <span class="n">y</span><span class="p">(</span><span class="n">i</span><span class="o">*</span><span class="n">delta</span><span class="p">),</span> <span class="mi">0</span><span class="p">))</span>
<span class="n">points</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">Point</span><span class="p">(</span><span class="n">x</span><span class="p">(</span><span class="n">ang2</span><span class="p">),</span> <span class="n">y</span><span class="p">(</span><span class="n">ang2</span><span class="p">),</span> <span class="mi">0</span><span class="p">))</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">points</span><span class="p">)</span></div>
<span class="c1"># redefining the .function.sample_half_open(f, a, b, n=50, endpoint_epsilon=1e-7)</span>
<span class="c1"># to create a list of Points</span>
<div class="viewcode-block" id="sample_half_open"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.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">Point</span><span class="p">(</span><span class="o">*</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"># TODO: naming? combining wit non Arc version?</span>
<div class="viewcode-block" id="ArcBSplineCurveWithKnots"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.ArcBSplineCurveWithKnots">[docs]</a><span class="k">class</span> <span class="nc">ArcBSplineCurveWithKnots</span><span class="p">(</span><span class="n">Polyline</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;B-spline curve with knots, an open wireframe object in local</span>
<span class="sd"> coordinate system&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</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">knot_multiplicities</span><span class="p">,</span>
<span class="n">knots</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="mi">5</span><span class="p">):</span>
<span class="n">knots</span> <span class="o">=</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="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">knots</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">knot_multiplicities</span><span class="p">[</span><span class="n">i</span><span class="p">])]</span>
<span class="c1">#u = seq(knots[0], knots[-1], (knots[-1]-knots[0])/n) + [knots[-1]-1e-7]</span>
<span class="n">C</span> <span class="o">=</span> <span class="n">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="c1">#points = [Point(*C(ui)) for ui in u]</span>
<span class="n">points</span> <span class="o">=</span> <span class="n">sample_half_open</span><span class="p">(</span><span class="n">C</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="n">n</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="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">points</span><span class="p">)</span></div>
<div class="viewcode-block" id="B_spline_curve_with_knots"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.B_spline_curve_with_knots">[docs]</a><span class="k">class</span> <span class="nc">B_spline_curve_with_knots</span><span class="p">(</span><span class="n">Polyline</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;B-spline curve with knots, an open wireframe object in local</span>
<span class="sd"> coordinate system&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</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">knot_multiplicities</span><span class="p">,</span>
<span class="n">knots</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="mi">5</span><span class="p">):</span>
<span class="n">knots</span> <span class="o">=</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="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">knots</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">knot_multiplicities</span><span class="p">[</span><span class="n">i</span><span class="p">])]</span>
<span class="c1">#u = seq(knots[0], knots[-1], (knots[-1]-knots[0])/n) + [knots[-1]-1e-7]</span>
<span class="n">C</span> <span class="o">=</span> <span class="n">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="c1">#points = [Point(*C(ui)) for ui in u]</span>
<span class="n">points</span> <span class="o">=</span> <span class="n">sample_half_open</span><span class="p">(</span><span class="n">C</span><span class="p">,</span> <span class="n">knots</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">knots</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">n</span><span class="o">=</span><span class="n">n</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="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">points</span><span class="p">)</span></div>
<div class="viewcode-block" id="Polygon"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Polygon">[docs]</a><span class="k">class</span> <span class="nc">Polygon</span><span class="p">(</span><span class="n">Polyline</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Polygon as closed wireframe object in local coordinate system&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">points</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">points</span><span class="p">,</span> <span class="n">closed</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span></div>
<div class="viewcode-block" id="Circle"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Circle">[docs]</a><span class="k">class</span> <span class="nc">Circle</span><span class="p">(</span><span class="n">Polygon</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Circle a closed wireframe object in local coordinate system&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">radius</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="mi">10</span><span class="p">):</span>
<span class="n">points</span> <span class="o">=</span> <span class="p">[]</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="n">n</span><span class="p">):</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">radius</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">i</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">n</span><span class="p">)</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">radius</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">i</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">n</span><span class="p">)</span>
<span class="n">points</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">Point</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="mi">0</span><span class="p">))</span>
<span class="sd">&quot;&quot;&quot;Circle, a closed wireframe object in local coordinate system&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">radius</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">interval</span> <span class="o">=</span> <span class="n">circle</span><span class="p">(</span><span class="n">radius</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">n</span><span class="p">:</span>
<span class="n">n</span> <span class="o">=</span> <span class="n">Properties</span><span class="o">.</span><span class="n">circle_sectors</span>
<span class="n">delta</span> <span class="o">=</span> <span class="n">interval</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">/</span><span class="n">n</span>
<span class="n">points</span> <span class="o">=</span> <span class="p">[</span><span class="n">Point</span><span class="p">(</span><span class="n">x</span><span class="p">(</span><span class="n">i</span><span class="o">*</span><span class="n">delta</span><span class="p">),</span> <span class="n">y</span><span class="p">(</span><span class="n">i</span><span class="o">*</span><span class="n">delta</span><span class="p">),</span> <span class="mi">0</span><span class="p">)</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="n">n</span><span class="p">)]</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">points</span><span class="p">)</span></div>
<div class="viewcode-block" id="Ellipse"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Ellipse">[docs]</a><span class="k">class</span> <span class="nc">Ellipse</span><span class="p">(</span><span class="n">Polygon</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Circle, a closed wireframe object in local coordinate system&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</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">b</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">interval</span> <span class="o">=</span> <span class="n">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="k">if</span> <span class="ow">not</span> <span class="n">n</span><span class="p">:</span>
<span class="n">n</span> <span class="o">=</span> <span class="n">Properties</span><span class="o">.</span><span class="n">circle_sectors</span>
<span class="n">delta</span> <span class="o">=</span> <span class="n">interval</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">/</span><span class="n">n</span>
<span class="n">points</span> <span class="o">=</span> <span class="p">[</span><span class="n">Point</span><span class="p">(</span><span class="n">x</span><span class="p">(</span><span class="n">i</span><span class="o">*</span><span class="n">delta</span><span class="p">),</span> <span class="n">y</span><span class="p">(</span><span class="n">i</span><span class="o">*</span><span class="n">delta</span><span class="p">),</span> <span class="mi">0</span><span class="p">)</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="n">n</span><span class="p">)]</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">points</span><span class="p">)</span></div>
<div class="viewcode-block" id="Solid"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.Solid">[docs]</a><span class="k">class</span> <span class="nc">Solid</span><span class="p">:</span>
@@ -240,6 +347,13 @@
<span class="sd">&quot;&quot;&quot;Returns the Iterator object&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">objects</span><span class="p">())</span></div>
<div class="viewcode-block" id="World.__str__"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.World.__str__">[docs]</a> <span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">result</span> <span class="o">=</span> <span class="s1">&#39;World(</span><span class="se">\n</span><span class="s1">&#39;</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">objects</span><span class="p">():</span>
<span class="n">result</span> <span class="o">+=</span> <span class="s1">&#39; &#39;</span> <span class="o">+</span> <span class="nb">repr</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39;,</span><span class="se">\n</span><span class="s1">&#39;</span>
<span class="n">result</span> <span class="o">+=</span> <span class="s1">&#39;)&#39;</span>
<span class="k">return</span> <span class="n">result</span></div>
<span class="k">def</span> <span class="nf">_store_init</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Initialize or reset calculated values, because a new object</span>
<span class="sd"> was added.</span>
@@ -279,7 +393,7 @@
<div class="viewcode-block" id="World.wireframes"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.World.wireframes">[docs]</a> <span class="k">def</span> <span class="nf">wireframes</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">objects</span><span class="p">():</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">Wireframe</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">Polyline</span><span class="p">):</span>
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">i</span><span class="o">.</span><span class="n">points</span><span class="p">())</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">Solid</span><span class="p">):</span>
<span class="p">[</span><span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">j</span><span class="o">.</span><span class="n">points</span><span class="p">())</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="n">i</span><span class="o">.</span><span class="n">wireframes</span><span class="p">()]</span>
@@ -288,7 +402,7 @@
<div class="viewcode-block" id="World.wireframes_xy"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.World.wireframes_xy">[docs]</a> <span class="k">def</span> <span class="nf">wireframes_xy</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">objects</span><span class="p">():</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">Wireframe</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">Polyline</span><span class="p">):</span>
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">i</span><span class="o">.</span><span class="n">xy</span><span class="p">())</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">Solid</span><span class="p">):</span>
<span class="p">[</span><span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">j</span><span class="o">.</span><span class="n">xy</span><span class="p">())</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="n">i</span><span class="o">.</span><span class="n">wireframes</span><span class="p">()]</span>
@@ -297,7 +411,7 @@
<div class="viewcode-block" id="World.wireframes_xyz"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.World.wireframes_xyz">[docs]</a> <span class="k">def</span> <span class="nf">wireframes_xyz</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">objects</span><span class="p">():</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">Wireframe</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">Polyline</span><span class="p">):</span>
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">i</span><span class="o">.</span><span class="n">xyz</span><span class="p">())</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">Solid</span><span class="p">):</span>
<span class="p">[</span><span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">j</span><span class="o">.</span><span class="n">xyz</span><span class="p">())</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="n">i</span><span class="o">.</span><span class="n">wireframes</span><span class="p">()]</span>
@@ -308,6 +422,7 @@
<div class="viewcode-block" id="World.add"><a class="viewcode-back" href="../../pylib.geometry.html#pylib.geometry.World.add">[docs]</a> <span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">objects</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_store_init</span><span class="p">()</span> <span class="c1"># calculated values are not correct anymore</span>
<span class="c1"># [] + [] not possible bc objects are vectors</span>
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_objects</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">objects</span><span class="p">]</span>
<span class="k">return</span> <span class="bp">self</span></div>

View File

@@ -262,13 +262,18 @@
<span class="n">fig</span><span class="o">.</span><span class="n">canvas</span><span class="o">.</span><span class="n">mpl_connect</span><span class="p">(</span><span class="s1">&#39;resize_event&#39;</span><span class="p">,</span>
<span class="k">lambda</span> <span class="n">event</span><span class="p">:</span> <span class="n">onresize</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">world</span><span class="p">))</span>
<span class="c1"># &#39;rotate: ←left, right, up, down, ctrl+left, ctrl+right\n&#39; +</span>
<span class="c1"># &#39;pan: shift+left, shift+right, shift+up, shift+down\n&#39; +</span>
<span class="c1"># &#39;zoom: ctrl+up, ctrl+down\n&#39; +</span>
<span class="c1"># &#39;view: f (front), l (left), r (right), t (top), b (bottom)\n&#39; +</span>
<span class="c1"># &#39; i (isometric), d (dimetric)&#39;,</span>
<span class="n">pylab</span><span class="o">.</span><span class="n">text</span><span class="p">(</span>
<span class="mi">0</span><span class="o">+.</span><span class="mi">01</span><span class="p">,</span> <span class="mi">1</span><span class="o">-.</span><span class="mi">015</span><span class="p">,</span>
<span class="s1">&#39;rotate: left, right, up, down, ctrl+left, ctrl+right</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">+</span>
<span class="s1">&#39;pan: shift+left, shift+right, shift+up, shift+down</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">+</span>
<span class="s1">&#39;zoom: ctrl+up, ctrl+down</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">+</span>
<span class="s1">&#39;view: f (front), l (left), r (right), t (top), b (bottom)</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">+</span>
<span class="s1">&#39; i (isometric), d (dimetric)&#39;</span><span class="p">,</span>
<span class="s1">&#39;rotate: [←], [→], [↑], [↓], [Ctrl][←], [Ctrl][→]</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">+</span>
<span class="s1">&#39;pan: [Shift][←], [Shift][→], [Shift][↑], [Shift][↓]</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">+</span>
<span class="s1">&#39;zoom: [Ctrl][↑], [Ctrl][↓]</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">+</span>
<span class="s1">&#39;view: [f]ront, [l]eft, [r]ight, [t]op, [b]ottom</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">+</span>
<span class="s1">&#39; [i]sometric, [d]imetric&#39;</span><span class="p">,</span>
<span class="n">horizontalalignment</span><span class="o">=</span><span class="s1">&#39;left&#39;</span><span class="p">,</span>
<span class="n">verticalalignment</span><span class="o">=</span><span class="s1">&#39;top&#39;</span><span class="p">,</span>
<span class="n">transform</span><span class="o">=</span><span class="n">fig</span><span class="o">.</span><span class="n">transFigure</span><span class="p">,</span>

View File

@@ -0,0 +1,151 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title>pylib.helper &#8212; 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.helper</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">&quot;&quot;&quot;Helper objects.</span>
<span class="sd">:Date: 2020-01-01</span>
<span class="sd">.. module:: helper</span>
<span class="sd"> :platform: *nix, Windows</span>
<span class="sd"> :synopsis: Helper objects.</span>
<span class="sd">.. moduleauthor:: Daniel Weschke &lt;daniel.weschke@directbox.de&gt;</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">time</span>
<span class="kn">from</span> <span class="nn">contextlib</span> <span class="kn">import</span> <span class="n">ContextDecorator</span>
<div class="viewcode-block" id="timeit"><a class="viewcode-back" href="../../pylib.helper.html#pylib.helper.timeit">[docs]</a><span class="k">class</span> <span class="nc">timeit</span><span class="p">(</span><span class="n">ContextDecorator</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Meassure time for a function or code block.</span>
<span class="sd"> :param description: description for the function or code block</span>
<span class="sd"> used for the print-out</span>
<span class="sd"> :type description: str</span>
<span class="sd"> :Example:</span>
<span class="sd"> &gt;&gt;&gt; with timeit(&#39;section_test&#39;):</span>
<span class="sd"> ... # code</span>
<span class="sd"> section_test took 0.006 ms</span>
<span class="sd"> ::</span>
<span class="sd"> @timeit(&#39;func&#39;)</span>
<span class="sd"> def func():</span>
<span class="sd"> # code</span>
<span class="sd"> &gt;&gt;&gt; func()</span>
<span class="sd"> func took 0.006 ms</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">description</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">description</span> <span class="o">=</span> <span class="n">description</span>
<span class="k">def</span> <span class="fm">__enter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">start_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
<span class="k">return</span> <span class="bp">self</span> <span class="c1"># to use as: with Timit() as t:</span>
<span class="k">def</span> <span class="fm">__exit__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">exc</span><span class="p">):</span> <span class="c1"># exc: type, value, traceback</span>
<span class="n">elapsed_time_ms</span> <span class="o">=</span> <span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">start_time</span><span class="p">)</span> <span class="o">*</span> <span class="mi">1000</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">{:s}</span><span class="s1"> took </span><span class="si">{:.3f}</span><span class="s1"> ms&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">description</span><span class="p">,</span> <span class="n">elapsed_time_ms</span><span class="p">))</span>
<span class="k">return</span> <span class="kc">False</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">
&copy;2019, Daniel Weschke.
|
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>
</body>
</html>

View File

@@ -130,7 +130,7 @@
<span class="sd"> &gt;&gt;&gt; v[3]</span>
<span class="sd"> 4</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># use the list.__getslice__ method and convert result to vector</span>
<span class="c1"># use the list.__getitem__ method and convert result to vector</span>
<span class="n">item</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__getitem__</span><span class="p">(</span><span class="n">index</span><span class="p">)</span>
<span class="k">return</span> <span class="n">vector</span><span class="p">(</span><span class="n">item</span><span class="p">)</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="nb">list</span><span class="p">)</span> <span class="k">else</span> <span class="n">item</span></div>
@@ -385,12 +385,11 @@
<div class="viewcode-block" id="vector.full"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.vector.full">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">full</span><span class="p">(</span><span class="n">length</span><span class="p">,</span> <span class="n">fill_value</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Returns a vector of length m or matrix of size m rows, n</span>
<span class="sd"> columns filled with v.</span>
<span class="sd">&quot;&quot;&quot;Returns a vector of length m filled with v.</span>
<span class="sd"> :param length: length of the vector, e. g. 3</span>
<span class="sd"> :type length: int</span>
<span class="sd"> :param fill_value: Fill value</span>
<span class="sd"> :param fill_value: fill value</span>
<span class="sd"> :Type fill_value: scalar</span>
<span class="sd"> :Example:</span>
@@ -403,15 +402,14 @@
<div class="viewcode-block" id="vector.zeros"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.vector.zeros">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">zeros</span><span class="p">(</span><span class="n">length</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Returns a zero vector of length m or matrix of size rows, n</span>
<span class="sd"> columns filled with zeros.</span>
<span class="sd">&quot;&quot;&quot;Returns a zero vector of length m filled with zeros.</span>
<span class="sd"> :param length: length of the vector, e. g. 3</span>
<span class="sd"> :type length: int</span>
<span class="sd"> :Example:</span>
<span class="sd"> &gt;&gt;&gt; v = zeros(3)</span>
<span class="sd"> &gt;&gt;&gt; v = vector.zeros(3)</span>
<span class="sd"> &gt;&gt;&gt; print(v)</span>
<span class="sd"> [0.0, 0.0, 0.0]</span>
<span class="sd"> &quot;&quot;&quot;</span>
@@ -419,40 +417,42 @@
<div class="viewcode-block" id="vector.ones"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.vector.ones">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">ones</span><span class="p">(</span><span class="n">length</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Returns a vector of length m or matrix of size rows, n</span>
<span class="sd"> columns filled with ones.</span>
<span class="sd">&quot;&quot;&quot;Returns a vector of length m filled with ones.</span>
<span class="sd"> :param length: lhape of the vector, e. g. 3</span>
<span class="sd"> :type length: int</span>
<span class="sd"> :Example:</span>
<span class="sd"> &gt;&gt;&gt; v = ones(3)</span>
<span class="sd"> &gt;&gt;&gt; v = vector.ones(3)</span>
<span class="sd"> &gt;&gt;&gt; print(v)</span>
<span class="sd"> [1.0, 1.0, 1.0]</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">vector</span><span class="o">.</span><span class="n">full</span><span class="p">(</span><span class="n">length</span><span class="p">,</span> <span class="mf">1.</span><span class="p">)</span></div>
<div class="viewcode-block" id="vector.random"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.vector.random">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">random</span><span class="p">(</span><span class="n">shape</span><span class="p">,</span> <span class="n">lmin</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">lmax</span><span class="o">=</span><span class="mf">1.0</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Returns a random vector of length n or matrix of size m rows,</span>
<span class="sd"> n columns filled with random numbers.</span>
<span class="k">def</span> <span class="nf">random</span><span class="p">(</span><span class="n">length</span><span class="p">,</span> <span class="n">lmin</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">lmax</span><span class="o">=</span><span class="mf">1.0</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Returns a random vector of length n filled with random</span>
<span class="sd"> numbers.</span>
<span class="sd"> :param length: lhape of the vector, e. g. 3</span>
<span class="sd"> :type length: int</span>
<span class="sd"> :Example:</span>
<span class="sd"> &gt;&gt;&gt; v = random(3)</span>
<span class="sd"> &gt;&gt;&gt; v = vector.random(3)</span>
<span class="sd"> &gt;&gt;&gt; print(v)</span>
<span class="sd"> [0.9172905912930438, 0.8908124278322492, 0.5256002790725927]</span>
<span class="sd"> &gt;&gt;&gt; v = random(3, 1, 2)</span>
<span class="sd"> &gt;&gt;&gt; v = vector.random(3, 1, 2)</span>
<span class="sd"> &gt;&gt;&gt; print(v)</span>
<span class="sd"> [1.2563665665080803, 1.9270454509964547, 1.2381672401270487]</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">random</span>
<span class="n">dl</span> <span class="o">=</span> <span class="n">lmax</span><span class="o">-</span><span class="n">lmin</span>
<span class="k">return</span> <span class="n">vector</span><span class="p">([</span><span class="n">dl</span><span class="o">*</span><span class="n">random</span><span class="o">.</span><span class="n">random</span><span class="p">()</span><span class="o">+</span><span class="n">lmin</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="n">shape</span><span class="p">)])</span></div>
<span class="k">return</span> <span class="n">vector</span><span class="p">([</span><span class="n">dl</span><span class="o">*</span><span class="n">random</span><span class="o">.</span><span class="n">random</span><span class="p">()</span><span class="o">+</span><span class="n">lmin</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="n">length</span><span class="p">)])</span></div>
<div class="viewcode-block" id="vector.normalize"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.vector.normalize">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">normalize</span><span class="p">(</span><span class="n">a</span><span class="p">):</span>
<div class="viewcode-block" id="vector.normalized"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.vector.normalized">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">normalized</span><span class="p">(</span><span class="n">a</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Normalize a vector (i. e. the vector has a length of 1)</span>
<span class="sd"> :type a: vector</span>
@@ -468,7 +468,12 @@
<div class="viewcode-block" id="vector.ang"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.vector.ang">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">ang</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="k">return</span> <span class="n">math</span><span class="o">.</span><span class="n">acos</span><span class="p">(</span><span class="n">a</span> <span class="o">*</span> <span class="n">b</span> <span class="o">/</span> <span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="o">*</span> <span class="nb">abs</span><span class="p">(</span><span class="n">b</span><span class="p">)))</span></div>
<span class="n">x</span> <span class="o">=</span> <span class="n">a</span> <span class="o">*</span> <span class="n">b</span> <span class="o">/</span> <span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="o">*</span> <span class="nb">abs</span><span class="p">(</span><span class="n">b</span><span class="p">))</span>
<span class="c1"># decimal floating-point numbers are only approximated by the</span>
<span class="c1"># binary floating-point numbers actually stored in the machine.</span>
<span class="c1"># https://docs.python.org/3.8/tutorial/floatingpoint.html</span>
<span class="n">xr15</span> <span class="o">=</span> <span class="nb">round</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="mi">15</span><span class="p">)</span>
<span class="k">return</span> <span class="n">math</span><span class="o">.</span><span class="n">acos</span><span class="p">(</span><span class="n">xr15</span><span class="p">)</span> <span class="k">if</span> <span class="o">-</span><span class="mi">1</span> <span class="o">&lt;=</span> <span class="n">xr15</span> <span class="o">&lt;=</span> <span class="mi">1</span> <span class="k">else</span> <span class="n">math</span><span class="o">.</span><span class="n">acos</span><span class="p">(</span><span class="n">x</span><span class="p">)</span></div>
<div class="viewcode-block" id="vector.conjugate"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.vector.conjugate">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">conjugate</span><span class="p">(</span><span class="n">a</span><span class="p">):</span>
@@ -524,9 +529,30 @@
<span class="sd"> .. math::</span>
<span class="sd"> \mathbf{c} = \mathbf{a} \times \mathbf{b}</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</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="o">*</span><span class="n">b</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">-</span> <span class="n">a</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">*</span><span class="n">b</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span>
<span class="n">a</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">*</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="n">a</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">b</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span>
<span class="n">a</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">b</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">a</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">b</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span></div>
<span class="k">return</span> <span class="n">vector</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="o">*</span><span class="n">b</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">-</span> <span class="n">a</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">*</span><span class="n">b</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span>
<span class="n">a</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">*</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="n">a</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">b</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span>
<span class="n">a</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">b</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">a</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">b</span><span class="p">[</span><span class="mi">0</span><span class="p">]])</span></div>
<div class="viewcode-block" id="vector.isclose"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.vector.isclose">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">isclose</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">rel_tol</span><span class="o">=</span><span class="mf">0.05</span><span class="p">,</span> <span class="n">abs_tol</span><span class="o">=</span><span class="mf">1e-8</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">all</span><span class="p">([</span><span class="n">math</span><span class="o">.</span><span class="n">isclose</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="n">rel_tol</span><span class="o">=</span><span class="n">rel_tol</span><span class="p">,</span> <span class="n">abs_tol</span><span class="o">=</span><span class="n">abs_tol</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)])</span></div>
<div class="viewcode-block" id="vector.iscloseto"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.vector.iscloseto">[docs]</a> <span class="k">def</span> <span class="nf">iscloseto</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="k">return</span> <span class="n">vector</span><span class="o">.</span><span class="n">isclose</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">)</span></div>
<div class="viewcode-block" id="vector.normalize"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.vector.normalize">[docs]</a> <span class="k">def</span> <span class="nf">normalize</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Normalize a vector (i. e. the vector has a length of 1)</span>
<span class="sd"> :type a: vector</span>
<span class="sd"> .. math::</span>
<span class="sd"> \mathbf{\hat{a}} = \frac{\mathbf{a}}{|\mathbf{a}|}</span>
<span class="sd"> .. seealso::</span>
<span class="sd"> :meth:`__abs__` for a norm (magnitude) of a vector</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="p">[:]</span> <span class="o">=</span> <span class="n">vector</span><span class="o">.</span><span class="n">normalized</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span></div>
<div class="viewcode-block" id="vector.rotate_x"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.vector.rotate_x">[docs]</a> <span class="k">def</span> <span class="nf">rotate_x</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">theta</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Rotation about the x dirction.</span>
@@ -649,8 +675,16 @@
<span class="sd"> &gt;&gt;&gt; m = matrix([[1, 2, 3, 0], [4, 5, 6, 0], [7, 8, 9, 0], \</span>
<span class="sd"> [0, 0, 0, 0]])</span>
<span class="sd"> &gt;&gt;&gt; print(m[:])</span>
<span class="sd"> [[1, 2, 3, 0], [4, 5, 6, 0], [7, 8, 9, 0], [0, 0, 0, 0]]</span>
<span class="sd"> &gt;&gt;&gt; print(m[2])</span>
<span class="sd"> [7, 8, 9, 0]</span>
<span class="sd"> &gt;&gt;&gt; print(m[2, :])</span>
<span class="sd"> [7, 8, 9, 0]</span>
<span class="sd"> &gt;&gt;&gt; print(m[:, 2])</span>
<span class="sd"> [3, 6, 9, 0]</span>
<span class="sd"> &gt;&gt;&gt; print(m[2, 2])</span>
<span class="sd"> 9</span>
<span class="sd"> &gt;&gt;&gt; print(m[:, 1:3])</span>
<span class="sd"> [[2, 3], [5, 6], [8, 9], [0, 0]]</span>
<span class="sd"> &gt;&gt;&gt; print(m[0:2, 1:3])</span>
@@ -658,15 +692,143 @@
<span class="sd"> &gt;&gt;&gt; print(m[::2, ::2])</span>
<span class="sd"> [[1, 3], [7, 9]]</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># TODO single row or column = vector (1d list)?</span>
<span class="c1"># index: slice(stop), slice(start, stop[, step])</span>
<span class="c1"># for m[(1,3),:] -&gt; index = ((1, 3), slice(None, None, None))</span>
<span class="c1"># use the list.__getslice__ method and convert result to vector</span>
<span class="k">try</span><span class="p">:</span> <span class="c1"># 2d slicing (tuple of sclices)</span>
<span class="n">item</span> <span class="o">=</span> <span class="p">[</span><span class="n">row</span><span class="o">.</span><span class="fm">__getitem__</span><span class="p">(</span><span class="n">index</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="k">for</span>
<span class="n">row</span> <span class="ow">in</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__getitem__</span><span class="p">(</span><span class="n">index</span><span class="p">[</span><span class="mi">0</span><span class="p">])]</span>
<span class="k">except</span><span class="p">:</span> <span class="c1"># 1d slicing</span>
<span class="c1"># use the list.__getitem__ method and convert result to matrix</span>
<span class="c1">#print(index)</span>
<span class="k">try</span><span class="p">:</span> <span class="c1"># 2d slicing (tuple of sclices)</span>
<span class="k">try</span><span class="p">:</span> <span class="c1"># range:range or range:single: [:, 2]</span>
<span class="c1">#print(1)</span>
<span class="n">item</span> <span class="o">=</span> <span class="p">[</span><span class="n">row</span><span class="o">.</span><span class="fm">__getitem__</span><span class="p">(</span><span class="n">index</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="k">for</span>
<span class="n">row</span> <span class="ow">in</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__getitem__</span><span class="p">(</span><span class="n">index</span><span class="p">[</span><span class="mi">0</span><span class="p">])]</span>
<span class="k">except</span><span class="p">:</span> <span class="c1"># single:range: [2, :], [2, 2]</span>
<span class="c1">#print(2)</span>
<span class="n">item</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__getitem__</span><span class="p">(</span><span class="n">index</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span><span class="o">.</span><span class="fm">__getitem__</span><span class="p">(</span><span class="n">index</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
<span class="k">except</span><span class="p">:</span> <span class="c1"># 1d slicing: [:], [2], [2][2]</span>
<span class="c1">#print(3)</span>
<span class="n">item</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__getitem__</span><span class="p">(</span><span class="n">index</span><span class="p">)</span>
<span class="k">return</span> <span class="n">matrix</span><span class="p">(</span><span class="n">item</span><span class="p">)</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="nb">list</span><span class="p">)</span> <span class="k">else</span> <span class="n">item</span></div>
<span class="c1">#print(item)</span>
<span class="k">return</span> <span class="n">matrix</span><span class="p">(</span><span class="n">item</span><span class="p">)</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="nb">list</span><span class="p">)</span> <span class="ow">and</span> \
<span class="nb">isinstance</span><span class="p">(</span><span class="n">item</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="nb">list</span><span class="p">)</span> <span class="k">else</span> <span class="n">item</span></div>
<div class="viewcode-block" id="matrix.__setitem__"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.matrix.__setitem__">[docs]</a> <span class="k">def</span> <span class="fm">__setitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="c1">#print(index, value)</span>
<span class="k">try</span><span class="p">:</span> <span class="c1"># [2, 2]</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__getitem__</span><span class="p">(</span><span class="n">index</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span><span class="o">.</span><span class="fm">__setitem__</span><span class="p">(</span><span class="n">index</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">value</span><span class="p">)</span>
<span class="k">except</span><span class="p">:</span> <span class="c1"># [2], [2][2]</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__setitem__</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span></div>
<span class="c1">#print(self)</span>
<div class="viewcode-block" id="matrix.__mul__"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.matrix.__mul__">[docs]</a> <span class="k">def</span> <span class="fm">__mul__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Scalar multiplication, dot product (inner product) or</span>
<span class="sd"> matrix-vector multiplication. (new object)</span>
<span class="sd"> :type other: scalar, vector (or 1d list), matrix (or 2d list)</span>
<span class="sd"> .. math::</span>
<span class="sd"> \mathbf{C} &amp;= \mathbf{A} \cdot b \\</span>
<span class="sd"> \mathbf{c} &amp;= \mathbf{A} \cdot \mathbf{b} \\</span>
<span class="sd"> \mathbf{C} &amp;= \mathbf{A} \cdot \mathbf{B}</span>
<span class="sd"> .. note::</span>
<span class="sd"> No size checking will be conducted, therefore no exceptions</span>
<span class="sd"> for wrong usage (result will be nonsense).</span>
<span class="sd"> :Example:</span>
<span class="sd"> &gt;&gt;&gt; m = matrix([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], \</span>
<span class="sd"> [0, 0, 0, 1]]) * 5</span>
<span class="sd"> &gt;&gt;&gt; print(m)</span>
<span class="sd"> [[5, 10, 15, 20], [25, 30, 35, 40], [45, 50, 55, 60], [0, 0, 0, 5]]</span>
<span class="sd"> &gt;&gt;&gt; m = matrix([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], \</span>
<span class="sd"> [0, 0, 0, 1]]) * 5.</span>
<span class="sd"> &gt;&gt;&gt; print(m)</span>
<span class="sd"> [[5.0, 10.0, 15.0, 20.0], [25.0, 30.0, 35.0, 40.0], [45.0, 50.0, 55.0, 60.0], [0.0, 0.0, 0.0, 5.0]]</span>
<span class="sd"> &gt;&gt;&gt; v = matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) * \</span>
<span class="sd"> vector([12, 12, 13])</span>
<span class="sd"> &gt;&gt;&gt; print(v)</span>
<span class="sd"> [75, 186, 297]</span>
<span class="sd"> &gt;&gt;&gt; m = matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) * \</span>
<span class="sd"> matrix([[12, 12, 13], [14, 15, 16], [17, 18, 19]])</span>
<span class="sd"> &gt;&gt;&gt; print(m)</span>
<span class="sd"> [[91, 96, 102], [220, 231, 246], [349, 366, 390]]</span>
<span class="sd"> .. seealso::</span>
<span class="sd"> :meth:`__rmul__`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span> <span class="c1"># matrix * matrix</span>
<span class="k">return</span> <span class="n">matrix</span><span class="p">([[</span><span class="nb">sum</span><span class="p">(</span><span class="n">c</span><span class="o">*</span><span class="n">d</span> <span class="k">for</span> <span class="n">c</span><span class="p">,</span> <span class="n">d</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">a_row</span><span class="p">,</span> <span class="n">b_col</span><span class="p">))</span> <span class="k">for</span>
<span class="n">b_col</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="o">*</span><span class="n">other</span><span class="p">)]</span> <span class="k">for</span> <span class="n">a_row</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">])</span>
<span class="k">except</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span> <span class="c1"># matrix * vector</span>
<span class="k">return</span> <span class="n">vector</span><span class="p">([</span><span class="nb">sum</span><span class="p">(</span><span class="n">c</span><span class="o">*</span><span class="n">d</span> <span class="k">for</span> <span class="n">c</span><span class="p">,</span> <span class="n">d</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">a_row</span><span class="p">,</span> <span class="n">other</span><span class="p">))</span> <span class="k">for</span>
<span class="n">a_row</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">])</span>
<span class="k">except</span><span class="p">:</span> <span class="c1"># matrix * scalar</span>
<span class="k">return</span> <span class="n">matrix</span><span class="p">([[</span><span class="n">a</span><span class="o">*</span><span class="n">other</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">a_row</span><span class="p">]</span> <span class="k">for</span> <span class="n">a_row</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">])</span></div>
<div class="viewcode-block" id="matrix.__rmul__"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.matrix.__rmul__">[docs]</a> <span class="k">def</span> <span class="fm">__rmul__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Scalar multiplication, dot product (inner product) or</span>
<span class="sd"> vector-matrix multiplication. (new object)</span>
<span class="sd"> :type other: scalar (or 1d list and 2d list)</span>
<span class="sd"> .. math::</span>
<span class="sd"> \mathbf{C} &amp;= a \cdot \mathbf{B} \\</span>
<span class="sd"> \mathbf{c} &amp;= \mathbf{a} \cdot \mathbf{B} \\</span>
<span class="sd"> \mathbf{C} &amp;= \mathbf{A} \cdot \mathbf{B}</span>
<span class="sd"> .. note::</span>
<span class="sd"> No size checking will be conducted, therefore no exceptions</span>
<span class="sd"> for wrong usage (result will be nonsense).</span>
<span class="sd"> :Example:</span>
<span class="sd"> &gt;&gt;&gt; m = 5 * matrix([[1, 2, 3, 4], [5, 6, 7, 8], \</span>
<span class="sd"> [9, 10, 11, 12], [0, 0, 0, 1]])</span>
<span class="sd"> &gt;&gt;&gt; print(m)</span>
<span class="sd"> [[5, 10, 15, 20], [25, 30, 35, 40], [45, 50, 55, 60], [0, 0, 0, 5]]</span>
<span class="sd"> &gt;&gt;&gt; m = 5. * matrix([[1, 2, 3, 4], [5, 6, 7, 8], \</span>
<span class="sd"> [9, 10, 11, 12], [0, 0, 0, 1]])</span>
<span class="sd"> &gt;&gt;&gt; print(m)</span>
<span class="sd"> [[5.0, 10.0, 15.0, 20.0], [25.0, 30.0, 35.0, 40.0], [45.0, 50.0, 55.0, 60.0], [0.0, 0.0, 0.0, 5.0]]</span>
<span class="sd"> .. seealso::</span>
<span class="sd"> :meth:`__mul__` and :meth:`vector.__mul__` for vector * matrix</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span> <span class="c1"># 2d list * matrix (matrix * matrix see matrix.__mul__)</span>
<span class="k">return</span> <span class="n">matrix</span><span class="p">([[</span><span class="nb">sum</span><span class="p">(</span><span class="n">c</span><span class="o">*</span><span class="n">d</span> <span class="k">for</span> <span class="n">c</span><span class="p">,</span> <span class="n">d</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">a_row</span><span class="p">,</span> <span class="n">b_col</span><span class="p">))</span> <span class="k">for</span>
<span class="n">b_col</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="o">*</span><span class="bp">self</span><span class="p">)]</span> <span class="k">for</span> <span class="n">a_row</span> <span class="ow">in</span> <span class="n">other</span><span class="p">])</span>
<span class="k">except</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span> <span class="c1"># 1d list * matrix (vector * matrix see vector.__mul__)</span>
<span class="k">return</span> <span class="n">vector</span><span class="p">([</span><span class="nb">sum</span><span class="p">(</span><span class="n">c</span><span class="o">*</span><span class="n">d</span> <span class="k">for</span> <span class="n">c</span><span class="p">,</span> <span class="n">d</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">b_col</span><span class="p">))</span> <span class="k">for</span>
<span class="n">b_col</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="o">*</span><span class="bp">self</span><span class="p">)])</span>
<span class="k">except</span><span class="p">:</span> <span class="c1"># scalar * vector</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">*</span><span class="n">other</span></div>
<div class="viewcode-block" id="matrix.__str__"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.matrix.__str__">[docs]</a> <span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">([</span><span class="o">*</span><span class="bp">self</span><span class="p">])</span></div>
<div class="viewcode-block" id="matrix.__repr__"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.matrix.__repr__">[docs]</a> <span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;matrix(&quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;)&quot;</span></div>
<div class="viewcode-block" id="matrix.zeros"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.matrix.zeros">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">zeros</span><span class="p">(</span><span class="n">m</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Returns a zero matrix of size mxn; m rows and n columns</span>
<span class="sd"> filled with zeros.</span>
<span class="sd"> :param m: number of rows of the matrix, e. g. 3</span>
<span class="sd"> :type m: int</span>
<span class="sd"> :param n: number of columns of the matrix, e. g. 3</span>
<span class="sd"> :type n: int</span>
<span class="sd"> :Example:</span>
<span class="sd"> &gt;&gt;&gt; m = matrix.zeros(3, 3)</span>
<span class="sd"> &gt;&gt;&gt; print(m)\</span>
<span class="sd"> [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]]</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">matrix</span><span class="p">([[</span><span class="mf">0.</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="n">n</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">m</span><span class="p">)])</span></div>
<div class="viewcode-block" id="matrix.rx"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.matrix.rx">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">rx</span><span class="p">(</span><span class="n">theta</span><span class="p">):</span>
@@ -809,97 +971,23 @@
<span class="p">[</span> <span class="mi">0</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="mi">1</span><span class="p">]])</span>
<span class="k">return</span> <span class="n">T</span></div>
<div class="viewcode-block" id="matrix.__mul__"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.matrix.__mul__">[docs]</a> <span class="k">def</span> <span class="fm">__mul__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Scalar multiplication, dot product (inner product) or</span>
<span class="sd"> matrix-vector multiplication. (new object)</span>
<span class="sd"> :type other: scalar, vector (or 1d list), matrix (or 2d list)</span>
<span class="sd"> .. math::</span>
<span class="sd"> \mathbf{C} &amp;= \mathbf{A} \cdot b \\</span>
<span class="sd"> \mathbf{c} &amp;= \mathbf{A} \cdot \mathbf{b} \\</span>
<span class="sd"> \mathbf{C} &amp;= \mathbf{A} \cdot \mathbf{B}</span>
<span class="sd"> .. note::</span>
<span class="sd"> No size checking will be conducted, therefore no exceptions</span>
<span class="sd"> for wrong usage (result will be nonsense).</span>
<span class="sd"> :Example:</span>
<span class="sd"> &gt;&gt;&gt; m = matrix([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], \</span>
<span class="sd"> [0, 0, 0, 1]]) * 5</span>
<span class="sd"> &gt;&gt;&gt; print(m)</span>
<span class="sd"> [[5, 10, 15, 20], [25, 30, 35, 40], [45, 50, 55, 60], [0, 0, 0, 5]]</span>
<span class="sd"> &gt;&gt;&gt; m = matrix([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], \</span>
<span class="sd"> [0, 0, 0, 1]]) * 5.</span>
<span class="sd"> &gt;&gt;&gt; print(m)</span>
<span class="sd"> [[5.0, 10.0, 15.0, 20.0], [25.0, 30.0, 35.0, 40.0], [45.0, 50.0, 55.0, 60.0], [0.0, 0.0, 0.0, 5.0]]</span>
<span class="sd"> &gt;&gt;&gt; v = matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) * \</span>
<span class="sd"> vector([12, 12, 13])</span>
<span class="sd"> &gt;&gt;&gt; print(v)</span>
<span class="sd"> [75, 186, 297]</span>
<span class="sd"> &gt;&gt;&gt; m = matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) * \</span>
<span class="sd"> matrix([[12, 12, 13], [14, 15, 16], [17, 18, 19]])</span>
<span class="sd"> &gt;&gt;&gt; print(m)</span>
<span class="sd"> [[91, 96, 102], [220, 231, 246], [349, 366, 390]]</span>
<span class="sd"> .. seealso::</span>
<span class="sd"> :meth:`__rmul__`</span>
<div class="viewcode-block" id="matrix.transposed"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.matrix.transposed">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">transposed</span><span class="p">(</span><span class="n">a</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Transpose</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span> <span class="c1"># matrix * matrix</span>
<span class="k">return</span> <span class="n">matrix</span><span class="p">([[</span><span class="nb">sum</span><span class="p">(</span><span class="n">c</span><span class="o">*</span><span class="n">d</span> <span class="k">for</span> <span class="n">c</span><span class="p">,</span> <span class="n">d</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">a_row</span><span class="p">,</span> <span class="n">b_col</span><span class="p">))</span> <span class="k">for</span>
<span class="n">b_col</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="o">*</span><span class="n">other</span><span class="p">)]</span> <span class="k">for</span> <span class="n">a_row</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">])</span>
<span class="k">except</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span> <span class="c1"># matrix * vector</span>
<span class="k">return</span> <span class="n">vector</span><span class="p">([</span><span class="nb">sum</span><span class="p">(</span><span class="n">c</span><span class="o">*</span><span class="n">d</span> <span class="k">for</span> <span class="n">c</span><span class="p">,</span> <span class="n">d</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">a_row</span><span class="p">,</span> <span class="n">other</span><span class="p">))</span> <span class="k">for</span>
<span class="n">a_row</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">])</span>
<span class="k">except</span><span class="p">:</span> <span class="c1"># matrix * scalar</span>
<span class="k">return</span> <span class="n">matrix</span><span class="p">([[</span><span class="n">a</span><span class="o">*</span><span class="n">other</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">a_row</span><span class="p">]</span> <span class="k">for</span> <span class="n">a_row</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">])</span></div>
<span class="n">m</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
<span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">a</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="n">new</span> <span class="o">=</span> <span class="n">matrix</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">m</span><span class="p">)</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="n">m</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">n</span><span class="p">):</span>
<span class="n">new</span><span class="p">[</span><span class="n">j</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">a</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">new</span></div>
<div class="viewcode-block" id="matrix.__rmul__"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.matrix.__rmul__">[docs]</a> <span class="k">def</span> <span class="fm">__rmul__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Scalar multiplication, dot product (inner product) or</span>
<span class="sd"> vector-matrix multiplication. (new object)</span>
<span class="sd"> :type other: scalar (or 1d list and 2d list)</span>
<span class="sd"> .. math::</span>
<span class="sd"> \mathbf{C} &amp;= a \cdot \mathbf{B} \\</span>
<span class="sd"> \mathbf{c} &amp;= \mathbf{a} \cdot \mathbf{B} \\</span>
<span class="sd"> \mathbf{C} &amp;= \mathbf{A} \cdot \mathbf{B}</span>
<span class="sd"> .. note::</span>
<span class="sd"> No size checking will be conducted, therefore no exceptions</span>
<span class="sd"> for wrong usage (result will be nonsense).</span>
<span class="sd"> :Example:</span>
<span class="sd"> &gt;&gt;&gt; m = 5 * matrix([[1, 2, 3, 4], [5, 6, 7, 8], \</span>
<span class="sd"> [9, 10, 11, 12], [0, 0, 0, 1]])</span>
<span class="sd"> &gt;&gt;&gt; print(m)</span>
<span class="sd"> [[5, 10, 15, 20], [25, 30, 35, 40], [45, 50, 55, 60], [0, 0, 0, 5]]</span>
<span class="sd"> &gt;&gt;&gt; m = 5. * matrix([[1, 2, 3, 4], [5, 6, 7, 8], \</span>
<span class="sd"> [9, 10, 11, 12], [0, 0, 0, 1]])</span>
<span class="sd"> &gt;&gt;&gt; print(m)</span>
<span class="sd"> [[5.0, 10.0, 15.0, 20.0], [25.0, 30.0, 35.0, 40.0], [45.0, 50.0, 55.0, 60.0], [0.0, 0.0, 0.0, 5.0]]</span>
<span class="sd"> .. seealso::</span>
<span class="sd"> :meth:`__mul__` and :meth:`vector.__mul__` for vector * matrix</span>
<div class="viewcode-block" id="matrix.transpose"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.matrix.transpose">[docs]</a> <span class="k">def</span> <span class="nf">transpose</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Transpose</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span> <span class="c1"># 2d list * matrix (matrix * matrix see matrix.__mul__)</span>
<span class="k">return</span> <span class="n">matrix</span><span class="p">([[</span><span class="nb">sum</span><span class="p">(</span><span class="n">c</span><span class="o">*</span><span class="n">d</span> <span class="k">for</span> <span class="n">c</span><span class="p">,</span> <span class="n">d</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">a_row</span><span class="p">,</span> <span class="n">b_col</span><span class="p">))</span> <span class="k">for</span>
<span class="n">b_col</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="o">*</span><span class="bp">self</span><span class="p">)]</span> <span class="k">for</span> <span class="n">a_row</span> <span class="ow">in</span> <span class="n">other</span><span class="p">])</span>
<span class="k">except</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span> <span class="c1"># 1d list * matrix (vector * matrix see vector.__mul__)</span>
<span class="k">return</span> <span class="n">vector</span><span class="p">([</span><span class="nb">sum</span><span class="p">(</span><span class="n">c</span><span class="o">*</span><span class="n">d</span> <span class="k">for</span> <span class="n">c</span><span class="p">,</span> <span class="n">d</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">b_col</span><span class="p">))</span> <span class="k">for</span>
<span class="n">b_col</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="o">*</span><span class="bp">self</span><span class="p">)])</span>
<span class="k">except</span><span class="p">:</span> <span class="c1"># scalar * vector</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">*</span><span class="n">other</span></div>
<div class="viewcode-block" id="matrix.__str__"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.matrix.__str__">[docs]</a> <span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">([</span><span class="o">*</span><span class="bp">self</span><span class="p">])</span></div>
<div class="viewcode-block" id="matrix.__repr__"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.matrix.__repr__">[docs]</a> <span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;matrix(&quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;)&quot;</span></div>
<span class="bp">self</span><span class="p">[:]</span> <span class="o">=</span> <span class="n">matrix</span><span class="o">.</span><span class="n">transposed</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span></div>
<div class="viewcode-block" id="matrix.rotate_x"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.matrix.rotate_x">[docs]</a> <span class="k">def</span> <span class="nf">rotate_x</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">theta</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Rotation about the x dirction.</span>

View File

@@ -35,7 +35,7 @@
<h1>Source code for pylib.numerical.ode</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">&quot;&quot;&quot;Numerical solver of ordinary differential equations.</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Numerical solver of ordinary differential equations.</span>
<span class="sd">Solves the initial value problem for systems of first order</span>
<span class="sd">ordinary differential equations.</span>
@@ -47,9 +47,14 @@
<span class="sd"> :synopsis: Numerical solver.</span>
<span class="sd">.. moduleauthor:: Daniel Weschke &lt;daniel.weschke@directbox.de&gt;</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">division</span><span class="p">,</span> <span class="n">print_function</span>
<span class="sd">Approximate the solution :math:`x(t)` of the initial value problem</span>
<span class="sd">.. math ::</span>
<span class="sd"> \frac{\mathrm{d}x}{\mathrm{d}t} = \dot{x} &amp;= f(t,x) \\</span>
<span class="sd"> x(t_0) &amp;= x_0 \\</span>
<span class="sd"> t &amp;\in [t_0, t_n]</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">numpy</span> <span class="kn">import</span> <span class="n">array</span><span class="p">,</span> <span class="n">isnan</span><span class="p">,</span> <span class="nb">sum</span><span class="p">,</span> <span class="n">zeros</span><span class="p">,</span> <span class="n">dot</span>
<span class="kn">from</span> <span class="nn">numpy.linalg</span> <span class="kn">import</span> <span class="n">norm</span><span class="p">,</span> <span class="n">inv</span>
@@ -73,20 +78,21 @@
<span class="sd"> :param verbose: print information (default = False)</span>
<span class="sd"> :type verbose: bool</span>
<span class="sd"> Approximate the solution of the initial value problem</span>
<span class="sd"> Approximate the solution :math:`x(t)` of the initial value problem</span>
<span class="sd"> .. math ::</span>
<span class="sd"> \dot{x} &amp;= f(t,x) \\</span>
<span class="sd"> x(t_0) &amp;= x_0</span>
<span class="sd"> x(t_0) &amp;= x_0 \\</span>
<span class="sd"> t &amp;\in [t_0, t_n]</span>
<span class="sd"> Choose a value h for the size of every step and set</span>
<span class="sd"> .. math ::</span>
<span class="sd"> t_i = t_0 + i h ~,\quad i=1,2,\ldots,n</span>
<span class="sd"> t_{i+1} = t_0 + i h = t_i + h ~,\quad i=0,1,2,\ldots,n-1</span>
<span class="sd"> The derivative of the solution is approximated as the forward</span>
<span class="sd"> difference equation</span>
<span class="sd"> </span>
<span class="sd"> .. math ::</span>
<span class="sd"> \dot{x}_i = f(t_i, x_i) = \frac{x_{i+1} - x_i}{t_{i+1}-t_i}</span>
@@ -166,13 +172,23 @@
<span class="sd"> the step size, and the global error (error at a given time) is</span>
<span class="sd"> proportional to the step size.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">zeros</span><span class="p">((</span><span class="nb">len</span><span class="p">(</span><span class="n">t</span><span class="p">),</span> <span class="nb">len</span><span class="p">(</span><span class="n">x0</span><span class="p">)))</span> <span class="c1"># Preallocate array</span>
<span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">,:]</span> <span class="o">=</span> <span class="n">x0</span> <span class="c1"># Initial condition gives solution at first t</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">t</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">):</span> <span class="c1"># Calculation loop</span>
<span class="n">Dt</span> <span class="o">=</span> <span class="n">t</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">t</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
<span class="n">dxdt</span> <span class="o">=</span> <span class="n">array</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">i</span><span class="p">,:],</span> <span class="n">t</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="o">*</span><span class="n">p</span><span class="p">))</span>
<span class="c1"># Approximate solution at next value of x</span>
<span class="n">x</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">x</span><span class="p">[</span><span class="n">i</span><span class="p">,:]</span> <span class="o">+</span> <span class="n">dxdt</span><span class="o">*</span><span class="n">Dt</span>
<span class="kn">from</span> <span class="nn">pylib.data</span> <span class="kn">import</span> <span class="n">issequence</span>
<span class="k">if</span> <span class="n">issequence</span><span class="p">(</span><span class="n">x0</span><span class="p">):</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">zeros</span><span class="p">((</span><span class="nb">len</span><span class="p">(</span><span class="n">t</span><span class="p">),</span> <span class="nb">len</span><span class="p">(</span><span class="n">x0</span><span class="p">)))</span> <span class="c1"># Preallocate array</span>
<span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">,:]</span> <span class="o">=</span> <span class="n">x0</span> <span class="c1"># Initial condition gives solution at first t</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">t</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">):</span> <span class="c1"># Calculation loop</span>
<span class="n">Dt</span> <span class="o">=</span> <span class="n">t</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">t</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
<span class="n">dxdt</span> <span class="o">=</span> <span class="n">array</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">i</span><span class="p">,:],</span> <span class="n">t</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="o">*</span><span class="n">p</span><span class="p">))</span>
<span class="c1"># Approximate solution at next value of x</span>
<span class="n">x</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">x</span><span class="p">[</span><span class="n">i</span><span class="p">,:]</span> <span class="o">+</span> <span class="n">dxdt</span><span class="o">*</span><span class="n">Dt</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">zeros</span><span class="p">((</span><span class="nb">len</span><span class="p">(</span><span class="n">t</span><span class="p">)))</span>
<span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">x0</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">t</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">):</span> <span class="c1"># Calculation loop</span>
<span class="n">Dt</span> <span class="o">=</span> <span class="n">t</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">t</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
<span class="n">dxdt</span> <span class="o">=</span> <span class="n">array</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">i</span><span class="p">],</span> <span class="n">t</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="o">*</span><span class="n">p</span><span class="p">))</span>
<span class="c1"># Approximate solution at next value of x</span>
<span class="n">x</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">x</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">+</span> <span class="n">dxdt</span><span class="o">*</span><span class="n">Dt</span>
<span class="k">if</span> <span class="n">verbose</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Numerical integration of ODE using explicit &#39;</span> <span class="o">+</span>
<span class="s1">&#39;first-order method (Euler / Runge-Kutta) was successful.&#39;</span><span class="p">)</span>
@@ -218,6 +234,31 @@
<span class="sd"> ...)</span>
<span class="sd"> :param verbose: print information (default = False)</span>
<span class="sd"> :type verbose: bool</span>
<span class="sd"> Problem</span>
<span class="sd"> .. math ::</span>
<span class="sd"> \dot{y} &amp;= f(t, y) \\</span>
<span class="sd"> y(t_0) &amp;= y_0 \\</span>
<span class="sd"> t &amp;\in [t_0, t_n]</span>
<span class="sd"> Increment :math:`\delta t = t_{i+1}-t_i ~,~~ i=0,1,2,\ldots,n-1`</span>
<span class="sd"> .. math::</span>
<span class="sd"> y_{n+1} &amp;= y_{i} + \tfrac{1}{6}(</span>
<span class="sd"> \delta y_{i,1} + 2\delta y_{i,2} + 2\delta y_{i,3} +</span>
<span class="sd"> \delta y_{i,4}) \\</span>
<span class="sd"> &amp; \qquad \text{with} \\</span>
<span class="sd"> \delta y_{i,1} &amp;= \delta t \cdot y&#39;(t_{i}, ~ y_{i}) \\</span>
<span class="sd"> \delta y_{i,2} &amp;= \delta t \cdot</span>
<span class="sd"> y&#39;(t_{i}+\tfrac{1}{2}\delta t, ~</span>
<span class="sd"> y_{i}+\tfrac{1}{2}\delta y_{i,1}) \\</span>
<span class="sd"> \delta y_{i,3} &amp;= \delta t \cdot</span>
<span class="sd"> y&#39;(t_{i}+\tfrac{1}{2}\delta t, ~</span>
<span class="sd"> y_{i}+\tfrac{1}{2}\delta y_{i,2}) \\</span>
<span class="sd"> \delta y_{i,4} &amp;= \delta t \cdot</span>
<span class="sd"> y&#39;(t_{i}+\delta t, ~ y_{i}+\delta y_{i,3})</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">zeros</span><span class="p">((</span><span class="nb">len</span><span class="p">(</span><span class="n">t</span><span class="p">),</span> <span class="nb">len</span><span class="p">(</span><span class="n">x0</span><span class="p">)))</span> <span class="c1"># Preallocate array</span>
<span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">,:]</span> <span class="o">=</span> <span class="n">x0</span> <span class="c1"># Initial condition</span>
@@ -237,7 +278,7 @@
<div class="viewcode-block" id="fpi"><a class="viewcode-back" href="../../../pylib.numerical.ode.html#pylib.numerical.ode.fpi">[docs]</a><span class="k">def</span> <span class="nf">fpi</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">ti</span><span class="p">,</span> <span class="n">ti1</span><span class="p">,</span> <span class="o">*</span><span class="n">p</span><span class="p">,</span> <span class="n">max_iterations</span><span class="o">=</span><span class="mi">1000</span><span class="p">,</span> <span class="n">tol</span><span class="o">=</span><span class="mf">1e-9</span><span class="p">,</span>
<span class="n">verbose</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Fixed-point iteration.</span>
<span class="sd"> </span>
<span class="sd"> :param f: the function to iterate :math:`f = \dot{x}(x,t)`</span>
<span class="sd"> :type f: function</span>
<span class="sd"> :param xi: initial condition :math:`x_i`</span>
@@ -255,19 +296,19 @@
<span class="sd"> :type tol: float</span>
<span class="sd"> :param verbose: print information (default = False)</span>
<span class="sd"> :type verbose: bool</span>
<span class="sd"> </span>
<span class="sd"> :returns: :math:`x_{i}`</span>
<span class="sd"> </span>
<span class="sd"> .. math ::</span>
<span class="sd"> x_{i,j=0} = x_{i}</span>
<span class="sd"> </span>
<span class="sd"> .. math ::</span>
<span class="sd"> x_{i,j+1} = x_i + \dot{x}(x_{i,j}, t_{i+1})\cdot(t_{i+1}-t_i)</span>
<span class="sd"> </span>
<span class="sd"> .. math ::</span>
<span class="sd"> \text{residuum} = \frac{\lVert x_{i,j+1}-x_{i,j}\rVert}</span>
<span class="sd"> {\lVert x_{i,j+1} \rVert} &lt; \varepsilon</span>
<span class="sd"> </span>
<span class="sd"> .. math ::</span>
<span class="sd"> x_{i} = x_{i,j=\text{end}}</span>
<span class="sd"> &quot;&quot;&quot;</span>
@@ -301,7 +342,7 @@
<span class="sd"> :type tol: float</span>
<span class="sd"> :param verbose: print information (default = False)</span>
<span class="sd"> :type verbose: bool</span>
<span class="sd"> </span>
<span class="sd"> The backward Euler method has order one and is A-stable.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">iterations</span> <span class="o">=</span> <span class="n">zeros</span><span class="p">((</span><span class="nb">len</span><span class="p">(</span><span class="n">t</span><span class="p">),</span> <span class="mi">1</span><span class="p">))</span>
@@ -313,8 +354,9 @@
<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">t</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">):</span>
<span class="n">Dt</span> <span class="o">=</span> <span class="n">t</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">t</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
<span class="n">xi</span> <span class="o">=</span> <span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">,:]</span>
<span class="n">xi</span><span class="p">,</span> <span class="n">iteration</span> <span class="o">=</span> <span class="n">fpi</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="n">i</span><span class="p">],</span> <span class="n">t</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">p</span><span class="p">,</span> <span class="n">max_iterations</span><span class="p">,</span>
<span class="n">tol</span><span class="p">,</span> <span class="n">verbose</span><span class="p">)</span>
<span class="n">xi</span><span class="p">,</span> <span class="n">iteration</span> <span class="o">=</span> <span class="n">fpi</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="n">i</span><span class="p">],</span> <span class="n">t</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">p</span><span class="p">,</span>
<span class="n">max_iterations</span><span class="o">=</span><span class="n">max_iterations</span><span class="p">,</span> <span class="n">tol</span><span class="o">=</span><span class="n">tol</span><span class="p">,</span>
<span class="n">verbose</span><span class="o">=</span><span class="n">verbose</span><span class="p">)</span>
<span class="n">x</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">xi</span>
<span class="n">iterations</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">iteration</span>
<span class="k">if</span> <span class="n">verbose</span><span class="p">:</span>
@@ -382,7 +424,7 @@
<span class="n">dot</span><span class="p">(</span><span class="n">dNp</span><span class="p">,</span> <span class="p">(</span><span class="n">xp1</span><span class="o">-</span><span class="n">xpi</span><span class="p">))))</span>
<span class="n">xp1</span> <span class="o">=</span> <span class="n">xpi</span> <span class="o">+</span> <span class="n">Dt</span><span class="o">*</span><span class="p">(</span> <span class="p">(</span><span class="mi">1</span><span class="o">-</span><span class="n">gamma</span><span class="p">)</span><span class="o">*</span><span class="n">xppi</span> <span class="o">+</span> <span class="n">gamma</span><span class="o">*</span><span class="n">xpp11</span> <span class="p">)</span>
<span class="n">x1</span> <span class="o">=</span> <span class="n">xi</span> <span class="o">+</span> <span class="n">Dt</span><span class="o">*</span><span class="n">xpi</span> <span class="o">+</span> <span class="n">Dt</span><span class="o">**</span><span class="mi">2</span><span class="o">*</span><span class="p">(</span> <span class="p">(</span><span class="o">.</span><span class="mi">5</span><span class="o">-</span><span class="n">beta</span><span class="p">)</span><span class="o">*</span><span class="n">xppi</span> <span class="o">+</span> <span class="n">beta</span><span class="o">*</span><span class="n">xpp11</span> <span class="p">)</span>
<span class="n">residuum</span> <span class="o">=</span> <span class="n">norm</span><span class="p">(</span><span class="n">xpp11</span><span class="o">-</span><span class="n">xpp1</span><span class="p">)</span><span class="o">/</span><span class="n">norm</span><span class="p">(</span><span class="n">xpp11</span><span class="p">)</span>
<span class="n">xpp1</span> <span class="o">=</span> <span class="n">xpp11</span>
<span class="k">if</span> <span class="n">residuum</span> <span class="o">&lt;</span> <span class="n">tol</span><span class="p">:</span>
@@ -398,10 +440,12 @@
<span class="k">return</span> <span class="n">x</span><span class="p">,</span> <span class="n">xp</span><span class="p">,</span> <span class="n">xpp</span><span class="p">,</span> <span class="n">iterations</span></div>
<span class="c1"># x = concatenate((x, xp, xpp), axis=1)</span>
<div class="viewcode-block" id="newmark_newtonraphson_rdk"><a class="viewcode-back" href="../../../pylib.numerical.ode.html#pylib.numerical.ode.newmark_newtonraphson_rdk">[docs]</a><span class="k">def</span> <span class="nf">newmark_newtonraphson_rdk</span><span class="p">(</span><span class="n">fnm</span><span class="p">,</span> <span class="n">x0</span><span class="p">,</span> <span class="n">xp0</span><span class="p">,</span> <span class="n">xpp0</span><span class="p">,</span> <span class="n">t</span><span class="p">,</span> <span class="o">*</span><span class="n">p</span><span class="p">,</span> <span class="n">gamma</span><span class="o">=.</span><span class="mi">5</span><span class="p">,</span>
<div class="viewcode-block" id="newmark_newtonraphson_mdk"><a class="viewcode-back" href="../../../pylib.numerical.ode.html#pylib.numerical.ode.newmark_newtonraphson_mdk">[docs]</a><span class="k">def</span> <span class="nf">newmark_newtonraphson_mdk</span><span class="p">(</span><span class="n">fmdk</span><span class="p">,</span> <span class="n">x0</span><span class="p">,</span> <span class="n">xp0</span><span class="p">,</span> <span class="n">xpp0</span><span class="p">,</span> <span class="n">t</span><span class="p">,</span> <span class="o">*</span><span class="n">p</span><span class="p">,</span> <span class="n">gamma</span><span class="o">=.</span><span class="mi">5</span><span class="p">,</span>
<span class="n">beta</span><span class="o">=.</span><span class="mi">25</span><span class="p">,</span> <span class="n">max_iterations</span><span class="o">=</span><span class="mi">1000</span><span class="p">,</span> <span class="n">tol</span><span class="o">=</span><span class="mf">1e-9</span><span class="p">,</span> <span class="n">verbose</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Newmark method.</span>
<span class="sd"> Using m mass, d damping and k stiffness formulation.</span>
<span class="sd"> :param f: the function to solve</span>
<span class="sd"> :type f: function</span>
<span class="sd"> :param x0: initial condition</span>
@@ -435,9 +479,9 @@
<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">t</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">):</span>
<span class="n">Dt</span> <span class="o">=</span> <span class="n">t</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">t</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
<span class="n">rm</span><span class="p">,</span> <span class="n">rmx</span><span class="p">,</span> <span class="n">rmxpp</span><span class="p">,</span> <span class="n">rd</span><span class="p">,</span> <span class="n">rdx</span><span class="p">,</span> <span class="n">rdxp</span><span class="p">,</span> <span class="n">rk</span><span class="p">,</span> <span class="n">rkx</span><span class="p">,</span> <span class="n">f</span> <span class="o">=</span> <span class="n">fnm</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">,:],</span>
<span class="n">rm</span><span class="p">,</span> <span class="n">rmx</span><span class="p">,</span> <span class="n">rmxpp</span><span class="p">,</span> <span class="n">rd</span><span class="p">,</span> <span class="n">rdx</span><span class="p">,</span> <span class="n">rdxp</span><span class="p">,</span> <span class="n">rk</span><span class="p">,</span> <span class="n">rkx</span><span class="p">,</span> <span class="n">f</span> <span class="o">=</span> <span class="n">fmdk</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">,:],</span>
<span class="n">xp</span><span class="p">[</span><span class="n">i</span><span class="p">,:],</span> <span class="n">xpp</span><span class="p">[</span><span class="n">i</span><span class="p">,:],</span> <span class="n">t</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="o">*</span><span class="n">p</span><span class="p">)</span>
<span class="n">xi</span> <span class="o">=</span> <span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">,:]</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span>
<span class="n">xpi</span> <span class="o">=</span> <span class="n">xp</span><span class="p">[</span><span class="n">i</span><span class="p">,:]</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span>
<span class="n">xppi</span> <span class="o">=</span> <span class="n">xpp</span><span class="p">[</span><span class="n">i</span><span class="p">,:]</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span>
@@ -450,7 +494,7 @@
<span class="c1"># Approximate solution at next value of x</span>
<span class="c1">#x11 = x[i,:] + dxdt*Dt</span>
<span class="n">r</span> <span class="o">=</span> <span class="p">(</span><span class="n">rmx</span><span class="o">+</span><span class="n">rdx</span><span class="o">+</span><span class="n">rkx</span><span class="p">)</span><span class="o">*</span><span class="n">Dt</span><span class="o">**</span><span class="mf">2.</span><span class="o">/</span><span class="mi">4</span> <span class="o">+</span> <span class="n">rdxp</span><span class="o">*</span><span class="n">Dt</span><span class="o">/</span><span class="mi">2</span> <span class="o">+</span> <span class="n">rmxpp</span>
<span class="n">r</span> <span class="o">=</span> <span class="p">(</span><span class="n">rmx</span><span class="o">+</span><span class="n">rdx</span><span class="o">+</span><span class="n">rkx</span><span class="p">)</span><span class="o">*</span><span class="n">Dt</span><span class="o">**</span><span class="mf">2.</span><span class="o">/</span><span class="mi">4</span> <span class="o">+</span> <span class="n">rdxp</span><span class="o">*</span><span class="n">Dt</span><span class="o">/</span><span class="mi">2</span> <span class="o">+</span> <span class="n">rmxpp</span>
<span class="n">rp</span> <span class="o">=</span> <span class="n">f</span> <span class="o">-</span> <span class="p">(</span><span class="n">rm</span> <span class="o">+</span> <span class="n">dot</span><span class="p">(</span><span class="n">rmx</span><span class="p">,</span> <span class="p">(</span><span class="n">Dt</span><span class="o">*</span><span class="n">xpi</span><span class="o">+</span><span class="n">Dt</span><span class="o">**</span><span class="mf">2.</span><span class="o">/</span><span class="mi">4</span><span class="o">*</span><span class="n">xppi</span><span class="p">))</span> <span class="o">-</span> \
<span class="n">dot</span><span class="p">(</span><span class="n">rmxpp</span><span class="p">,</span> <span class="n">xppi</span><span class="p">)</span> <span class="o">+</span> \
<span class="n">rd</span> <span class="o">+</span> <span class="n">dot</span><span class="p">(</span><span class="n">rdx</span><span class="p">,</span> <span class="p">(</span><span class="n">Dt</span><span class="o">*</span><span class="n">xpi</span><span class="o">+</span><span class="n">Dt</span><span class="o">**</span><span class="mf">2.</span><span class="o">/</span><span class="mi">4</span><span class="o">*</span><span class="n">xppi</span><span class="p">))</span> <span class="o">+</span> \

View File

@@ -37,10 +37,10 @@
<span class="c1"># -*- coding: utf-8 -*-</span>
<span class="sd">&quot;&quot;&quot;Mathmatical models governed by ordinary differential equations.</span>
<span class="sd">Describes initial value problems as systems of first order ordinary differential</span>
<span class="sd">equations.</span>
<span class="sd">Describes initial value problems as systems of first order ordinary</span>
<span class="sd">differential equations.</span>
<span class="sd">:Date: 2019-05-25</span>
<span class="sd">:Date: 2020-01-08</span>
<span class="sd">.. module:: ode_model</span>
<span class="sd"> :platform: *nix, Windows</span>
@@ -48,111 +48,172 @@
<span class="sd">.. moduleauthor:: Daniel Weschke &lt;daniel.weschke@directbox.de&gt;</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">division</span><span class="p">,</span> <span class="n">print_function</span>
<span class="kn">from</span> <span class="nn">numpy</span> <span class="kn">import</span> <span class="n">array</span><span class="p">,</span> <span class="n">cos</span><span class="p">,</span> <span class="n">sin</span><span class="p">,</span> <span class="n">dot</span><span class="p">,</span> <span class="n">square</span>
<span class="kn">from</span> <span class="nn">numpy.linalg</span> <span class="kn">import</span> <span class="n">inv</span>
<div class="viewcode-block" id="disk"><a class="viewcode-back" href="../../../pylib.numerical.ode_model.html#pylib.numerical.ode_model.disk">[docs]</a><span class="k">def</span> <span class="nf">disk</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">t</span><span class="p">,</span> <span class="o">*</span><span class="n">p</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Rotation of an eccentric disk.</span>
<div class="viewcode-block" id="disk"><a class="viewcode-back" href="../../../pylib.numerical.ode_model.html#pylib.numerical.ode_model.disk">[docs]</a><span class="k">def</span> <span class="nf">disk</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="n">e</span><span class="p">,</span> <span class="n">T</span><span class="p">,</span> <span class="n">method</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Rotation of an eccentric disk.</span>
<span class="sd"> :param x: values of the function</span>
<span class="sd"> :type x: list</span>
<span class="sd"> :param t: time</span>
<span class="sd"> :type t: list</span>
<span class="sd"> :param `*p`: parameters of the function</span>
<span class="sd"> :param d: diameter</span>
<span class="sd"> :type d: float</span>
<span class="sd"> :param e: eccentricity</span>
<span class="sd"> :type e: float</span>
<span class="sd"> :param T: torque</span>
<span class="sd"> :type T: float</span>
<span class="sd"> :param method: the method to use, default = &#39;&#39;.</span>
<span class="sd"> :type method:</span>
<span class="sd"> :returns: disk function. This function is independent of the time.</span>
<span class="sd"> * diameter</span>
<span class="sd"> * eccentricity</span>
<span class="sd"> * torque</span>
<span class="sd"> * For method = &#39;&#39;: f(x, t=0) -&gt; (xp1, xp2, xp3, xp4, xp5, xp6).</span>
<span class="sd"> x is (x, y, phi, x&#39;, y&#39;, phi&#39;) and the return values are (x&#39;,</span>
<span class="sd"> y&#39;, phi&#39;, x&#39;&#39;, y&#39;&#39;, phi&#39;&#39;)</span>
<span class="sd"> * For method = &#39;nm&#39;: f(xn, xpn, xppn, t=0) -&gt; (N, dN, dNp, dNpp).</span>
<span class="sd"> xn are the values of the function (x, y, phi), xpn are first</span>
<span class="sd"> derivative values of the function (x&#39;, y&#39;, phi&#39;) and xppn are</span>
<span class="sd"> the second derivative values of the function (x&#39;&#39;, y&#39;&#39;, phi&#39;&#39;).</span>
<span class="sd"> The return values are (N, dN, dNp, dNpp)</span>
<span class="sd"> * For method = &#39;nmmdk&#39;: f(xn, xpn, xppn, t=0) -&gt;</span>
<span class="sd"> (rm, rmx, rmxpp, rd, rdx, rdxp, rk, rkx, f).</span>
<span class="sd"> xn are the values of the function (x, y, phi), xpn are first</span>
<span class="sd"> derivative values of the function (x&#39;, y&#39;, phi&#39;) and xppn are</span>
<span class="sd"> the second derivative values of the function (x&#39;&#39;, y&#39;&#39;, phi&#39;&#39;).</span>
<span class="sd"> The return values are (rm, rmx, rmxpp, rd, rdx, rdxp, rk, rkx,</span>
<span class="sd"> f)</span>
<span class="sd"> :rtype: function</span>
<span class="sd"> Model</span>
<span class="sd"> .. math ::</span>
<span class="sd"> \begin{vmatrix}</span>
<span class="sd"> \ddot{x} + \cos(\varphi)\ddot{\varphi} + 2d \,\dot{x} - \sin(\varphi) \,\dot{\varphi}^2 + 2d\cos(\varphi)\, \dot{\varphi} + x &amp;=&amp;</span>
<span class="sd"> 0 \\</span>
<span class="sd"> \ddot{y} - \sin(\varphi)\ddot{\varphi} + 2d \,\dot{y} - \cos(\varphi) \,\dot{\varphi}^2 + 2d\sin(\varphi)\, \dot{\varphi} + y &amp;=&amp;</span>
<span class="sd"> 0 \\</span>
<span class="sd"> \ddot{\varphi} + e\,y\sin(\varphi) - e\,x\cos(\varphi) &amp;=&amp; t</span>
<span class="sd"> \end{vmatrix}</span>
<span class="sd"> \\</span>
<span class="sd"> \begin{vmatrix}</span>
<span class="sd"> \ddot{x} + \cos(\varphi)\ddot{\varphi} &amp;=&amp;</span>
<span class="sd"> -2d \,\dot{x} + \sin(\varphi) \,\dot{\varphi}^2 -2d\cos(\varphi)\, \dot{\varphi} - x \\</span>
<span class="sd"> \ddot{y} - \sin(\varphi)\ddot{\varphi} &amp;=&amp;</span>
<span class="sd"> -2d \,\dot{y} + \cos(\varphi) \,\dot{\varphi}^2 -2d\sin(\varphi)\, \dot{\varphi} - y \\</span>
<span class="sd"> \ddot{\varphi} &amp;=&amp; t - e\,y\sin(\varphi) + e\,x\cos(\varphi)</span>
<span class="sd"> \end{vmatrix}</span>
<span class="sd"> .. math ::</span>
<span class="sd"> \mathbf{M}(\mathbf{x}) \cdot \mathbf{\ddot{x}} &amp;=</span>
<span class="sd"> \mathbf{f}(\mathbf{x}, \mathbf{\dot{x}})</span>
<span class="sd"> \\</span>
<span class="sd"> \begin{bmatrix}</span>
<span class="sd"> 1 &amp; 0 &amp; \cos \varphi \\</span>
<span class="sd"> 0 &amp; 1 &amp; -\sin \varphi \\</span>
<span class="sd"> 0 &amp; 0 &amp; 1</span>
<span class="sd"> \end{bmatrix} \cdot</span>
<span class="sd"> \begin{bmatrix}</span>
<span class="sd"> \ddot{x} \\ \ddot{y} \\ \ddot{\varphi}</span>
<span class="sd"> \end{bmatrix} &amp;= \begin{bmatrix}</span>
<span class="sd"> -2d \,\dot{x} + \sin(\varphi) \,\dot{\varphi}^2 -2d\cos(\varphi)\, \dot{\varphi} - x \\</span>
<span class="sd"> -2d \,\dot{y} + \cos(\varphi) \,\dot{\varphi}^2 -2d\sin(\varphi)\, \dot{\varphi} - y \\</span>
<span class="sd"> t - e\,y\sin(\varphi) + e\,x\cos(\varphi)</span>
<span class="sd"> \end{bmatrix}</span>
<span class="sd"> returns</span>
<span class="sd"> .. math ::</span>
<span class="sd"> x_1 &amp;= x &amp;\quad x_4 &amp;= \dot{x}_1 = \dot{x} &amp;\quad \dot{x}_4 &amp;= \ddot{x} \\</span>
<span class="sd"> x_2 &amp;= y &amp;\quad x_5 &amp;= \dot{x}_2 = \dot{y} &amp;\quad \dot{x}_5 &amp;= \ddot{y} \\</span>
<span class="sd"> x_3 &amp;= \varphi &amp;\quad x_6 &amp;= \dot{x}_3 = \dot{\varphi} &amp;\quad \dot{x}_6 &amp;= \ddot{\varphi} \\</span>
<span class="sd"> .. math ::</span>
<span class="sd"> \dot{q} &amp;= f(x) \\</span>
<span class="sd"> \begin{bmatrix}</span>
<span class="sd"> \dot{x}_1 \\</span>
<span class="sd"> \dot{x}_2 \\</span>
<span class="sd"> \dot{x}_3 \\</span>
<span class="sd"> \dot{x}_4 \\</span>
<span class="sd"> \dot{x}_5 \\</span>
<span class="sd"> \dot{x}_6</span>
<span class="sd"> \end{bmatrix} &amp;= \begin{bmatrix}</span>
<span class="sd"> x_4 \\</span>
<span class="sd"> x_5 \\</span>
<span class="sd"> x_6 \\</span>
<span class="sd"> \begin{bmatrix}</span>
<span class="sd"> 1 &amp; 0 &amp; \cos x_3 \\</span>
<span class="sd"> 0 &amp; 1 &amp; -\sin x_3 \\</span>
<span class="sd"> 0 &amp; 0 &amp; 1</span>
<span class="sd"> \end{bmatrix}^{-1} \cdot \begin{bmatrix}</span>
<span class="sd"> -2d \,x_4 + \sin(x_3) \,x_6^2 -2d\cos(x_3)\, x_6 - x_1 \\</span>
<span class="sd"> -2d \,x_5 + \cos(x_3) \,x_6^2 -2d\sin(x_3)\, x_6 - x_2 \\</span>
<span class="sd"> t - e\,x_2\sin(x_3) + e\,x_1\cos(x_3)</span>
<span class="sd"> \end{bmatrix}</span>
<span class="sd"> \end{bmatrix}</span>
<span class="sd"> Three explicit differential equations of order 2 reducted to a</span>
<span class="sd"> system of 3x2 first-order differential equations.</span>
<span class="sd"> .. seealso::</span>
<span class="sd"> :meth:`pylib.numerical.ode.newmark_newtonraphson` and</span>
<span class="sd"> :meth:`pylib.numerical.ode.newmark_newtonraphson_mdk`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">qp1</span> <span class="o">=</span> <span class="n">x</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span>
<span class="n">qp2</span> <span class="o">=</span> <span class="n">x</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span>
<span class="n">qp3</span> <span class="o">=</span> <span class="n">x</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span>
<span class="n">M</span> <span class="o">=</span> <span class="n">array</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="n">cos</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="n">sin</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</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="mi">1</span><span class="p">]])</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">x</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span><span class="o">+</span><span class="n">sin</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">x</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span><span class="o">**</span><span class="mi">2</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">x</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span><span class="o">-</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]],</span> \
<span class="p">[</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">x</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span><span class="o">+</span><span class="n">cos</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">x</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span><span class="o">**</span><span class="mi">2</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">x</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span><span class="o">-</span><span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">]],</span> \
<span class="p">[</span><span class="n">p</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">-</span><span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">+</span><span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">2</span><span class="p">])]])</span>
<span class="n">qp46</span> <span class="o">=</span> <span class="n">dot</span><span class="p">(</span><span class="n">inv</span><span class="p">(</span><span class="n">M</span><span class="p">),</span> <span class="n">y</span><span class="p">)</span>
<span class="n">qp4</span><span class="p">,</span> <span class="n">qp5</span><span class="p">,</span> <span class="n">qp6</span> <span class="o">=</span> <span class="n">qp46</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,)</span><span class="o">.</span><span class="n">tolist</span><span class="p">()</span> <span class="c1"># 2d array to 1d array to list</span>
<span class="k">return</span> <span class="n">qp1</span><span class="p">,</span> <span class="n">qp2</span><span class="p">,</span> <span class="n">qp3</span><span class="p">,</span> <span class="n">qp4</span><span class="p">,</span> <span class="n">qp5</span><span class="p">,</span> <span class="n">qp6</span></div>
<div class="viewcode-block" id="disk_nm"><a class="viewcode-back" href="../../../pylib.numerical.ode_model.html#pylib.numerical.ode_model.disk_nm">[docs]</a><span class="k">def</span> <span class="nf">disk_nm</span><span class="p">(</span><span class="n">xn</span><span class="p">,</span> <span class="n">xpn</span><span class="p">,</span> <span class="n">xppn</span><span class="p">,</span> <span class="n">t</span><span class="p">,</span> <span class="o">*</span><span class="n">p</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Rotation of an eccentric disk.</span>
<span class="sd"> :param xn: values of the function</span>
<span class="sd"> :type xn: list</span>
<span class="sd"> :param xpn: first derivative values of the function</span>
<span class="sd"> :type xpn: list</span>
<span class="sd"> :param xppn: second derivative values of the function</span>
<span class="sd"> :type xppn: list</span>
<span class="sd"> :param t: time</span>
<span class="sd"> :type t: list</span>
<span class="sd"> :param `*p`: parameters of the function</span>
<span class="sd"> * diameter</span>
<span class="sd"> * eccentricity</span>
<span class="sd"> * torque</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">N</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="n">xppn</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xppn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">+</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">-</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">square</span><span class="p">(</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">+</span><span class="n">xn</span><span class="p">[</span><span class="mi">0</span><span class="p">]],</span>
<span class="p">[</span><span class="n">xppn</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xppn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">+</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">-</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">square</span><span class="p">(</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">+</span><span class="n">xn</span><span class="p">[</span><span class="mi">1</span><span class="p">]],</span>
<span class="p">[</span><span class="n">xppn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">+</span><span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="p">(</span><span class="o">-</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xn</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xn</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span><span class="o">-</span><span class="n">p</span><span class="p">[</span><span class="mi">2</span><span class="p">]]])</span>
<span class="n">dN</span> <span class="o">=</span> <span class="n">array</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="o">-</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">*</span><span class="n">xppn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">-</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">square</span><span class="p">(</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</span>
<span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">*</span><span class="n">xppn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">+</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">square</span><span class="p">(</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</span>
<span class="p">[</span><span class="o">-</span><span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">]),</span> <span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">]),</span> <span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="p">(</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xn</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xn</span><span class="p">[</span><span class="mi">1</span><span class="p">])]])</span>
<span class="n">dNp</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="mi">2</span><span class="o">*</span><span class="n">p</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="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</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">p</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]],</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="mi">0</span><span class="p">]])</span>
<span class="n">dNpp</span> <span class="o">=</span> <span class="n">array</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="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</span>
<span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</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="mi">1</span><span class="p">]])</span>
<span class="k">return</span> <span class="n">N</span><span class="p">,</span> <span class="n">dN</span><span class="p">,</span> <span class="n">dNp</span><span class="p">,</span> <span class="n">dNpp</span></div>
<div class="viewcode-block" id="disk_nmmdk"><a class="viewcode-back" href="../../../pylib.numerical.ode_model.html#pylib.numerical.ode_model.disk_nmmdk">[docs]</a><span class="k">def</span> <span class="nf">disk_nmmdk</span><span class="p">(</span><span class="n">xn</span><span class="p">,</span> <span class="n">xpn</span><span class="p">,</span> <span class="n">xppn</span><span class="p">,</span> <span class="n">t</span><span class="p">,</span> <span class="o">*</span><span class="n">p</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Rotation of an eccentric disk.</span>
<span class="sd"> :param xn: values of the function</span>
<span class="sd"> :type xn: list</span>
<span class="sd"> :param xpn: derivative values of the function</span>
<span class="sd"> :type xpn: list</span>
<span class="sd"> :param xppn: second derivative values of the function</span>
<span class="sd"> :type xppn: list</span>
<span class="sd"> :param t: time</span>
<span class="sd"> :type t: list</span>
<span class="sd"> :param `*p`: parameters of the function</span>
<span class="sd"> * diameter</span>
<span class="sd"> * eccentricity</span>
<span class="sd"> * torque</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">rm</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="n">xppn</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xppn</span><span class="p">[</span><span class="mi">2</span><span class="p">]],</span>
<span class="p">[</span><span class="n">xppn</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xppn</span><span class="p">[</span><span class="mi">2</span><span class="p">]],</span>
<span class="p">[</span><span class="n">xppn</span><span class="p">[</span><span class="mi">2</span><span class="p">]]])</span>
<span class="n">rmx</span> <span class="o">=</span> <span class="n">array</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="o">-</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">*</span><span class="n">xppn</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</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="o">-</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">*</span><span class="n">xppn</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</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="mi">0</span><span class="p">]])</span>
<span class="n">rmxpp</span> <span class="o">=</span> <span class="n">array</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="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</span>
<span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</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="mi">1</span><span class="p">]])</span>
<span class="n">rd</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">-</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">square</span><span class="p">(</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</span>
<span class="p">[</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">-</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">square</span><span class="p">(</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</span>
<span class="p">[</span><span class="mi">0</span><span class="p">]])</span>
<span class="n">rdx</span> <span class="o">=</span> <span class="n">array</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="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">-</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">square</span><span class="p">(</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</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="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">+</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">square</span><span class="p">(</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</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="mi">0</span><span class="p">]])</span>
<span class="n">rdxp</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="mi">2</span><span class="o">*</span><span class="n">p</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="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</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">p</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]],</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="mi">0</span><span class="p">]])</span>
<span class="n">rk</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="n">xn</span><span class="p">[</span><span class="mi">0</span><span class="p">]],</span>
<span class="p">[</span><span class="n">xn</span><span class="p">[</span><span class="mi">1</span><span class="p">]],</span>
<span class="p">[</span><span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="p">(</span><span class="o">-</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xn</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xn</span><span class="p">[</span><span class="mi">1</span><span class="p">])]])</span>
<span class="n">rkx</span> <span class="o">=</span> <span class="n">array</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="p">[</span> <span class="mi">0</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="p">[</span><span class="o">-</span><span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">]),</span> <span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">]),</span> <span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="p">(</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xn</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xn</span><span class="p">[</span><span class="mi">1</span><span class="p">])]])</span>
<span class="n">f</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="n">p</span><span class="p">[</span><span class="mi">2</span><span class="p">]]])</span>
<span class="k">return</span> <span class="n">rm</span><span class="p">,</span> <span class="n">rmx</span><span class="p">,</span> <span class="n">rmxpp</span><span class="p">,</span> <span class="n">rd</span><span class="p">,</span> <span class="n">rdx</span><span class="p">,</span> <span class="n">rdxp</span><span class="p">,</span> <span class="n">rk</span><span class="p">,</span> <span class="n">rkx</span><span class="p">,</span> <span class="n">f</span></div>
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">&#39;__main__&#39;</span><span class="p">:</span>
<span class="kc">True</span>
<span class="n">p</span> <span class="o">=</span> <span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="n">e</span><span class="p">,</span> <span class="n">T</span><span class="p">)</span>
<span class="k">if</span> <span class="n">method</span> <span class="o">==</span> <span class="s1">&#39;&#39;</span><span class="p">:</span>
<span class="k">def</span> <span class="nf">f</span><span class="p">(</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">xp1</span> <span class="o">=</span> <span class="n">x</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span>
<span class="n">xp2</span> <span class="o">=</span> <span class="n">x</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span>
<span class="n">xp3</span> <span class="o">=</span> <span class="n">x</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span>
<span class="n">M</span> <span class="o">=</span> <span class="n">array</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="n">cos</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="n">sin</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</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="mi">1</span><span class="p">]])</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">x</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span><span class="o">+</span><span class="n">sin</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">x</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span><span class="o">**</span><span class="mi">2</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">x</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span><span class="o">-</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]],</span> \
<span class="p">[</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">x</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span><span class="o">+</span><span class="n">cos</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">x</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span><span class="o">**</span><span class="mi">2</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">x</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span><span class="o">-</span><span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">]],</span> \
<span class="p">[</span><span class="n">p</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">-</span><span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">+</span><span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">2</span><span class="p">])]])</span>
<span class="n">xp46</span> <span class="o">=</span> <span class="n">dot</span><span class="p">(</span><span class="n">inv</span><span class="p">(</span><span class="n">M</span><span class="p">),</span> <span class="n">y</span><span class="p">)</span>
<span class="n">xp4</span><span class="p">,</span> <span class="n">xp5</span><span class="p">,</span> <span class="n">xp6</span> <span class="o">=</span> <span class="n">xp46</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,)</span><span class="o">.</span><span class="n">tolist</span><span class="p">()</span> <span class="c1"># 2d array to 1d array to list</span>
<span class="k">return</span> <span class="n">xp1</span><span class="p">,</span> <span class="n">xp2</span><span class="p">,</span> <span class="n">xp3</span><span class="p">,</span> <span class="n">xp4</span><span class="p">,</span> <span class="n">xp5</span><span class="p">,</span> <span class="n">xp6</span>
<span class="k">elif</span> <span class="n">method</span> <span class="o">==</span> <span class="s1">&#39;nm&#39;</span><span class="p">:</span>
<span class="k">def</span> <span class="nf">f</span><span class="p">(</span><span class="n">xn</span><span class="p">,</span> <span class="n">xpn</span><span class="p">,</span> <span class="n">xppn</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">N</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="n">xppn</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xppn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">+</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">-</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">square</span><span class="p">(</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">+</span><span class="n">xn</span><span class="p">[</span><span class="mi">0</span><span class="p">]],</span>
<span class="p">[</span><span class="n">xppn</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xppn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">+</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">-</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">square</span><span class="p">(</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">+</span><span class="n">xn</span><span class="p">[</span><span class="mi">1</span><span class="p">]],</span>
<span class="p">[</span><span class="n">xppn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">+</span><span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="p">(</span><span class="o">-</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xn</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xn</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span><span class="o">-</span><span class="n">p</span><span class="p">[</span><span class="mi">2</span><span class="p">]]])</span>
<span class="n">dN</span> <span class="o">=</span> <span class="n">array</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="o">-</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">*</span><span class="n">xppn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">-</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">square</span><span class="p">(</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</span>
<span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">*</span><span class="n">xppn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">+</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">square</span><span class="p">(</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</span>
<span class="p">[</span><span class="o">-</span><span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">]),</span> <span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">]),</span> <span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="p">(</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xn</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xn</span><span class="p">[</span><span class="mi">1</span><span class="p">])]])</span>
<span class="n">dNp</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="mi">2</span><span class="o">*</span><span class="n">p</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="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</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">p</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]],</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="mi">0</span><span class="p">]])</span>
<span class="n">dNpp</span> <span class="o">=</span> <span class="n">array</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="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</span>
<span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</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="mi">1</span><span class="p">]])</span>
<span class="k">return</span> <span class="n">N</span><span class="p">,</span> <span class="n">dN</span><span class="p">,</span> <span class="n">dNp</span><span class="p">,</span> <span class="n">dNpp</span>
<span class="k">elif</span> <span class="n">method</span> <span class="o">==</span> <span class="s1">&#39;nmmdk&#39;</span><span class="p">:</span>
<span class="k">def</span> <span class="nf">f</span><span class="p">(</span><span class="n">xn</span><span class="p">,</span> <span class="n">xpn</span><span class="p">,</span> <span class="n">xppn</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">rm</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="n">xppn</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xppn</span><span class="p">[</span><span class="mi">2</span><span class="p">]],</span>
<span class="p">[</span><span class="n">xppn</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xppn</span><span class="p">[</span><span class="mi">2</span><span class="p">]],</span>
<span class="p">[</span><span class="n">xppn</span><span class="p">[</span><span class="mi">2</span><span class="p">]]])</span>
<span class="n">rmx</span> <span class="o">=</span> <span class="n">array</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="o">-</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">*</span><span class="n">xppn</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</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="o">-</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">*</span><span class="n">xppn</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</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="mi">0</span><span class="p">]])</span>
<span class="n">rmxpp</span> <span class="o">=</span> <span class="n">array</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="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</span>
<span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</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="mi">1</span><span class="p">]])</span>
<span class="n">rd</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">-</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">square</span><span class="p">(</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</span>
<span class="p">[</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">-</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">square</span><span class="p">(</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</span>
<span class="p">[</span><span class="mi">0</span><span class="p">]])</span>
<span class="n">rdx</span> <span class="o">=</span> <span class="n">array</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="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">-</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">square</span><span class="p">(</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</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="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">+</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">square</span><span class="p">(</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">])],</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="mi">0</span><span class="p">]])</span>
<span class="n">rdxp</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="mi">2</span><span class="o">*</span><span class="n">p</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="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</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">p</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xpn</span><span class="p">[</span><span class="mi">2</span><span class="p">]],</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="mi">0</span><span class="p">]])</span>
<span class="n">rk</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="n">xn</span><span class="p">[</span><span class="mi">0</span><span class="p">]],</span>
<span class="p">[</span><span class="n">xn</span><span class="p">[</span><span class="mi">1</span><span class="p">]],</span>
<span class="p">[</span><span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="p">(</span><span class="o">-</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xn</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xn</span><span class="p">[</span><span class="mi">1</span><span class="p">])]])</span>
<span class="n">rkx</span> <span class="o">=</span> <span class="n">array</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="p">[</span> <span class="mi">0</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="p">[</span><span class="o">-</span><span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">]),</span> <span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">]),</span> <span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="p">(</span><span class="n">sin</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xn</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="n">cos</span><span class="p">(</span><span class="n">xn</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">*</span><span class="n">xn</span><span class="p">[</span><span class="mi">1</span><span class="p">])]])</span>
<span class="n">f</span> <span class="o">=</span> <span class="n">array</span><span class="p">([[</span><span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="n">p</span><span class="p">[</span><span class="mi">2</span><span class="p">]]])</span>
<span class="k">return</span> <span class="n">rm</span><span class="p">,</span> <span class="n">rmx</span><span class="p">,</span> <span class="n">rmxpp</span><span class="p">,</span> <span class="n">rd</span><span class="p">,</span> <span class="n">rdx</span><span class="p">,</span> <span class="n">rdxp</span><span class="p">,</span> <span class="n">rk</span><span class="p">,</span> <span class="n">rkx</span><span class="p">,</span> <span class="n">f</span>
<span class="k">return</span> <span class="n">f</span></div>
</pre></div>
</div>