#3387 Add additional output from the ArcCurveCalculator

This commit is contained in:
Jacob Støren 2018-09-26 12:37:15 +02:00
parent 170da81287
commit 4170a57bf2
4 changed files with 62 additions and 9 deletions

View File

@ -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<double>::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();
}

View File

@ -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;
};

View File

@ -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();
}

View File

@ -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);
}
}