Skip to content

Commit 15ea5fe

Browse files
authored
Merge branch 'main' into clean_brep_from_cuves
2 parents b7a2d98 + 0fa6bcb commit 15ea5fe

File tree

6 files changed

+58
-4
lines changed

6 files changed

+58
-4
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1212
* Added `Group` to `compas.scene`.
1313
* Added `compas.geometry.Brep.cap_planar_holes`.
1414
* Added `compas_rhino.geometry.RhinoBrep.cap_planar_holes`.
15+
* Added `compas.geometry.angle_vectors_projected`.
1516
* Added `compas.geometry.Brep.from_curves`.
1617
* Added `compas_rhino.geometry.RhinoBrep.from_curves`.
1718

src/compas/geometry/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@
9999
angle_points_xy,
100100
angle_vectors,
101101
angle_vectors_signed,
102+
angle_vectors_projected,
102103
angle_vectors_xy,
103104
angles_points,
104105
angles_points_xy,
@@ -488,6 +489,7 @@
488489
"angle_points_xy",
489490
"angle_vectors",
490491
"angle_vectors_signed",
492+
"angle_vectors_projected",
491493
"angle_vectors_xy",
492494
"angles_points",
493495
"angles_points_xy",

src/compas/geometry/_core/angles.py

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,7 @@ def angle_vectors(u, v, deg=False, tol=None):
7878
def angle_vectors_signed(u, v, normal, deg=False, tol=None):
7979
"""Computes the signed angle between two vectors.
8080
81-
It calculates the angle such that rotating vector u about the normal by
82-
angle would result in a vector that looks into the same direction as v.
81+
Returns the smallest angle between 2 vectors, with the sign of the angle based on the direction of the normal vector according to the right hand rule of rotation.
8382
8483
Parameters
8584
----------
@@ -121,6 +120,44 @@ def angle_vectors_signed(u, v, normal, deg=False, tol=None):
121120
return angle
122121

123122

123+
def angle_vectors_projected(u, v, normal, deg=False, tol=None):
124+
"""Computes the signed angle between two vectors.
125+
126+
Retuns the angle between 2 vectors projected onto a plane defined by a normal vector.
127+
This can be positive or negative depending on the direction of the normal vector and the order of the input vectors
128+
129+
Parameters
130+
----------
131+
u : [float, float, float] | :class:`compas.geometry.Vector`
132+
XYZ components of the first vector.
133+
v : [float, float, float] | :class:`compas.geometry.Vector`
134+
XYZ components of the second vector.
135+
normal : [float, float, float] | :class:`compas.geometry.Vector`
136+
XYZ components of the plane's normal spanned by u and v.
137+
deg : bool, optional
138+
If True, returns the angle in degrees.
139+
tol : float, optional
140+
The tolerance for comparing values to zero.
141+
Default is :attr:`TOL.absolute`.
142+
143+
Returns
144+
-------
145+
float
146+
The signed angle in radians (in degrees if deg == True).
147+
148+
Examples
149+
--------
150+
>>> normal = [0.0, 0.0, 1.0]
151+
>>> angle_vectors_projected([0.0, 1.0, -1.0], [1.0, 0.0, 1.0], normal)
152+
-1.57079
153+
154+
"""
155+
u_cross = cross_vectors(u, normal)
156+
v_cross = cross_vectors(v, normal)
157+
158+
return angle_vectors_signed(u_cross, v_cross, normal, deg, tol)
159+
160+
124161
def angle_vectors_xy(u, v, deg=False, tol=None):
125162
"""Compute the smallest angle between the XY components of two vectors.
126163

tests/compas/compas_api.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,7 @@
263263
"angle_points_xy",
264264
"angle_vectors",
265265
"angle_vectors_signed",
266+
"angle_vectors_projected",
266267
"angle_vectors_xy",
267268
"angles_points",
268269
"angles_points_xy",
@@ -648,4 +649,4 @@
648649
"yellow"
649650
]
650651
}
651-
}
652+
}

tests/compas/compas_api_ipy.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,7 @@
241241
"angle_points_xy",
242242
"angle_vectors",
243243
"angle_vectors_signed",
244+
"angle_vectors_projected",
244245
"angle_vectors_xy",
245246
"angles_points",
246247
"angles_points_xy",
@@ -578,4 +579,4 @@
578579
"yellow"
579580
]
580581
}
581-
}
582+
}

tests/compas/geometry/test_core.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from compas.geometry import angle_planes
1111
from compas.geometry import angles_vectors
1212
from compas.geometry import angle_vectors_signed
13+
from compas.geometry import angle_vectors_projected
1314
from compas.geometry import centroid_points
1415
from compas.geometry import centroid_polyhedron
1516
from compas.geometry import length_vector
@@ -137,6 +138,17 @@ def test_angle_vectors_signed(u, v, normal, result):
137138
assert TOL.is_close(angle_vectors_signed(u, v, normal), result)
138139

139140

141+
@pytest.mark.parametrize(
142+
"u,v,normal,result",
143+
[
144+
([1, 0, 1], [0, 1, -1], [0, 0, 1], +pi / 2),
145+
([1, 0, 1], [0, 1, -1], [0, 0, -1], -pi / 2),
146+
],
147+
)
148+
def test_angle_vectors_projected(u, v, normal, result):
149+
assert TOL.is_close(angle_vectors_projected(u, v, normal), result)
150+
151+
140152
# ==============================================================================
141153
# average
142154
# ==============================================================================

0 commit comments

Comments
 (0)