Skip to content

Commit cab3242

Browse files
committed
frame inversion
1 parent d77f706 commit cab3242

File tree

3 files changed

+45
-0
lines changed

3 files changed

+45
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1010
### Added
1111

1212
* Added implementation of `RhinoBrep.fillet()` and `RhinoBrep.filleted()` to `compas_rhino`.
13+
* Added `Frame.invert` and `Frame.inverted`.
1314

1415
### Changed
1516

src/compas/geometry/frame.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -604,6 +604,18 @@ def to_transformation(self):
604604
# Methods
605605
# ==========================================================================
606606

607+
def invert(self):
608+
"""Invert the frame while keeping the X axis fixed."""
609+
self._yaxis = self.yaxis * -1
610+
self._zaxis = None
611+
612+
def inverted(self):
613+
"""Return an inverted copy of the frame."""
614+
frame = self.copy() # type: Frame
615+
frame.invert()
616+
print(frame.xaxis, frame.yaxis, frame.zaxis)
617+
return frame
618+
607619
def interpolate_frame(self, other, t):
608620
"""Interpolates between two frames at a given parameter t in the range [0, 1]
609621

tests/compas/geometry/test_frame.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,3 +92,35 @@ def test_interpolate_frame_start_end():
9292

9393
three_quarter_frame = frame1.interpolate_frame(frame2, 0.75)
9494
assert TOL.is_allclose([math.degrees(three_quarter_frame.axis_angle_vector.y)], [-67.5], atol=TOL.angular)
95+
96+
97+
def test_frame_invert():
98+
frame = Frame([0, 0, 0])
99+
100+
assert TOL.is_close(frame.xaxis.dot([1, 0, 0]), 1.0)
101+
assert TOL.is_close(frame.yaxis.dot([0, 1, 0]), 1.0)
102+
assert TOL.is_close(frame.zaxis.dot([0, 0, 1]), 1.0)
103+
104+
frame.invert()
105+
106+
assert TOL.is_close(frame.xaxis.dot([1, 0, 0]), 1.0)
107+
assert TOL.is_close(frame.yaxis.dot([0, -1, 0]), 1.0)
108+
assert TOL.is_close(frame.zaxis.dot([0, 0, -1]), 1.0)
109+
110+
111+
def test_frame_inverted():
112+
frame = Frame([0, 0, 0])
113+
114+
assert TOL.is_close(frame.xaxis.dot([1, 0, 0]), 1.0)
115+
assert TOL.is_close(frame.yaxis.dot([0, 1, 0]), 1.0)
116+
assert TOL.is_close(frame.zaxis.dot([0, 0, 1]), 1.0)
117+
118+
other = frame.inverted()
119+
120+
assert TOL.is_close(frame.xaxis.dot([1, 0, 0]), 1.0)
121+
assert TOL.is_close(frame.yaxis.dot([0, 1, 0]), 1.0)
122+
assert TOL.is_close(frame.zaxis.dot([0, 0, 1]), 1.0)
123+
124+
assert TOL.is_close(other.xaxis.dot([1, 0, 0]), 1.0)
125+
assert TOL.is_close(other.yaxis.dot([0, -1, 0]), 1.0)
126+
assert TOL.is_close(other.zaxis.dot([0, 0, -1]), 1.0)

0 commit comments

Comments
 (0)