rational-linkages 2.1.0__cp312-cp312-win_arm64.whl → 2.2.3__cp312-cp312-win_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,7 +2,6 @@ from copy import deepcopy
2
2
 
3
3
  import numpy as np
4
4
  import sympy as sp
5
- from sympy.integrals.quadrature import gauss_legendre
6
5
 
7
6
  from .DualQuaternion import DualQuaternion
8
7
  from .MiniBall import MiniBall
@@ -93,7 +92,7 @@ class RationalBezier(RationalCurve):
93
92
  """
94
93
  Get the numerical coefficients of the Bezier curve
95
94
  """
96
- from scipy.special import comb # INNER IMPORT
95
+ from scipy.special import comb # lazy import
97
96
 
98
97
  control_pts = np.array([point.array() for point in control_points])
99
98
  degree = len(control_points) - 1
@@ -210,7 +209,7 @@ class BezierSegment:
210
209
 
211
210
  @metric.setter
212
211
  def metric(self, metric: "AffineMetric"):
213
- from .AffineMetric import AffineMetric # inner import
212
+ from .AffineMetric import AffineMetric # lazy import
214
213
 
215
214
  if isinstance(metric, AffineMetric):
216
215
  self._metric = metric
@@ -3,7 +3,6 @@ from typing import Union
3
3
 
4
4
  import numpy as np
5
5
  import sympy as sp
6
- from scipy.integrate import quad
7
6
 
8
7
  from .DualQuaternion import DualQuaternion
9
8
  from .PointHomogeneous import PointHomogeneous
@@ -136,7 +135,7 @@ class RationalCurve:
136
135
 
137
136
  @metric.setter
138
137
  def metric(self, metric: "AffineMetric"):
139
- from .AffineMetric import AffineMetric # inner import
138
+ from .AffineMetric import AffineMetric # lazy import
140
139
 
141
140
  if isinstance(metric, AffineMetric):
142
141
  self._metric = metric
@@ -573,7 +572,7 @@ class RationalCurve:
573
572
  if not self.is_motion:
574
573
  raise ValueError("Not a motion curve, cannot split into Bezier curves.")
575
574
 
576
- from .RationalBezier import BezierSegment # inner import
575
+ from .RationalBezier import BezierSegment # lazy import
577
576
 
578
577
  curve = self.get_curve_in_pr12()
579
578
 
@@ -657,6 +656,11 @@ class RationalCurve:
657
656
  :raises ValueError: if the interval values are identical
658
657
  :raises ValueError: if the number of segments is less than 1
659
658
  """
659
+ try:
660
+ from scipy.integrate import quad # lazy import
661
+ except ImportError:
662
+ raise RuntimeError("Scipy import failed. Check the package installation.")
663
+
660
664
  if interval[0] > interval[1]:
661
665
  raise ValueError("The interval must be in the form [a, b] where a < b")
662
666
  elif interval[0] == interval[1]:
@@ -708,6 +712,11 @@ class RationalCurve:
708
712
  :return: t value that splits the curve into given segment length
709
713
  :rtype: float
710
714
  """
715
+ try:
716
+ from scipy.integrate import quad # lazy import
717
+ except ImportError:
718
+ raise RuntimeError("Scipy import failed. Check the package installation.")
719
+
711
720
  # initial lower and upper bounds
712
721
  low = section_start
713
722
  high = curve_interval[1] # start with the upper bound
@@ -1,5 +1,6 @@
1
1
  import numpy as np
2
- import sympy as sp
2
+
3
+ from sympy import Rational
3
4
 
4
5
  from .DualQuaternion import DualQuaternion
5
6
 
@@ -12,7 +13,7 @@ class RationalDualQuaternion(DualQuaternion):
12
13
  """
13
14
  RationalDualQuaternion class representing a 8-dimensional dual quaternion.
14
15
  """
15
- def __init__(self, study_parameters: list[sp.Rational]):
16
+ def __init__(self, study_parameters: list[Rational]):
16
17
  """
17
18
  RationalDualQuaternion class
18
19
 
@@ -34,7 +35,7 @@ class RationalDualQuaternion(DualQuaternion):
34
35
  """
35
36
  return f"{self.rational_numbers}"
36
37
 
