From d8434c15aaae84ead791107ab6c4ebd72442fd5d Mon Sep 17 00:00:00 2001
From: Jesse Mapel <jam826@nau.edu>
Date: Thu, 18 Apr 2019 13:58:08 -0700
Subject: [PATCH] Made framer inherit from settable ellipsoid (#228)

* Made framer inherit from settable ellipsoid

* Added radii tests
---
 include/usgscsm/UsgsAstroFrameSensorModel.h | 13 ++++++++++++-
 src/UsgsAstroFrameSensorModel.cpp           | 15 +++++++++++++++
 tests/FrameCameraTests.cpp                  | 14 ++++++++++++++
 3 files changed, 41 insertions(+), 1 deletion(-)

diff --git a/include/usgscsm/UsgsAstroFrameSensorModel.h b/include/usgscsm/UsgsAstroFrameSensorModel.h
index c07d317..10c4e6c 100644
--- a/include/usgscsm/UsgsAstroFrameSensorModel.h
+++ b/include/usgscsm/UsgsAstroFrameSensorModel.h
@@ -6,6 +6,7 @@
 #include <iostream>
 #include <vector>
 #include "RasterGM.h"
+#include <SettableEllipsoid.h>
 #include "CorrelationModel.h"
 #include "Distortion.h"
 #include "Utilities.h"
@@ -18,7 +19,7 @@
 using json = nlohmann::json;
 
 
-class UsgsAstroFrameSensorModel : public csm::RasterGM {
+class UsgsAstroFrameSensorModel : public csm::RasterGM, virtual public csm::SettableEllipsoid {
   // UsgsAstroFramePlugin needs to access private members
   friend class UsgsAstroFramePlugin;
 
@@ -288,6 +289,16 @@ class UsgsAstroFrameSensorModel : public csm::RasterGM {
       //  If the argument state string is empty, the model remains unchanged.
       //<
 
+      // Implement methods from the SettableEllipsoid class
+
+      virtual csm::Ellipsoid getEllipsoid() const;
+      //> This method returns the planetary ellipsoid.
+      //<
+
+      virtual void setEllipsoid(const csm::Ellipsoid &ellipsoid);
+      //> This method sets the planetary ellipsoid.
+      //<
+
     // IMPLEMENT GEOMETRICMODEL PURE VIRTUALS
     // See GeometricModel.h for documentation
     virtual csm::EcefCoord getReferencePoint() const;
diff --git a/src/UsgsAstroFrameSensorModel.cpp b/src/UsgsAstroFrameSensorModel.cpp
index dc27565..86562d2 100644
--- a/src/UsgsAstroFrameSensorModel.cpp
+++ b/src/UsgsAstroFrameSensorModel.cpp
@@ -1170,6 +1170,21 @@ std::vector<double> UsgsAstroFrameSensorModel::getCrossCovarianceMatrix(
 }
 
 
+csm::Ellipsoid UsgsAstroFrameSensorModel::getEllipsoid() const {
+   MESSAGE_LOG(this->m_logger, "Accessing ellipsoid radii {} {}",
+               m_majorAxis, m_minorAxis);
+   return csm::Ellipsoid(m_majorAxis, m_minorAxis);
+}
+
+
+void UsgsAstroFrameSensorModel::setEllipsoid(const csm::Ellipsoid &ellipsoid) {
+   MESSAGE_LOG(this->m_logger, "Setting ellipsoid radii {} {}",
+               ellipsoid.getSemiMajorRadius(), ellipsoid.getSemiMinorRadius());
+   m_majorAxis = ellipsoid.getSemiMajorRadius();
+   m_minorAxis = ellipsoid.getSemiMinorRadius();
+}
+
+
 void UsgsAstroFrameSensorModel::calcRotationMatrix(
     double m[3][3]) const {
   MESSAGE_LOG(this->m_logger, "Calculating rotation matrix");
diff --git a/tests/FrameCameraTests.cpp b/tests/FrameCameraTests.cpp
index 31fd953..3b49b67 100644
--- a/tests/FrameCameraTests.cpp
+++ b/tests/FrameCameraTests.cpp
@@ -95,6 +95,20 @@ TEST_F(OrbitalFrameSensorModel, Center) {
    EXPECT_DOUBLE_EQ(groundPt.z, 0);
 }
 
+TEST_F(FrameSensorModel, Radii) {
+   csm::Ellipsoid ellipsoid = sensorModel->getEllipsoid();
+   EXPECT_DOUBLE_EQ(ellipsoid.getSemiMajorRadius(), 10);
+   EXPECT_DOUBLE_EQ(ellipsoid.getSemiMinorRadius(), 10);
+}
+
+TEST_F(FrameSensorModel, SetRadii) {
+   csm::Ellipsoid ellipsoid1(1000, 1500);
+   sensorModel->setEllipsoid(ellipsoid1);
+   csm::Ellipsoid ellipsoid2 = sensorModel->getEllipsoid();
+   EXPECT_DOUBLE_EQ(ellipsoid2.getSemiMajorRadius(), 1000);
+   EXPECT_DOUBLE_EQ(ellipsoid2.getSemiMinorRadius(), 1500);
+}
+
 TEST_F(OrbitalFrameSensorModel, GroundPartials) {
    csm::EcefCoord groundPt(1000000.0, 0.0, 0.0);
    std::vector<double> partials = sensorModel->computeGroundPartials(groundPt);
-- 
GitLab