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.
426 lines
13 KiB
Python
426 lines
13 KiB
Python
"""Test of mathematics module.
|
|
|
|
:Date: 2019-12-20
|
|
|
|
.. module:: test_mathematics
|
|
:platform: *nix, Windows
|
|
:synopsis: Test of mathematics module.
|
|
|
|
.. moduleauthor:: Daniel Weschke <daniel.weschke@directbox.de>
|
|
"""
|
|
import unittest
|
|
|
|
import os
|
|
import sys
|
|
sys.path.insert(0, os.path.abspath('..'))
|
|
|
|
import math
|
|
from pylib.mathematics import vector, matrix
|
|
|
|
class TestGeometry(unittest.TestCase):
|
|
|
|
#
|
|
# vector
|
|
# NOTE: vector: scalar != 1 element vector
|
|
#
|
|
|
|
def test_vector(self):
|
|
self.assertEqual(
|
|
vector(),
|
|
[])
|
|
self.assertEqual(
|
|
vector([1, 0, 0, 1]),
|
|
[1, 0, 0, 1])
|
|
|
|
def test_vector_mul_vs(self):
|
|
self.assertEqual(
|
|
vector([1, 2, 3]) * 4,
|
|
[4, 8, 12])
|
|
self.assertEqual(
|
|
vector([-1, -2, -3]) * 4,
|
|
[-4, -8, -12])
|
|
self.assertEqual(
|
|
vector([1, 2, 3]) * -4,
|
|
[-4, -8, -12])
|
|
self.assertEqual(
|
|
vector([-1, -2, -3]) * -4,
|
|
[4, 8, 12])
|
|
|
|
def test_vector_mul_vv(self):
|
|
self.assertEqual(
|
|
vector([1, 2, 3]) * vector([1, 2, 3]),
|
|
14)
|
|
self.assertEqual(
|
|
vector([-1, -2, -3]) * vector([1, 2, 3]),
|
|
-14)
|
|
self.assertEqual(
|
|
vector([1, 2, 3]) * vector([-1, -2, -3]),
|
|
-14)
|
|
self.assertEqual(
|
|
vector([-1, -2, -3]) * vector([-1, -2, -3]),
|
|
14)
|
|
|
|
def test_vector_mul_vm(self):
|
|
r"""
|
|
.. math::
|
|
&
|
|
\begin{bmatrix}
|
|
1 & 2 & 3
|
|
\end{bmatrix}
|
|
\cdot
|
|
\begin{bmatrix}
|
|
1 & 2 & 3 \\
|
|
4 & 5 & 6 \\
|
|
7 & 8 & 9
|
|
\end{bmatrix}
|
|
\\
|
|
=&
|
|
\begin{bmatrix}
|
|
1+8+21 & 2+10+24 & 3+12+27
|
|
\end{bmatrix}
|
|
\\
|
|
=&
|
|
\begin{bmatrix}
|
|
30 & 36 & 42
|
|
\end{bmatrix}
|
|
"""
|
|
self.assertEqual(
|
|
vector([1, 2, 3]) * matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
|
|
[30, 36, 42])
|
|
self.assertEqual(
|
|
vector([-1, -2, -3]) * matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
|
|
[-30, -36, -42])
|
|
self.assertEqual(
|
|
vector([1, 2, 3]) * matrix([[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]]),
|
|
[-30, -36, -42])
|
|
self.assertEqual(
|
|
vector([-1, -2, -3]) * matrix([[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]]),
|
|
[30, 36, 42])
|
|
|
|
def test_vector_rmul_sv(self):
|
|
self.assertEqual(
|
|
4 * vector([1, 2, 3]),
|
|
[4, 8, 12])
|
|
self.assertEqual(
|
|
-4 * vector([1, 2, 3]),
|
|
[-4, -8, -12])
|
|
self.assertEqual(
|
|
4 * vector([-1, -2, -3]),
|
|
[-4, -8, -12])
|
|
self.assertEqual(
|
|
-4 * vector([-1, -2, -3]),
|
|
[4, 8, 12])
|
|
|
|
def test_vector_rmul_mv(self):
|
|
# 2d list * vector, matrix * vector see matrix.__mul__
|
|
self.assertEqual(
|
|
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] * vector([1, 2, 3]),
|
|
[14, 32, 50])
|
|
self.assertEqual(
|
|
[[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]] * vector([1, 2, 3]),
|
|
[-14, -32, -50])
|
|
self.assertEqual(
|
|
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] * vector([-1, -2, -3]),
|
|
[-14, -32, -50])
|
|
self.assertEqual(
|
|
[[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]] * vector([-1, -2, -3]),
|
|
[14, 32, 50])
|
|
|
|
def test_vector_abs(self):
|
|
self.assertEqual(
|
|
abs(vector([0.6, 0.8])),
|
|
1)
|
|
self.assertEqual(
|
|
abs(vector([3, 4])),
|
|
5)
|
|
|
|
def test_vector_full(self):
|
|
self.assertEqual(
|
|
vector.full(3, 7),
|
|
[7, 7, 7])
|
|
|
|
def test_vector_zeros(self):
|
|
self.assertEqual(
|
|
vector.zeros(3),
|
|
[0, 0, 0])
|
|
self.assertEqual(
|
|
vector.zeros((3)),
|
|
[0, 0, 0])
|
|
self.assertEqual(
|
|
vector.zeros(-1),
|
|
[])
|
|
|
|
def test_vector_ones(self):
|
|
self.assertEqual(
|
|
vector.ones(3),
|
|
[1, 1, 1])
|
|
self.assertEqual(
|
|
vector.ones((3)),
|
|
[1, 1, 1])
|
|
self.assertEqual(
|
|
vector.ones(-1),
|
|
[])
|
|
|
|
def test_vector_random(self):
|
|
obj = vector.random(3)
|
|
self.assertEqual(
|
|
len(obj),
|
|
3)
|
|
|
|
def test_vector_ang(self):
|
|
a = vector([1, 0])
|
|
b = vector([0, 1])
|
|
print(vector.ang(a,b), vector.ang(b, a))
|
|
self.assertEqual(
|
|
vector.ang(a, b),
|
|
math.pi/2)
|
|
self.assertEqual(
|
|
vector.ang(b, a),
|
|
math.pi/2)
|
|
|
|
def test_vector_normalized(self):
|
|
v1 = vector([3, 4])
|
|
v2 = vector.normalized(v1)
|
|
self.assertEqual(
|
|
v2,
|
|
[0.6, 0.8])
|
|
self.assertEqual(
|
|
abs(v2),
|
|
1)
|
|
self.assertEqual(
|
|
v1,
|
|
[3, 4])
|
|
|
|
def test_vector_normalize(self):
|
|
v1 = vector([3, 4])
|
|
v2 = v1.normalize()
|
|
self.assertEqual(
|
|
v2,
|
|
[0.6, 0.8])
|
|
self.assertEqual(
|
|
abs(v2),
|
|
1)
|
|
self.assertEqual(
|
|
v1,
|
|
[0.6, 0.8])
|
|
|
|
def test_vector_rotate_x(self):
|
|
# rotation of vector coordinate system about x axis
|
|
|
|
# vector points to x -> vector points to x still
|
|
self.assertEqual( vector([1, 0, 0, 1]).rotate_x(math.pi/2), [1, 0, 0, 1])
|
|
# vector points to y -> vector points to -z
|
|
[self.assertAlmostEqual(i, j) for i, j in zip(vector([0, 1, 0, 1]).rotate_x(math.pi/2), [0, 0, 1, 1])]
|
|
# vector points to z -> vector points to y
|
|
[self.assertAlmostEqual(i, j) for i, j in zip(vector([0, 0, 1, 1]).rotate_x(math.pi/2), [0, -1, 0, 1])]
|
|
|
|
def test_vector_rotate_y(self):
|
|
# rotation of vector coordinate system about y axis
|
|
|
|
# vector points to x ->, vector points to z
|
|
[self.assertAlmostEqual(i, j) for i, j in zip(vector([1, 0, 0, 1]).rotate_y(math.pi/2), [0, 0, -1, 1])]
|
|
# vector points to y -> vector points to y still
|
|
self.assertEqual( vector([0, 1, 0, 1]).rotate_y(math.pi/2), [0, 1, 0, 1])
|
|
# vector points to z -> vector points to -x
|
|
[self.assertAlmostEqual(i, j) for i, j in zip(vector([0, 0, 1, 1]).rotate_y(math.pi/2), [1, 0, 0, 1])]
|
|
|
|
def test_vector_rotate_z(self):
|
|
# rotation of vector coordinate system about z axis
|
|
|
|
# vector points to x ->, vector points to z
|
|
[self.assertAlmostEqual(i, j) for i, j in zip(vector([1, 0, 0, 1]).rotate_z(math.pi/2), [0, 1, 0, 1])]
|
|
# vector points to y -> vector points to
|
|
[self.assertAlmostEqual(i, j) for i, j in zip(vector([0, 1, 0, 1]).rotate_z(math.pi/2), [-1, 0, 0, 1])]
|
|
# vector points to z -> vector points to z still
|
|
self.assertEqual( vector([0, 0, 1, 1]).rotate_z(math.pi/2), [0, 0, 1, 1])
|
|
|
|
#
|
|
# matrix
|
|
# NOTE: matrix: scalar != 1x1 matrix
|
|
#
|
|
|
|
def test_matrix_mul_ms(self):
|
|
self.assertEqual(
|
|
matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) * 4,
|
|
[[4, 8, 12], [16, 20, 24], [28, 32, 36]])
|
|
self.assertEqual(
|
|
matrix([[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]]) * 4,
|
|
[[-4, -8, -12], [-16, -20, -24], [-28, -32, -36]])
|
|
self.assertEqual(
|
|
matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) * -4,
|
|
[[-4, -8, -12], [-16, -20, -24], [-28, -32, -36]])
|
|
self.assertEqual(
|
|
matrix([[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]]) * -4,
|
|
[[4, 8, 12], [16, 20, 24], [28, 32, 36]])
|
|
|
|
def test_matrix_mul_mv(self):
|
|
r"""
|
|
.. math::
|
|
\begin{bmatrix}
|
|
1 & 2 & 3 \\
|
|
4 & 5 & 6 \\
|
|
7 & 8 & 9
|
|
\end{bmatrix}
|
|
\cdot
|
|
\begin{bmatrix}
|
|
1 \\
|
|
2 \\
|
|
3
|
|
\end{bmatrix}
|
|
=
|
|
\begin{bmatrix}
|
|
1+4+9 \\
|
|
4+10+18 \\
|
|
7+16+27
|
|
\end{bmatrix}
|
|
=
|
|
\begin{bmatrix}
|
|
14 \\
|
|
32 \\
|
|
50
|
|
\end{bmatrix}
|
|
"""
|
|
self.assertEqual(
|
|
matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) * vector([1, 2, 3]),
|
|
[14, 32, 50])
|
|
self.assertEqual(
|
|
matrix([[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]]) * vector([1, 2, 3]),
|
|
[-14, -32, -50])
|
|
self.assertEqual(
|
|
matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) * vector([-1, -2, -3]),
|
|
[-14, -32, -50])
|
|
self.assertEqual(
|
|
matrix([[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]]) * vector([-1, -2, -3]),
|
|
[14, 32, 50])
|
|
|
|
self.assertEqual(
|
|
matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) * matrix([[1], [2], [3]]),
|
|
[[14], [32], [50]])
|
|
self.assertEqual(
|
|
matrix([[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]]) * matrix([[1], [2], [3]]),
|
|
[[-14], [-32], [-50]])
|
|
self.assertEqual(
|
|
matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) * matrix([[-1], [-2], [-3]]),
|
|
[[-14], [-32], [-50]])
|
|
self.assertEqual(
|
|
matrix([[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]]) * matrix([[-1], [-2], [-3]]),
|
|
[[14], [32], [50]])
|
|
|
|
def test_matrix_mul_vm(self):
|
|
# matrix-vector * matrix, vector * matrix see vector.__mul__
|
|
self.assertEqual(
|
|
matrix([[1, 2, 3]]) * matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
|
|
[[30, 36, 42]])
|
|
self.assertEqual(
|
|
matrix([[-1, -2, -3]]) * matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
|
|
[[-30, -36, -42]])
|
|
self.assertEqual(
|
|
matrix([[1, 2, 3]]) * matrix([[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]]),
|
|
[[-30, -36, -42]])
|
|
self.assertEqual(
|
|
matrix([[-1, -2, -3]]) * matrix([[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]]),
|
|
[[30, 36, 42]])
|
|
|
|
def test_matrix_mul_mm(self):
|
|
r"""
|
|
.. math::
|
|
&
|
|
\begin{bmatrix}
|
|
1 & 2 & 3 \\
|
|
4 & 5 & 6 \\
|
|
7 & 8 & 9
|
|
\end{bmatrix}
|
|
\cdot
|
|
\begin{bmatrix}
|
|
11 & 12 & 13 \\
|
|
14 & 15 & 16 \\
|
|
17 & 18 & 19
|
|
\end{bmatrix}
|
|
\\
|
|
=&
|
|
\begin{bmatrix}
|
|
11+28+51 & 12+30+54 & 13+32+57 \\
|
|
44+70+102 & 48+75+108 & 52+80+114 \\
|
|
77+112+153 & 84+120+162 & 91+128+171
|
|
\end{bmatrix}
|
|
\\
|
|
=&
|
|
\begin{bmatrix}
|
|
90 & 96 & 102 \\
|
|
216 & 231 & 246 \\
|
|
342 & 366 & 390
|
|
\end{bmatrix}
|
|
|
|
interesting
|
|
|
|
.. math::
|
|
90 \xrightarrow{+6} 96 \xrightarrow{+6} 102 \quad &\Big| \sum\{1, 2, 3\} = 6 \\
|
|
216 \xrightarrow{+15} 231 \xrightarrow{+15} 246 \quad &\Big| \sum\{4, 5, 6\} = 15 \\
|
|
342 \xrightarrow{+24} 366 \xrightarrow{+24} 390 \quad &\Big| \sum\{7, 8, 9\} = 24
|
|
|
|
.. math::
|
|
90 \xrightarrow{+126} 216 \xrightarrow{+126} 342 \quad &\Big| \sum\{11, 14, 17\} = 42 = 126/3 \\
|
|
96 \xrightarrow{+135} 231 \xrightarrow{+135} 366 \quad &\Big| \sum\{12, 15, 18\} = 45 = 135/3 \\
|
|
102 \xrightarrow{+144} 246 \xrightarrow{+144} 390 \quad &\Big| \sum\{13, 16, 19\} = 48 = 144/3
|
|
"""
|
|
self.assertEqual(
|
|
matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) * matrix([[11, 12, 13], [14, 15, 16], [17, 18, 19]]),
|
|
[[90, 96, 102], [216, 231, 246], [342, 366, 390]])
|
|
self.assertEqual(
|
|
matrix([[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]]) * matrix([[11, 12, 13], [14, 15, 16], [17, 18, 19]]),
|
|
[[-90, -96, -102], [-216, -231, -246], [-342, -366, -390]])
|
|
self.assertEqual(
|
|
matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) * matrix([[-11, -12, -13], [-14, -15, -16], [-17, -18, -19]]),
|
|
[[-90, -96, -102], [-216, -231, -246], [-342, -366, -390]])
|
|
self.assertEqual(
|
|
matrix([[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]]) * matrix([[-11, -12, -13], [-14, -15, -16], [-17, -18, -19]]),
|
|
[[90, 96, 102], [216, 231, 246], [342, 366, 390]])
|
|
|
|
def test_matrix_rmul_sm(self):
|
|
self.assertEqual(
|
|
4 * matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
|
|
[[4, 8, 12], [16, 20, 24], [28, 32, 36]])
|
|
self.assertEqual(
|
|
-4 * matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
|
|
[[-4, -8, -12], [-16, -20, -24], [-28, -32, -36]])
|
|
self.assertEqual(
|
|
4 * matrix([[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]]),
|
|
[[-4, -8, -12], [-16, -20, -24], [-28, -32, -36]])
|
|
self.assertEqual(
|
|
-4 * matrix([[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]]),
|
|
[[4, 8, 12], [16, 20, 24], [28, 32, 36]])
|
|
|
|
def test_matrix_rmul_vm(self):
|
|
# 1d list * matrix, vector * matrix see vector.__mul__
|
|
self.assertEqual(
|
|
[1, 2, 3] * matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
|
|
[30, 36, 42])
|
|
self.assertEqual(
|
|
[-1, -2, -3] * matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
|
|
[-30, -36, -42])
|
|
self.assertEqual(
|
|
[1, 2, 3] * matrix([[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]]),
|
|
[-30, -36, -42])
|
|
self.assertEqual(
|
|
[-1, -2, -3] * matrix([[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]]),
|
|
[30, 36, 42])
|
|
|
|
def test_matrix_rmul_mm(self):
|
|
# 2d list * matrix, matrix * matrix see matrix.__mul__
|
|
self.assertEqual(
|
|
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] * matrix([[11, 12, 13], [14, 15, 16], [17, 18, 19]]),
|
|
[[90, 96, 102], [216, 231, 246], [342, 366, 390]])
|
|
self.assertEqual(
|
|
[[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]] * matrix([[11, 12, 13], [14, 15, 16], [17, 18, 19]]),
|
|
[[-90, -96, -102], [-216, -231, -246], [-342, -366, -390]])
|
|
self.assertEqual(
|
|
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] * matrix([[-11, -12, -13], [-14, -15, -16], [-17, -18, -19]]),
|
|
[[-90, -96, -102], [-216, -231, -246], [-342, -366, -390]])
|
|
self.assertEqual(
|
|
[[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]] * matrix([[-11, -12, -13], [-14, -15, -16], [-17, -18, -19]]),
|
|
[[90, 96, 102], [216, 231, 246], [342, 366, 390]])
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main(verbosity=2)
|