37
- def __getitem__(self, idx) -> sp.Rational:
38
+ def __getitem__(self, idx) -> Rational:
38
39
  """
39
40
  Get an element of DualQuaternion
40
41
 
@@ -50,6 +51,6 @@ class RationalDualQuaternion(DualQuaternion):
50
51
  Get the array of the rational numbers
51
52
 
52
53
  :return: Rational numbers
53
- :rtype: sp.Matrix
54
+ :rtype: sympy.Matrix
54
55
  """
55
56
  return np.array(self.rational_numbers)
@@ -110,7 +110,7 @@ class RationalMechanism(RationalCurve):
110
110
  This metric is used for collision detection.
111
111
  """
112
112
  if self._metric is None:
113
- from .AffineMetric import AffineMetric # inner import
113
+ from .AffineMetric import AffineMetric # lazy import
114
114
  mechanism_points = self.points_at_parameter(0,
115
115
  inverted_part=True,
116
116
  only_links=False)
@@ -400,7 +400,7 @@ class RationalMechanism(RationalCurve):
400
400
  :return: list of TransfMatrix objects
401
401
  :rtype: list[TransfMatrix]
402
402
  """
403
- from .TransfMatrix import TransfMatrix # inner import
403
+ from .TransfMatrix import TransfMatrix # lazy import
404
404
 
405
405
  screws = deepcopy(self.get_screw_axes())
406
406
 
@@ -942,7 +942,7 @@ class RationalMechanism(RationalCurve):
942
942
  """
943
943
  Perform singularity check of the mechanism.
944
944
  """
945
- from .SingularityAnalysis import SingularityAnalysis # inner import
945
+ from .SingularityAnalysis import SingularityAnalysis # lazy import
946
946
 
947
947
  sa = SingularityAnalysis()
948
948
  return sa.check_singularity(self)
@@ -957,7 +957,7 @@ class RationalMechanism(RationalCurve):
957
957
  result of the optimization
958
958
  :rtype: list, list, float
959
959
  """
960
- from .CollisionFreeOptimization import CollisionFreeOptimization # inner import
960
+ from .CollisionFreeOptimization import CollisionFreeOptimization # lazy import
961
961
 
962
962
  # get smallest polyline
963
963
  pts, points_params, res = CollisionFreeOptimization(self).smallest_polyline()
@@ -1,4 +1,4 @@
1
- import sympy
1
+ from sympy import Matrix
2
2
 
3
3
  from .Linkage import LineSegment
4
4
  from .RationalMechanism import RationalMechanism
@@ -49,8 +49,7 @@ class SingularityAnalysis:
49
49
  # normalization
50
50
 
51
51
 
52
-
53
- jacobian = sympy.Matrix.zeros(6, len(algebraic_plucker_coords))
52
+ jacobian = Matrix.zeros(6, len(algebraic_plucker_coords))
54
53
  for i, plucker_line in enumerate(algebraic_plucker_coords):
55
54
  jacobian[:, i] = plucker_line.screw
56
55
 
@@ -13,7 +13,7 @@ def dq_algebraic2vector(ugly_expression: list) -> list:
13
13
  :return: 8-vector representation of the algebraic equation
14
14
  :rtype: list
15
15
  """
16
- from sympy import expand, symbols # inner import
16
+ from sympy import expand, symbols # lazy import
17
17
  i, j, k, epsilon = symbols('i j k epsilon')
18
18
 
19
19
  expr = expand(ugly_expression)
@@ -41,7 +41,7 @@ def extract_coeffs(expr, var, deg: int, expand: bool = True):
41
41
  :rtype: list
42
42
  """
43
43
  if expand:
44
- from sympy import expand # inner import
44
+ from sympy import expand # lazy import
45
45
  expr = expand(expr)
46
46
  return [expr.coeff(var, i) for i in range(deg, -1, -1)]
47
47
 
@@ -97,10 +97,67 @@ def is_package_installed(package_name: str) -> bool:
97
97
  """
98
98
  Check if a package is installed.
