From 03f755aca075498bfd1987df33b4d39dc78db2f5 Mon Sep 17 00:00:00 2001 From: Josh Melnyk-Croft Date: Wed, 23 Apr 2025 18:03:39 -0700 Subject: [PATCH 1/2] Add static oGetRelativeFrame method to LocalFrame --- ShapeKernel/Frames/LocalFrame.cs | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/ShapeKernel/Frames/LocalFrame.cs b/ShapeKernel/Frames/LocalFrame.cs index 8956a86..ffba9dc 100644 --- a/ShapeKernel/Frames/LocalFrame.cs +++ b/ShapeKernel/Frames/LocalFrame.cs @@ -202,6 +202,30 @@ public static LocalFrame oGetRotatedFrame(LocalFrame oFrame, float dPhi, Vector3 return oNewFrame; } + /// + /// Returns a new LocalFrame positioned at an offset relative to the given reference frame. + /// The offset is interpreted in the reference frame's local coordinate system. + /// + /// The LocalFrame whose local axes define the translation directions + /// Translation vector in the reference frame's local coordinates + /// A new LocalFrame translated relative to the reference frame + public static LocalFrame oGetRelativeFrame(LocalFrame refFrame, Vector3 vecLocalOffset) + { + Vector3 vecRefX = refFrame.vecGetLocalX(); + Vector3 vecRefY = refFrame.vecGetLocalY(); + Vector3 vecRefZ = refFrame.vecGetLocalZ(); + + Vector3 vecGlobalOffset = + vecRefX * vecLocalOffset.X + + vecRefY * vecLocalOffset.Y + + vecRefZ * vecLocalOffset.Z; + + Vector3 vecNewPosition = refFrame.vecGetPosition() + vecGlobalOffset; + + return new LocalFrame(vecNewPosition, refFrame.vecGetLocalZ(), refFrame.vecGetLocalX()); + } + + /// /// Compliments local z and local x according to a right-hand system. /// @@ -212,4 +236,4 @@ public static Vector3 vecGetLocalY(Vector3 vecLocalZ, Vector3 vecLocalX) } } } -} \ No newline at end of file +} From d53dab29da9de5b0ea4caa501024724d5eb0e268 Mon Sep 17 00:00:00 2001 From: Josh Melnyk-Croft Date: Thu, 24 Apr 2025 20:26:46 -0700 Subject: [PATCH 2/2] Add static oGetRelativeFrame method to LocalFrame --- ShapeKernel/Frames/LocalFrame.cs | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/ShapeKernel/Frames/LocalFrame.cs b/ShapeKernel/Frames/LocalFrame.cs index ffba9dc..0739e65 100644 --- a/ShapeKernel/Frames/LocalFrame.cs +++ b/ShapeKernel/Frames/LocalFrame.cs @@ -204,25 +204,26 @@ public static LocalFrame oGetRotatedFrame(LocalFrame oFrame, float dPhi, Vector3 /// /// Returns a new LocalFrame positioned at an offset relative to the given reference frame. - /// The offset is interpreted in the reference frame's local coordinate system. + /// The offset is interpreted in the reference frame's local coordinate system. + /// Use caution if chaining relative frames as inaccuracies can compound. /// /// The LocalFrame whose local axes define the translation directions /// Translation vector in the reference frame's local coordinates /// A new LocalFrame translated relative to the reference frame public static LocalFrame oGetRelativeFrame(LocalFrame refFrame, Vector3 vecLocalOffset) { - Vector3 vecRefX = refFrame.vecGetLocalX(); - Vector3 vecRefY = refFrame.vecGetLocalY(); - Vector3 vecRefZ = refFrame.vecGetLocalZ(); + Vector3 vecRefX = refFrame.vecGetLocalX(); + Vector3 vecRefY = refFrame.vecGetLocalY(); + Vector3 vecRefZ = refFrame.vecGetLocalZ(); - Vector3 vecGlobalOffset = - vecRefX * vecLocalOffset.X + - vecRefY * vecLocalOffset.Y + - vecRefZ * vecLocalOffset.Z; + Vector3 vecGlobalOffset = + vecRefX * vecLocalOffset.X + vecRefY * vecLocalOffset.Y + + vecRefZ * vecLocalOffset.Z; - Vector3 vecNewPosition = refFrame.vecGetPosition() + vecGlobalOffset; + Vector3 vecNewPosition = refFrame.vecGetPosition() + vecGlobalOffset; - return new LocalFrame(vecNewPosition, refFrame.vecGetLocalZ(), refFrame.vecGetLocalX()); + return new LocalFrame(vecNewPosition, refFrame.vecGetLocalZ(), refFrame.vecGetLocalX()); }