From 92dd375da3f633dd58907cee2b928f9dad2481d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20St=C3=B8ren?= Date: Tue, 14 Aug 2018 09:38:25 +0200 Subject: [PATCH] #3201 Fix error discovered by unit test --- .../Application/Tools/RiaJCurveCalculator.cpp | 11 ++++++-- .../UnitTests/SolveSpaceSolver-Test.cpp | 25 +++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/ApplicationCode/Application/Tools/RiaJCurveCalculator.cpp b/ApplicationCode/Application/Tools/RiaJCurveCalculator.cpp index eb64e02d9c..cad52d615f 100644 --- a/ApplicationCode/Application/Tools/RiaJCurveCalculator.cpp +++ b/ApplicationCode/Application/Tools/RiaJCurveCalculator.cpp @@ -19,6 +19,7 @@ #include "RiaJCurveCalculator.h" #include "RiaOffshoreSphericalCoords.h" #include "cvfMatrix3.h" +#include "RiaArcCurveCalculator.h" //-------------------------------------------------------------------------------------------------- /// @@ -50,15 +51,21 @@ RiaJCurveCalculator::RiaJCurveCalculator(cvf::Vec3d p1, double azi1, double inc1 if (p2c1Length < r1) { // Radius is too big. We can not get to point 2 using the requested radius. - + m_isCalculationOK = false; + RiaArcCurveCalculator arc(p1, t1, p2); + m_c1 = arc.center(); + m_n1 = arc.normal(); + m_firstArcEndpoint = p2; + return; } + double d = sqrt( p2c1Length * p2c1Length - r1 * r1); double betha = asin( r1/p2c1Length ); cvf::Vec3d tp2c1 = p2c1/p2c1Length; cvf::Vec3d nc1 = t1 ^ tr1; - cvf::Vec3d tp11p2 = tp2c1.getTransformedVector(cvf::Mat3d::fromRotation(nc1, betha)); + cvf::Vec3d tp11p2 = -tp2c1.getTransformedVector(cvf::Mat3d::fromRotation(nc1, betha)); m_firstArcEndpoint = p2 - d*tp11p2; m_c1 = c1; diff --git a/ApplicationCode/UnitTests/SolveSpaceSolver-Test.cpp b/ApplicationCode/UnitTests/SolveSpaceSolver-Test.cpp index 6f0db67f11..ab52cfd75f 100644 --- a/ApplicationCode/UnitTests/SolveSpaceSolver-Test.cpp +++ b/ApplicationCode/UnitTests/SolveSpaceSolver-Test.cpp @@ -715,3 +715,28 @@ TEST(DISABLED_RiaSCurveCalculator, q_r_relation) { 0,0,-1000 }, M_PI/2, M_PI/2); } + +#include "RiaJCurveCalculator.h" + +TEST(RiaJCurveCalculator, Basic) +{ + RiaJCurveCalculator calc({ 0,0,0 }, 0, M_PI/2, 100, { 0,100,-1000 }); + + EXPECT_TRUE(calc.isOk() ); + + cvf::Vec3d p11 = calc.firstArcEndpoint(); + EXPECT_NEAR( 0, p11.x(), 1e-5); + EXPECT_NEAR( 100, p11.y(), 1e-5); + EXPECT_NEAR( -100, p11.z(), 1e-5); + + cvf::Vec3d n = calc.firstNormal(); + EXPECT_NEAR(-1, n.x(), 1e-5); + EXPECT_NEAR( 0, n.y(), 1e-5); + EXPECT_NEAR( 0, n.z(), 1e-5); + + cvf::Vec3d c = calc.firstCenter(); + EXPECT_NEAR( 0, c.x(), 1e-5); + EXPECT_NEAR( 0, c.y(), 1e-5); + EXPECT_NEAR(-100, c.z(), 1e-5); + +} \ No newline at end of file