diff --git a/ApplicationCode/Application/Tools/RiaArcCurveCalculator.cpp b/ApplicationCode/Application/Tools/RiaArcCurveCalculator.cpp index 98f016df70..6f0c9e74b6 100644 --- a/ApplicationCode/Application/Tools/RiaArcCurveCalculator.cpp +++ b/ApplicationCode/Application/Tools/RiaArcCurveCalculator.cpp @@ -18,6 +18,7 @@ #include "RiaArcCurveCalculator.h" #include "RiaOffshoreSphericalCoords.h" +#include "cvfGeometryTools.h" //-------------------------------------------------------------------------------------------------- /// + p1 @@ -58,9 +59,12 @@ RiaArcCurveCalculator::RiaArcCurveCalculator(cvf::Vec3d p1, cvf::Vec3d t1, cvf:: m_curveStatus = OK_STRAIGHT_LINE; RiaOffshoreSphericalCoords endTangent(t1); + m_endTangent = t1; m_endAzi = endTangent.azi(); m_endInc = endTangent.inc(); m_radius = std::numeric_limits::infinity(); + m_arcAngle = 0; + m_arcLength = p1p2.length(); return; } @@ -75,9 +79,13 @@ RiaArcCurveCalculator::RiaArcCurveCalculator(cvf::Vec3d p1, cvf::Vec3d t1, cvf:: m_arcCS.setTranslation(C); - cvf::Vec3d t2 = N ^ (p2 - C).getNormalized(); + m_arcAngle = cvf::GeometryTools::getAngle(N, p1 - C, p2 - C); - RiaOffshoreSphericalCoords endTangent(t2); + m_arcLength = m_radius*m_arcAngle; + + m_endTangent = N ^ (p2 - C).getNormalized(); + + RiaOffshoreSphericalCoords endTangent(m_endTangent); m_endAzi = endTangent.azi(); m_endInc = endTangent.inc(); } diff --git a/ApplicationCode/Application/Tools/RiaArcCurveCalculator.h b/ApplicationCode/Application/Tools/RiaArcCurveCalculator.h index 6bcbac5832..b05a582cd0 100644 --- a/ApplicationCode/Application/Tools/RiaArcCurveCalculator.h +++ b/ApplicationCode/Application/Tools/RiaArcCurveCalculator.h @@ -45,20 +45,25 @@ public: cvf::Mat4d arcCS() const { return m_arcCS; } double radius() const { return m_radius;} + double arcAngle() const { return m_arcAngle; } + double arcLength() const { return m_arcLength; } cvf::Vec3d center() const { return m_arcCS.translation();} cvf::Vec3d normal() const { return cvf::Vec3d(m_arcCS.col(2));} double endAzimuth() const { return m_endAzi; } double endInclination() const { return m_endInc; } - + cvf::Vec3d endTangent() const { return m_endTangent; } private: CurveStatus m_curveStatus; double m_radius; + double m_arcLength; + double m_arcAngle; cvf::Mat4d m_arcCS; double m_endAzi; double m_endInc; + cvf::Vec3d m_endTangent; }; diff --git a/ApplicationCode/Application/Tools/RiaPolyArcLineSampler.cpp b/ApplicationCode/Application/Tools/RiaPolyArcLineSampler.cpp index 207583ee85..d4a13c3e27 100644 --- a/ApplicationCode/Application/Tools/RiaPolyArcLineSampler.cpp +++ b/ApplicationCode/Application/Tools/RiaPolyArcLineSampler.cpp @@ -137,15 +137,13 @@ void RiaPolyArcLineSampler::sampleArc(cvf::Vec3d t1, cvf::Vec3d p1, cvf::Vec3d p double angleInc = m_samplingsInterval/ radius; - cvf::Vec3d C = arcCS.translation(); - cvf::Vec3d N(arcCS.col(2)); - cvf::Vec3d tr2 = (C - p2).getNormalized(); - cvf::Vec3d t2 = tr2 ^ N; + cvf::Vec3d C = CS_rad.center(); + cvf::Vec3d N = CS_rad.normal(); // Sample arc by // Rotate vector an increment, and transform to arc CS - double arcAngle = cvf::GeometryTools::getAngle(N, p1-C, p2-C); + double arcAngle = cvf::GeometryTools::getAngle(N, p1 - C, p2 - C); if (arcAngle/angleInc > 5000) { angleInc = arcAngle/5000; @@ -167,5 +165,5 @@ void RiaPolyArcLineSampler::sampleArc(cvf::Vec3d t1, cvf::Vec3d p1, cvf::Vec3d p m_points->push_back(p2); m_meshDs->push_back(m_totalMD); - (*endTangent) = t2; + (*endTangent) = CS_rad.endTangent(); } diff --git a/ApplicationCode/UnitTests/SolveSpaceSolver-Test.cpp b/ApplicationCode/UnitTests/SolveSpaceSolver-Test.cpp index be0608e5ce..f8c7796076 100644 --- a/ApplicationCode/UnitTests/SolveSpaceSolver-Test.cpp +++ b/ApplicationCode/UnitTests/SolveSpaceSolver-Test.cpp @@ -831,4 +831,46 @@ TEST(RiaJCurveCalculator, Basic) EXPECT_TRUE(calc.curveStatus() == RiaJCurveCalculator::OK_STRAIGHT_LINE); } +} + + +#include "RiaArcCurveCalculator.h" + +TEST(RiaArcCurveCalculator, Basic) +{ + { + RiaArcCurveCalculator calc({ 0,0,0 }, 0, M_PI/2, { 0,1000,-1000 }); + + EXPECT_TRUE(calc.curveStatus() == RiaArcCurveCalculator::OK); + EXPECT_NEAR(1000.0, calc.radius(), 1e-5); + EXPECT_NEAR(M_PI/2, calc.arcAngle(), 1e-5); + EXPECT_NEAR(M_PI/2*1000, calc.arcLength(), 1e-5); + + cvf::Vec3d center = calc.center(); + EXPECT_NEAR( 0, center.x(), 1e-5); + EXPECT_NEAR( 0, center.y(), 1e-5); + EXPECT_NEAR(-1000, center.z(), 1e-5); + + cvf::Vec3d n = calc.normal(); + EXPECT_NEAR(-1, n.x(), 1e-5); + EXPECT_NEAR( 0, n.y(), 1e-5); + EXPECT_NEAR( 0, n.z(), 1e-5); + + cvf::Vec3d te = calc.endTangent(); + EXPECT_NEAR( 0, te.x(), 1e-5); + EXPECT_NEAR( 0, te.y(), 1e-5); + EXPECT_NEAR(-1, te.z(), 1e-5); + } + + { + RiaArcCurveCalculator calc({ 0,0,0 }, 0, 0, { 0, 0,-1000 }); + + EXPECT_TRUE(calc.curveStatus() == RiaJCurveCalculator::OK_STRAIGHT_LINE); + + cvf::Vec3d te = calc.endTangent(); + EXPECT_NEAR(0, te.x(), 1e-5); + EXPECT_NEAR(0, te.y(), 1e-5); + EXPECT_NEAR(-1, te.z(), 1e-5); + } + } \ No newline at end of file