mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
#3387 Add additional output from the ArcCurveCalculator
This commit is contained in:
parent
170da81287
commit
4170a57bf2
@ -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();
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user