99
99
  """
100
- from importlib.metadata import distribution
100
+ from importlib.metadata import distribution # lazy import
101
101
 
102
102
  try:
103
103
  distribution(package_name)
104
104
  return True
105
105
  except ImportError:
106
106
  return False
107
+
108
+
109
+ def tr_from_dh_rationally(t_theta, di, ai, t_alpha):
110
+ """
111
+ Create transformation matrix from DH parameters using Sympy in rational form.
112
+
113
+ The input shall be rational numbers, including the angles which are expected
114
+ to be parameters of tangent half-angle substitution, i.e., t_theta = tan(theta/2)
115
+ and t_alpha = tan(alpha/2).
116
+
117
+ :param sp.Rational t_theta: DH parameter theta in tangent half-angle form
118
+ :param sp.Rational di: DH parameter d, the offset along Z axis
119
+ :param sp.Rational ai: DH parameter a, the length along X axis
120
+ :param sp.Rational t_alpha: DH parameter alpha in tangent half-angle form
121
+
122
+ :return: 4x4 transformation matrix
123
+ :rtype: sp.Matrix
124
+ """
125
+ from sympy import Matrix, eye, Expr # lazy import
126
+
127
+ if not all(isinstance(param, Expr) for param in [t_theta, di, ai, t_alpha]):
128
+ raise ValueError("All parameters must be of type sympy objects (Expr).")
129
+
130
+ s_th = 2*t_theta / (1 + t_theta**2)
131
+ c_th = (1 - t_theta**2) / (1 + t_theta**2)
132
+ s_al = 2*t_alpha / (1 + t_alpha**2)
133
+ c_al = (1 - t_alpha**2) / (1 + t_alpha**2)
134
+
135
+ mat = eye(4)
136
+ mat[1:4, 0] = Matrix([ai * c_th, ai * s_th, di])
137
+ mat[1, 1:4] = Matrix([[c_th, -s_th * c_al, s_th * s_al]])
138
+ mat[2, 1:4] = Matrix([[s_th, c_th * c_al, -c_th * s_al]])
139
+ mat[3, 1:4] = Matrix([[0, s_al, c_al]])
140
+ return mat
141
+
142
+
143
+ def normalized_line_rationally(point, direction):
144
+ """
145
+ Create a normalized Plücker line from a point and a direction using Sympy.
146
+
147
+ The input shall be rational numbers, i.e. Sympy objects.
148
+
149
+ :param sp.Rational point:
150
+ :param sp.Rational direction:
151
+
152
+ :return: 6-vector representing the Plücker line
153
+ :rtype: sp.Matrix
154
+ """
155
+ from sympy import Matrix, Expr # lazy import
156
+
157
+ if not all(isinstance(param, Expr) for param in point + direction):
158
+ raise ValueError("All parameters must be of type sympy objects (Expr).")
159
+
160
+ dir = Matrix(direction)
161
+ pt = Matrix(point)
162
+ mom = (-1 * dir).cross(pt)
163
+ return Matrix.vstack(dir, mom)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rational-linkages
3
- Version: 2.1.0
3
+ Version: 2.2.3
4
4
  Summary: Rational Linkages
5
5
  Author-email: Daniel Huczala <daniel.huczala@uibk.ac.at>
6
6
  License-Expression: GPL-3.0-or-later
@@ -14,14 +14,17 @@ Requires-Python: >=3.10
14
14
  Description-Content-Type: text/markdown
15
15
  License-File: LICENSE
16
16
  Requires-Dist: biquaternion-py>=1.2.0
17
- Requires-Dist: scipy>=1.10.0
17
+ Requires-Dist: numpy>=1.10.0
18
18
  Requires-Dist: sympy>=1.10.0
19
19
  Requires-Dist: PyQt6>=6.2.0
20
20
  Requires-Dist: pyqtgraph>=0.12.4
21
21
  Requires-Dist: PyOpenGL>=3.0.0
22
+ Requires-Dist: matplotlib>=3.9.0; platform_system == "Windows" and platform_machine == "ARM64"
22
23
  Provides-Extra: opt
23
24
  Requires-Dist: ipython>=8.0.0; extra == "opt"
25
+ Requires-Dist: scipy>=1.10.0; extra == "opt"
24
26
  Requires-Dist: matplotlib>=3.9.0; extra == "opt"
27
+ Requires-Dist: gmpy2>=2.2.0; (platform_system != "Windows" and platform_machine != "ARM64") and extra == "opt"
25
28
  Provides-Extra: exu
26
29
  Requires-Dist: exudyn>=1.9.0; extra == "exu"
27
30
  Requires-Dist: numpy-stl>=3.0.0; extra == "exu"
@@ -112,17 +115,28 @@ Using pip:
112
115
 
113
116
  <code>pip install rational-linkages</code>
114
117
 
115
- or
118
+ or with optional dependencies:
116
119
 
117
- <code>pip install rational-linkages[opt]</code>
120
+ <code>pip install rational-linkages[opt,exu]</code>
118
121
 
119
- Mac users might need to use backslashes to escape the brackets, e.g.:
122
+ Mac/linux users might need to use backslashes to escape the brackets, e.g.:
120
123
 
121
- <code>pip install rational-linkages\\[opt\\]</code>
124
+ <code>pip install rational-linkages\\[opt,exu\\]</code>
122
125
 
123
- for installing also optional dependencies (ipython - inline plotting, gmpy2 - faster
124
- symbolic computations, exudyn - multibody simulations, numpy-stl -
125
- work with meshes in exudyn).
126
+ for installing also **opt**ional dependencies (scipy - optimization problems solving, ipython - inline plotting,
127
+ matplotlib - alternative engine for 3D plotting, gmpy2 - optimized symbolic computations)
128
+ and **exu**dyn dependencies (exudyn - multibody simulations,
129
+ numpy-stl + ngsolve - work with meshes in exudyn).
130
+
131
+ On **Linux systems**, to run GUI interactive plotting,
132
+ some additional libraries are required for plotting with PyQt6. For example,
133
+ on Ubuntu, it can be installed as follows:
134
+
135
+ <code>sudo apt install libgl1-mesa-glx libxkbcommon-x11-0 libegl1 libdbus-1-3</code>
136
+
137
+ or on Ubuntu 24.04 and higher:
138
+
139
+ <code>sudo apt install libgl1 libxkbcommon-x11-0 libegl1 libdbus-1-3</code>
126
140
 
127
141
  ### Install from source
128
142
 
@@ -142,21 +156,21 @@ work with meshes in exudyn).
142
156
 
143
157
  <code>pip install -e .[opt,dev,doc]</code> including the development and documentation dependencies.
144
158
 
145
- Mac or Linux users might need to use backslashes to escape the brackets, e.g.:
159
+ Mac/linux users might need to use backslashes to escape the brackets, e.g.:
146
160
 
147
161
  <code>pip install -e .\\[opt\\]</code>
148
162
 
149
- Additionally, on Linux systems, some additional libraries are required for plotting with PyQt6. For example,
150
- on Ubuntu, it can be installed as follows:
151
163
 
152
- <code>sudo apt install libgl1-mesa-glx libxkbcommon-x11-0 libegl1 libdbus-1-3</code>
153
164
 
154
- or on Ubuntu 24.04 and higher:
165
+ To run the Rust functions, you need to install the [Rust toolchain](https://www.rust-lang.org) and
166
+ build the Rust code yourself. On top of that, on Windows, you need to install a
167
+ C++ build toolchain. In `Visual Studio Installer`, select:
155
168
 
156
- <code>sudo apt install libgl1 libxkbcommon-x11-0 libegl1 libdbus-1-3</code>
169
+ * MSVC v143 - VS 2022 C++ x64/x86 build tools (latest)
170
+ * Windows 11 SDK
171
+ * C++ CMake tools for Windows
157
172
 
158
- To run the Rust functions, you need to install the [Rust toolchain](https://www.rust-lang.org) and
159
- build the Rust code yourself, for example:
173
+ Then, navigate to the `rational_linkages/rust` folder and run:
160
174
 
161
175
  <code>cargo build --release</code>
162
176
 
@@ -0,0 +1,40 @@
1
+ rational_linkages/AffineMetric.py,sha256=5tT2fw_3s8ZNDQbxMwUnFPdzyXfq8QhcH28ri-ZRsyE,6650
2
+ rational_linkages/CollisionAnalyser.py,sha256=JQYjJFtrNeEUuLB1lv6HMHX3PL1PP4pw6YzELHQw6ZU,21607
3
+ rational_linkages/CollisionFreeOptimization.py,sha256=Il5KRl9XxyGLwRGNbLHJ7C8JvXpumDm0LXtSDNfW5W8,12628
4
+ rational_linkages/DualQuaternion.py,sha256=LFM_g2d7hyHaxNPgAueL1dt6qlPA4tSMpWRyv5-15MI,25430
5
+ rational_linkages/DualQuaternionAction.py,sha256=EgwULVtLSenGlUYXXXdshbt2PeoiJ32ZeTyssMBdKIs,4530
6
+ rational_linkages/ExudynAnalysis.py,sha256=OuW-k9yzgstN6id9Fa_CW4SdAYPbDliQXHVsVni1sf8,6283
7
+ rational_linkages/FactorizationProvider.py,sha256=Khq5pz_iXmyw6WHqapyzPEUOfLVge3uwsr4EFn6FshE,6802
8
+ rational_linkages/Linkage.py,sha256=X56Hn46R0F8OXHIj5PpVzEtCMwZu_9OaxX_OgRvIyHA,10380
9
+ rational_linkages/MiniBall.py,sha256=tjnVtOMfiSih_qnCa5HfQNbW_6A694XY_xzLikA1kG8,10423
10
+ rational_linkages/MotionApproximation.py,sha256=YtLx9ShEedsUaBVMzNzfWj0G_Ueuamx8xX4QU2V_xWU,10237
11
+ rational_linkages/MotionDesigner.py,sha256=9t-duYdMsOYUJnSKOBB0mB-e19qNUjbiRVGR9BOTb5c,31553
12
+ rational_linkages/MotionFactorization.py,sha256=Fvt6BHvMu8N1g4KVZU-5GMxP3uy-HBzuG7otdhdmp_A,17246
13
+ rational_linkages/MotionInterpolation.py,sha256=CnD72edjR9_StW9J31Vjif2JCpFq2ZdLw9UF4mBubgQ,35934
14
+ rational_linkages/NormalizedLine.py,sha256=J41UnSQg6jS23uW_oKYzse_MLRqEMgC-RQ0jNzpfP_A,15646
15
+ rational_linkages/NormalizedPlane.py,sha256=KlsV2Bems4onD_TTDj9SaPa57hVjZHiTt4tqZ5jpRZw,6032
16
+ rational_linkages/Plotter.py,sha256=g-DI3kKh6-Y1Q5uvGde-exDeFkifia7MIQDVK3FQsvo,4456
17
+ rational_linkages/PlotterMatplotlib.py,sha256=H53nc147fgw8iTP2xeiphIaHdW9URTTX7zyAucsHHhw,37734
18
+ rational_linkages/PlotterPyqtgraph.py,sha256=LAK6rVWeKKvygd1Syb_tbBd6_Dwwr9eO42AXQK1LldI,54533
19
+ rational_linkages/PointHomogeneous.py,sha256=PFOUriVm-kRvV2PzlyyZcrw2wlCK3uGDB3ZEgfXP5v4,13784
20
+ rational_linkages/Quaternion.py,sha256=RDRRczv10hLehnsJepwYXXBQeum9-tfstJATdsDCssE,5285
21
+ rational_linkages/RationalBezier.py,sha256=sPoWuVcjm_EiaRDMHPEUaeFO8MMWZUSSq4MSUrznPrs,15243
22
+ rational_linkages/RationalCurve.py,sha256=MGg4_sBMDukBI2kO8NahW6BWNcJ8_A_JMHbgVGtO71M,29066
23
+ rational_linkages/RationalDualQuaternion.py,sha256=Os3kcLE9qdXyh0EwVxtsPn-MCeEqXS6LTROpYt-spjc,1494
24
+ rational_linkages/RationalMechanism.py,sha256=7xJVQigyu8HP2r0Mh9RQ5P090VDVe4GYMc5ENDIJxdc,64658
25
+ rational_linkages/SingularityAnalysis.py,sha256=Dv7giyGFty53BqbIXJfJR_C5zkJOc3mbSIuU8I-MN68,1903
26
+ rational_linkages/StaticMechanism.py,sha256=gWheI8nz4lrQLs9lLKasxuxupVuyjim610W-F8-d0SY,12795
27
+ rational_linkages/TransfMatrix.py,sha256=UuPw5z6wBgqxYwNczxgYJfvjyYl_rxk5Bhax-pRTBiE,16810
28
+ rational_linkages/__init__.py,sha256=j51yV2-UG2vDFIUmV0sg0TDb5RmbhJ6LBaalrZspisQ,1050
29
+ rational_linkages/models.py,sha256=aMdyKBeLDi3XtXebW84K1w8VL8g3eqlMXVCG6OJqrb4,7246
30
+ rational_linkages/utils.py,sha256=yWALKgkgTcYobZVCWuyAspe0DFdmagBTVyH16rdxqmk,5246
31
+ rational_linkages/utils_rust.cp312-win_arm64.pyd,sha256=sHy0mIXhoUliCcUwI4a-F3r5NfAtrWnbXTBgl4w4lfg,220672
32
+ rational_linkages/utils_rust.pyi,sha256=iTaedylbvDNplOzrd1RZ0PPJzCvh20w52ewbLiuAgnU,140
33
+ rational_linkages/data/bennett_ark24.pkl,sha256=Eh7S5PHOi0ENg8-FS7KjQsc6BBeMXT984Yz5VKiqwNM,39216
34
+ rational_linkages/data/collisions_free_6r.pkl,sha256=XZFvnt8jEUfDY3JacLlS1kE-EQvtgmb7Un07DovmUmg,73101
35
+ rational_linkages/data/plane_fold_6r.pkl,sha256=lbrnqFksdJ6QW4LJqyVv-ujjhP25kkUWdGY7bjR6Hbo,48752
36
+ rational_linkages-2.2.3.dist-info/licenses/LICENSE,sha256=SrpxAZ1vJi81S4VF9EBjgxz9qrVj9acCyQPSAk3JgOo,35784
37
+ rational_linkages-2.2.3.dist-info/METADATA,sha256=H4lt7oruxa1j44lFrsjcmMWlJw_GV1hM7GRwR7i6sXA,9842
38
+ rational_linkages-2.2.3.dist-info/WHEEL,sha256=me1aG6nvouDIdjWXNa5q_zebZZEPzD53N4rwsapSjvI,101
39
+ rational_linkages-2.2.3.dist-info/top_level.txt,sha256=IxRIuCa6RJFZKK15jamktxgS0abg1PV2WqXo1Z-MalI,18
40
+ rational_linkages-2.2.3.dist-info/RECORD,,
@@ -1,40 +0,0 @@
1
- rational_linkages/AffineMetric.py,sha256=5tT2fw_3s8ZNDQbxMwUnFPdzyXfq8QhcH28ri-ZRsyE,6650
2
- rational_linkages/CollisionAnalyser.py,sha256=0Y3ld_Km9WyrHy-nQDD0doXbR0aTEXbjfOUxYDhRJcY,21451
3
- rational_linkages/CollisionFreeOptimization.py,sha256=-Vl5KE0KkXwc18Xgbjqvin2ExV302onfO6DK0LTf63U,12486
4
- rational_linkages/DualQuaternion.py,sha256=J6gTgQxO1piIA615jBX4ubqwwicUFkr49FDsiRN1sdI,25290
5
- rational_linkages/DualQuaternionAction.py,sha256=EgwULVtLSenGlUYXXXdshbt2PeoiJ32ZeTyssMBdKIs,4530
6
- rational_linkages/ExudynAnalysis.py,sha256=OuW-k9yzgstN6id9Fa_CW4SdAYPbDliQXHVsVni1sf8,6283
7
- rational_linkages/FactorizationProvider.py,sha256=Faqxv15MAzNJh6zzGgvXULfzGRkl_6Ciy22usM2kDJs,6796
8
- rational_linkages/Linkage.py,sha256=X56Hn46R0F8OXHIj5PpVzEtCMwZu_9OaxX_OgRvIyHA,10380
9
- rational_linkages/MiniBall.py,sha256=dyjHkjsYVHBiw4uT2tpY1kV3-aC6VGQbsLHmgsTUF20,10158
10
- rational_linkages/MotionApproximation.py,sha256=C01okbvF5AP49jgKyKysc7CCF8Z0iyNO18sN_FY4hyc,10147
11
- rational_linkages/MotionDesigner.py,sha256=lWGsn4bffD4WBq9p2dshGUv9QBPULI0FEU_HgxdhHNw,29563
12
- rational_linkages/MotionFactorization.py,sha256=5jsMc15pxzAouiQ1_63ppmgV-SgDhyZgjCGexyUisnM,17244
13
- rational_linkages/MotionInterpolation.py,sha256=FZg6tTSJO5xkhV42JwFbwKeCUQsVfLGHmRu8RMQ2iJg,35935
14
- rational_linkages/NormalizedLine.py,sha256=J41UnSQg6jS23uW_oKYzse_MLRqEMgC-RQ0jNzpfP_A,15646
15
- rational_linkages/NormalizedPlane.py,sha256=KlsV2Bems4onD_TTDj9SaPa57hVjZHiTt4tqZ5jpRZw,6032
16
- rational_linkages/Plotter.py,sha256=g-DI3kKh6-Y1Q5uvGde-exDeFkifia7MIQDVK3FQsvo,4456
17
- rational_linkages/PlotterMatplotlib.py,sha256=WfH-hPo1aclSBH9vmApMmUota0Cz9gnHGWWEedKK6R0,37468
18
- rational_linkages/PlotterPyqtgraph.py,sha256=T2iAgU39Sxu9Sjt4yIgida7IaTPqRe4jnQIqkcZnEuA,52191
19
- rational_linkages/PointHomogeneous.py,sha256=PFOUriVm-kRvV2PzlyyZcrw2wlCK3uGDB3ZEgfXP5v4,13784
20
- rational_linkages/Quaternion.py,sha256=RDRRczv10hLehnsJepwYXXBQeum9-tfstJATdsDCssE,5285
21
- rational_linkages/RationalBezier.py,sha256=omC5XczOGzZ62BGmBNBSwlpKKTEYX7K87BG5nD17ppo,15300
22
- rational_linkages/RationalCurve.py,sha256=CtD9h52SxzIUBC_KGvd7JOFLXIlPks1KRK2PzAIoq14,28714
23
- rational_linkages/RationalDualQuaternion.py,sha256=_g87ZCk6Z4mN1_IKBqbR-N0-GWQ7xSrnPXZb7dxkj1M,1487
24
- rational_linkages/RationalMechanism.py,sha256=mnJv3UVbSZAVEohPeDWXCdhIMGA3kW5wGNfmQddSxK8,64662
25
- rational_linkages/SingularityAnalysis.py,sha256=2_BoJy4v3_EwJ84e3-2qW6vjtZd263gDjGzfABI8s2g,1899
26
- rational_linkages/StaticMechanism.py,sha256=gWheI8nz4lrQLs9lLKasxuxupVuyjim610W-F8-d0SY,12795
27
- rational_linkages/TransfMatrix.py,sha256=UuPw5z6wBgqxYwNczxgYJfvjyYl_rxk5Bhax-pRTBiE,16810
28
- rational_linkages/__init__.py,sha256=j51yV2-UG2vDFIUmV0sg0TDb5RmbhJ6LBaalrZspisQ,1050
29
- rational_linkages/models.py,sha256=aMdyKBeLDi3XtXebW84K1w8VL8g3eqlMXVCG6OJqrb4,7246
30
- rational_linkages/utils.py,sha256=2W9XJJX73oyRQjAhGrHpc2moNoAGkJawVuCxYeHRTfo,3152
31
- rational_linkages/utils_rust.cp312-win_arm64.pyd,sha256=uL_Wr4IMwLG9lZ8X6BlkmmhOd0GvUfQfHtAYzmw2LwU,220672
32
- rational_linkages/utils_rust.pyi,sha256=iTaedylbvDNplOzrd1RZ0PPJzCvh20w52ewbLiuAgnU,140
33
- rational_linkages/data/bennett_ark24.pkl,sha256=Eh7S5PHOi0ENg8-FS7KjQsc6BBeMXT984Yz5VKiqwNM,39216
34
- rational_linkages/data/collisions_free_6r.pkl,sha256=XZFvnt8jEUfDY3JacLlS1kE-EQvtgmb7Un07DovmUmg,73101
35
- rational_linkages/data/plane_fold_6r.pkl,sha256=lbrnqFksdJ6QW4LJqyVv-ujjhP25kkUWdGY7bjR6Hbo,48752
36
- rational_linkages-2.1.0.dist-info/licenses/LICENSE,sha256=SrpxAZ1vJi81S4VF9EBjgxz9qrVj9acCyQPSAk3JgOo,35784
37
- rational_linkages-2.1.0.dist-info/METADATA,sha256=ZxVPFfGqKmYG9wLaHTBD2E5vUi14bv18TCWVgiTDzOg,9109
38
- rational_linkages-2.1.0.dist-info/WHEEL,sha256=me1aG6nvouDIdjWXNa5q_zebZZEPzD53N4rwsapSjvI,101
39
- rational_linkages-2.1.0.dist-info/top_level.txt,sha256=IxRIuCa6RJFZKK15jamktxgS0abg1PV2WqXo1Z-MalI,18
40
- rational_linkages-2.1.0.dist-info/RECORD,,