Isis 3 Programmer Reference
Sensor.cpp
1 
6 /* SPDX-License-Identifier: CC0-1.0 */
7 #include "Sensor.h"
8 
9 #include <iomanip>
10 
11 #include <QDebug>
12 #include <QString>
13 
14 #include "Angle.h"
15 #include "Constants.h"
16 #include "CubeManager.h"
17 #include "Distance.h"
18 #include "EllipsoidShape.h"
19 #include "IException.h"
20 #include "IString.h"
21 #include "iTime.h"
22 #include "Latitude.h"
23 #include "Longitude.h"
24 #include "NaifStatus.h"
25 #include "Projection.h"
26 #include "ShapeModel.h"
27 #include "SpecialPixel.h"
28 #include "SurfacePoint.h"
29 #include "Target.h"
30 #include "UniqueIOCachingAlgorithm.h"
31 
32 #define MAX(x,y) (((x) > (y)) ? (x) : (y))
33 
34 using namespace std;
35 
36 namespace Isis {
37 
45  Sensor::Sensor(Cube &cube) : Spice(cube) {
46  m_newLookB = false;
47  }
48 
49 
52  }
53 
54 
60  void Sensor::IgnoreElevationModel(bool ignore) {
61  // if we have an elevation model and are not ignoring it,
62  // set p_hasElevationModel to true
63  if (!ignore) {
64  target()->restoreShape();
65  }
66  else {
68  }
69  }
70 
71 
82 
83  QString message = "Pixel Ifov offsets not implemented for this camera.";
84  throw IException(IException::Programmer, message, _FILEINFO_);
85  }
86 
87 
97  void Sensor::setTime(const iTime &time) {
100  }
101 
102 
141  bool Sensor::SetLookDirection(const double v[3]) {
142  //std::cout << "Sensor::SetLookDirection()\n";
143  // The look vector must be in the camera coordinate system
144 
145  // copy v to LookC
146  // lookC[0] = v[0];
147  // lookC[1] = v[1];
148  // lookC[2] = v[2];
149  vector<double> lookC(v, v + 3);
150 
151  // Convert it to body-fixed
152  const vector<double> &lookJ = instrumentRotation()->J2000Vector(lookC);
153  const vector<double> &lookB = bodyRotation()->ReferenceVector(lookJ);
154 
155  // This memcpy does:
156  // m_lookB[0] = lookB[0];
157  // m_lookB[1] = lookB[1];
158  // m_lookB[2] = lookB[2];
159  memcpy(m_lookB, &lookB[0], sizeof(double) * 3);
160  m_newLookB = true;
161 
162  // Don't try to intersect the sky
163  if (target()->isSky()) {
164  target()->shape()->setHasIntersection(false);
165  return false;
166  }
167 
168  // See if it intersects the planet
169  const vector<double> &sB = bodyRotation()->ReferenceVector(
171 
172  // double tolerance = resolution() / 100.0; return
173  // target()->shape()->intersectSurface(sB, lookB, tolerance);
174  return target()->shape()->intersectSurface(sB, lookB);
175  }
176 
177 
187  return target()->shape()->hasIntersection();
188  }
189 
190 
196  void Sensor::Coordinate(double p[3]) const {
197  ShapeModel *shape = target()->shape();
198  p[0] = shape->surfaceIntersection()->GetX().kilometers();
199  p[1] = shape->surfaceIntersection()->GetY().kilometers();
200  p[2] = shape->surfaceIntersection()->GetZ().kilometers();
201  }
202 
203 
210  double Sensor::UniversalLatitude() const {
211  return GetLatitude().degrees();
212  }
213 
214 
222  return target()->shape()->surfaceIntersection()->GetLatitude();
223  }
224 
225 
233  double Sensor::UniversalLongitude() const {
234  return GetLongitude().degrees();
235  }
236 
237 
246  return target()->shape()->surfaceIntersection()->GetLongitude();
247  }
248 
249 
256  return *(target()->shape()->surfaceIntersection());
257  }
258 
259 
268  //TODO: We probably need to be validating surface intersect point is not NULL
269  // Here? or in ShapeModel? or what, man?
271  }
272 
273 
286  return target()->shape()->localRadius(lat, lon);
287  }
288 
289 
301  Distance Sensor::LocalRadius(double lat, double lon) {
302  return target()->shape()->localRadius(Latitude(lat, Angle::Degrees),
303  Longitude(lon, Angle::Degrees));
304  }
305 
306 
312  double Sensor::PhaseAngle() const {
313  std::vector<double> sunB(m_uB, m_uB+3);
314  return target()->shape()->phaseAngle(
315  bodyRotation()->ReferenceVector(instrumentPosition()->Coordinate()), sunB);
316  }
317 
318 
324  double Sensor::EmissionAngle() const {
325  return target()->shape()->emissionAngle(
326  bodyRotation()->ReferenceVector(instrumentPosition()->Coordinate()));
327  }
328 
329 
335  double Sensor::IncidenceAngle() const {
336  std::vector<double> sunB(m_uB, m_uB+3);
337  return target()->shape()->incidenceAngle(sunB);
338  }
339 
340 
359  bool Sensor::SetUniversalGround(const double latitude,
360  const double longitude,
361  bool backCheck) {
362 
363  ShapeModel *shape = target()->shape();
364  shape->clearSurfacePoint();
365 
366  // Can't intersect the sky
367  if (target()->isSky()) {
368  return false;
369  }
370 
371  // Load the latitude/longitude
372  Latitude lat(latitude, Angle::Degrees);
373  Longitude lon(longitude, Angle::Degrees);
374  // Local radius is deferred to (possible derived) shape model method
375  shape->intersectSurface(lat, lon,
376  bodyRotation()->ReferenceVector(instrumentPosition()->Coordinate()),
377  backCheck);
378 
379  return SetGroundLocal(backCheck);
380  }
381 
401  bool Sensor::SetUniversalGround(const double latitude,
402  const double longitude,
403  const double radius,
404  bool backCheck) {
405 
406  ShapeModel *shape = target()->shape();
407  shape->clearSurfacePoint();
408 
409  // Can't intersect the sky
410  if (target()->isSky()) {
411  return false;
412  }
413 
414  Latitude lat(latitude, Angle::Degrees);
415  Longitude lon(longitude, Angle::Degrees);
416  Distance rad(radius, Distance::Meters);
417 
418  shape->intersectSurface(SurfacePoint(lat, lon, rad),
419  bodyRotation()->ReferenceVector(instrumentPosition()->Coordinate()),
420  backCheck);
421 
422  return SetGroundLocal(backCheck);
423  }
424 
425 
443  bool Sensor::SetGround(const SurfacePoint &surfacePt, bool backCheck) {
444  //std::cout << "Sensor::SetGround()\n";
445  ShapeModel *shape = target()->shape();
446  shape->clearSurfacePoint();
447 
448  // Can't intersect the sky
449  if (target()->isSky()) {
450  return false;
451  }
452 
453  shape->intersectSurface(surfacePt,
454  bodyRotation()->ReferenceVector(instrumentPosition()->Coordinate()),
455  backCheck);
456 
457  return SetGroundLocal(backCheck);
458  }
459 
460 
475  bool Sensor::SetGroundLocal(bool backCheck) {
476  ShapeModel *shape = target()->shape();
477  // With the 3 spherical value compute the x/y/z coordinate
478  //latrec_c(m_radius, (m_longitude * PI / 180.0), (m_latitude * PI / 180.0), m_pB);
479 
480 
481  if (!(shape->hasIntersection())) {
482  return false;
483  }
484 
485  // Make sure the point isn't on the backside of the body
486 
487  // This is static purely for performance reasons. A significant speedup
488  // is achieved here.
489  const vector<double> &sB =
491 
492  m_lookB[0] = shape->surfaceIntersection()->GetX().kilometers() - sB[0];
493  m_lookB[1] = shape->surfaceIntersection()->GetY().kilometers() - sB[1];
494  m_lookB[2] = shape->surfaceIntersection()->GetZ().kilometers() - sB[2];
495  m_newLookB = true;
496 
497  // See if the point is on the backside of the target. Note occlusion handling
498  // now handles this in derived shape models that can support it. (KJB 2017-03-23)
499  // This may be good if the computation of the look direction is more sophisticated.
500  if (backCheck) {
501  // Assume the intersection point is good in order to get the emission angle
502  // shape->setHasIntersection(true); //KJB there should be a formal intersection in ShapeModel
503  std::vector<double> lookdir = lookDirectionBodyFixed();
504  if ( !shape->isVisibleFrom(sB, lookdir) ) {
505  shape->clearSurfacePoint();
506  shape->setHasIntersection(false);
507  return false;
508  }
509  }
510 
511  // return with success
512  shape->setHasIntersection(true);
513 
514  return true;
515  }
516 
517 
523  void Sensor::LookDirection(double v[3]) const {
524  vector<double> lookC = instrumentRotation()->ReferenceVector(lookDirectionJ2000());
525  v[0] = lookC[0];
526  v[1] = lookC[1];
527  v[2] = lookC[2];
528  }
529 
535  vector<double> Sensor::lookDirectionBodyFixed() const {
536  vector<double> lookB(3);
537  lookB[0] = m_lookB[0];
538  lookB[1] = m_lookB[1];
539  lookB[2] = m_lookB[2];
540  return lookB;
541  }
542 
543 
549  vector<double> Sensor::lookDirectionJ2000() const {
550  vector<double> lookJ = bodyRotation()->J2000Vector(lookDirectionBodyFixed());
551  return lookJ;
552  }
553 
554 
555 
562  if (m_newLookB) {
563  computeRaDec();
564  }
565  return m_ra;
566  }
567 
568 
575  if (m_newLookB) {
576  computeRaDec();
577  }
578  return m_dec;
579  }
580 
581 
586  m_newLookB = false;
587  vector<double> lookB(3);
588  lookB[0] = m_lookB[0];
589  lookB[1] = m_lookB[1];
590  lookB[2] = m_lookB[2];
591  vector<double> lookJ = bodyRotation()->J2000Vector(lookB);
592 
593  SpiceDouble range;
594  recrad_c((SpiceDouble *)&lookJ[0], &range, &m_ra, &m_dec);
595  m_ra *= 180.0 / PI;
596  m_dec *= 180.0 / PI;
597  }
598 
599 
608  bool Sensor::SetRightAscensionDeclination(const double ra, const double dec) {
609  vector<double> lookJ(3);
610  radrec_c(1.0, ra * PI / 180.0, dec * PI / 180.0, (SpiceDouble *)&lookJ[0]);
611 
612  vector<double> lookC = instrumentRotation()->ReferenceVector(lookJ);
613  return SetLookDirection((double *)&lookC[0]);
614  }
615 
616 
625  void Sensor::SpacecraftSurfaceVector(double scSurfaceVector[3]) const {
626  scSurfaceVector[0] = m_lookB[0];
627  scSurfaceVector[1] = m_lookB[1];
628  scSurfaceVector[2] = m_lookB[2];
629  }
630 
631 
637  double Sensor::SlantDistance() const {
638  SpiceDouble psB[3], upsB[3];
639  SpiceDouble dist;
640 
641  std::vector<double> sB = bodyRotation()->ReferenceVector(instrumentPosition()->Coordinate());
642 
643  SpiceDouble pB[3];
644  ShapeModel *shape = target()->shape();
645  pB[0] = shape->surfaceIntersection()->GetX().kilometers();
646  pB[1] = shape->surfaceIntersection()->GetY().kilometers();
647  pB[2] = shape->surfaceIntersection()->GetZ().kilometers();
648 
649  vsub_c(pB, (SpiceDouble *) &sB[0], psB);
650  unorm_c(psB, upsB, &dist);
651  return dist;
652  }
653 
654 
661  double slat, slon;
662  subSolarPoint(slat, slon);
663 
664  double lst = UniversalLongitude() - slon + 180.0;
665  lst = lst / 15.0; // 15 degress per hour
666  if (lst < 0.0) lst += 24.0;
667  if (lst > 24.0) lst -= 24.0;
668  return lst;
669  }
670 
671 
677  double Sensor::SolarDistance() const {
678  // Get the sun coord
679  double sB[3];
680  Spice::sunPosition(sB);
681 
682  // Calc the change
683  ShapeModel *shape = target()->shape();
684  double xChange = sB[0] - shape->surfaceIntersection()->GetX().kilometers();
685  double yChange = sB[1] - shape->surfaceIntersection()->GetY().kilometers();
686  double zChange = sB[2] - shape->surfaceIntersection()->GetZ().kilometers();
687 
688  // Calc the distance and convert to AU
689  double dist = sqrt(xChange*xChange + yChange*yChange + zChange*zChange);
690  dist /= 149597870.691;
691  return dist;
692  }
693 
694 
702  // Get the spacecraft coord
703  double spB[3];
705 
706  // Get subspacecraft point
707  double lat, lon;
708  subSpacecraftPoint(lat, lon);
709  double rlat = lat * PI / 180.0;
710  double rlon = lon * PI / 180.0;
711 
712  // Compute radius
713  Distance rad = LocalRadius(lat, lon);
714 
715  // Now with the 3 spherical value compute the x/y/z coordinate
716  double ssB[3];
717  latrec_c(rad.kilometers(), rlon, rlat, ssB);
718 
719  // Calc the change
720  double xChange = spB[0] - ssB[0];
721  double yChange = spB[1] - ssB[1];
722  double zChange = spB[2] - ssB[2];
723 
724  // Calc the distance
725  double dist = sqrt(xChange*xChange + yChange*yChange + zChange*zChange);
726  return dist;
727  }
728 
729 
735 // Distance Sensor::DemRadius(const SurfacePoint &pt) {
736 // return DemRadius(pt.GetLatitude(), pt.GetLongitude());
737 // }
738 
739 
746 // Distance Sensor::DemRadius(const Latitude &lat, const Longitude &lon) {
747 // if (!m_hasElevationModel) return Distance();
748 // //if (!lat.Valid() || !lon.Valid()) return Distance();
749 // m_demProj->SetUniversalGround(lat.degrees(), lon.degrees());
750 // if (!m_demProj->IsGood()) {
751 // return Distance();
752 // }
753 
754 // m_portal->SetPosition(m_demProj->WorldX(), m_demProj->WorldY(), 1);
755 
756 // m_demCube->read(*m_portal);
757 
758 // const double &radius = m_interp->Interpolate(m_demProj->WorldX(),
759 // m_demProj->WorldY(),
760 // m_portal->DoubleBuffer());
761 
762 // return Distance(radius, Distance::Meters);
763 // Distance fred;
764 // return fred;
765 // }
766 
767 
778 // double Sensor::DemRadius(double lat, double lon) {
779 // if (!m_demProj->SetUniversalGround(lat, lon)) {
780 // return Isis::Null;
781 // }
782 
783 // m_portal->SetPosition(m_demProj->WorldX(), m_demProj->WorldY(), 1);
784 // m_demCube->read(*m_portal);
785 
786 // double radius = m_interp->Interpolate(m_demProj->WorldX(),
787 // m_demProj->WorldY(),
788 // m_portal->DoubleBuffer());
789 // if (Isis::IsSpecial(radius)) {
790 // return Isis::Null;
791 // }
792 
793 // return radius / 1000.0;
794 // double fred;
795 // return fred;
796 // }
803 // bool HasElevationModel() {
804 // return m_hasElevationModel;
805 // };
806 
807 }
Isis::Distance::kilometers
double kilometers() const
Get the distance in kilometers.
Definition: Distance.cpp:106
Isis::Angle::Degrees
@ Degrees
Degrees are generally considered more human readable, 0-360 is one circle, however most math does not...
Definition: Angle.h:56
Isis::Spice::setTime
virtual void setTime(const iTime &time)
Sets the ephemeris time and reads the spacecraft and sun position from the kernels at that instant in...
Definition: Spice.cpp:780
Isis::Spice::time
iTime time() const
Returns the ephemeris time in seconds which was used to obtain the spacecraft and sun positions.
Definition: Spice.cpp:884
Isis::ShapeModel::emissionAngle
virtual double emissionAngle(const std::vector< double > &sB)
Computes and returns emission angle, in degrees, given the observer position.
Definition: ShapeModel.cpp:185
Isis::Target::setShapeEllipsoid
void setShapeEllipsoid()
Set the shape to the ellipsoid and save the original shape.
Definition: Target.cpp:603
Isis::Sensor::SpacecraftSurfaceVector
void SpacecraftSurfaceVector(double scSurfaceVector[3]) const
Sets the vector between the spacecraft and surface point in body-fixed.
Definition: Sensor.cpp:625
Isis::Target::shape
ShapeModel * shape() const
Return the shape.
Definition: Target.cpp:655
Isis::Spice::subSolarPoint
virtual void subSolarPoint(double &lat, double &lon)
Returns the sub-solar latitude/longitude in universal coordinates (0-360 positive east,...
Definition: Spice.cpp:1329
Isis::ShapeModel::clearSurfacePoint
virtual void clearSurfacePoint()
Clears or resets the current surface point.
Definition: ShapeModel.cpp:386
Isis::Spice::subSpacecraftPoint
virtual void subSpacecraftPoint(double &lat, double &lon)
Returns the sub-spacecraft latitude/longitude in universal coordinates (0-360 positive east,...
Definition: Spice.cpp:1278
Isis::Spice::instrumentPosition
virtual SpicePosition * instrumentPosition() const
Accessor method for the instrument position.
Definition: Spice.cpp:1600
Isis::Sensor::~Sensor
virtual ~Sensor()
Destroys the Sensor.
Definition: Sensor.cpp:51
Isis::PI
const double PI
The mathematical constant PI.
Definition: Constants.h:40
Isis::Sensor::SpacecraftAltitude
double SpacecraftAltitude()
Returns the distance from the spacecraft to the subspacecraft point in km.
Definition: Sensor.cpp:701
Isis::Sensor::SetUniversalGround
bool SetUniversalGround(const double latitude, const double longitude, bool backCheck=true)
This is the opposite routine for SetLookDirection.
Definition: Sensor.cpp:359
QList< QPointF >
Isis::Latitude
This class is designed to encapsulate the concept of a Latitude.
Definition: Latitude.h:51
Isis::ShapeModel::surfaceIntersection
SurfacePoint * surfaceIntersection() const
Returns the surface intersection for this ShapeModel.
Definition: ShapeModel.cpp:358
Isis::Sensor::HasSurfaceIntersection
bool HasSurfaceIntersection() const
Returns if the last call to either SetLookDirection or SetUniversalGround had a valid intersection wi...
Definition: Sensor.cpp:186
Isis::iTime
Parse and return pieces of a time string.
Definition: iTime.h:65
Isis::Sensor::lookDirectionJ2000
std::vector< double > lookDirectionJ2000() const
Returns the look direction in the camera coordinate system.
Definition: Sensor.cpp:549
Isis::ShapeModel::setHasIntersection
void setHasIntersection(bool b)
Sets the flag to indicate whether this ShapeModel has an intersection.
Definition: ShapeModel.cpp:554
Isis::ShapeModel::incidenceAngle
virtual double incidenceAngle(const std::vector< double > &uB)
Computes and returns incidence angle, in degrees, given the illuminator position.
Definition: ShapeModel.cpp:232
Isis::Sensor::SetGroundLocal
bool SetGroundLocal(bool backCheck)
Computes look vector.
Definition: Sensor.cpp:475
Isis::Sensor::Declination
virtual double Declination()
Returns the declination angle (sky latitude).
Definition: Sensor.cpp:574
Isis::Sensor::GetLongitude
Longitude GetLongitude() const
Returns a positive east, 0-360 domain longitude object at the surface intersection point in the body ...
Definition: Sensor.cpp:245
Isis::SurfacePoint::GetLatitude
Latitude GetLatitude() const
Return the body-fixed latitude for the surface point.
Definition: SurfacePoint.cpp:1665
Isis::Sensor::PixelIfovOffsets
virtual QList< QPointF > PixelIfovOffsets()
This method is implemented in Camera which defaults to the (pixel pitch * summing mode ) / 2.
Definition: Sensor.cpp:81
Isis::Sensor::LocalSolarTime
double LocalSolarTime()
Return the local solar time in hours.
Definition: Sensor.cpp:660
Isis::Spice::sunPosition
virtual SpicePosition * sunPosition() const
Accessor method for the sun position.
Definition: Spice.cpp:1589
Isis::Sensor::GetSurfacePoint
SurfacePoint GetSurfacePoint() const
Returns the surface point (most efficient accessor).
Definition: Sensor.cpp:255
Isis::SpiceRotation::J2000Vector
std::vector< double > J2000Vector(const std::vector< double > &rVec)
Given a direction vector in the reference frame, return a J2000 direction.
Definition: SpiceRotation.cpp:1408
Isis::Sensor::RightAscension
virtual double RightAscension()
Returns the right ascension angle (sky longitude).
Definition: Sensor.cpp:561
Isis::Sensor::IgnoreElevationModel
void IgnoreElevationModel(bool ignore)
This allows you to ignore the cube elevation model and use the ellipse.
Definition: Sensor.cpp:60
Isis::Distance
Distance measurement, usually in meters.
Definition: Distance.h:34
Isis::Longitude
This class is designed to encapsulate the concept of a Longitude.
Definition: Longitude.h:40
Isis::Sensor::lookDirectionBodyFixed
std::vector< double > lookDirectionBodyFixed() const
Returns the look direction in the body fixed coordinate system.
Definition: Sensor.cpp:535
Isis::Spice::target
virtual Target * target() const
Returns a pointer to the target object.
Definition: Spice.cpp:1368
Isis::Spice::instrumentRotation
virtual SpiceRotation * instrumentRotation() const
Accessor method for the instrument rotation.
Definition: Spice.cpp:1622
Isis::Sensor::setTime
void setTime(const iTime &time)
By setting the time you essential set the position of the spacecraft and body as indicated in the cla...
Definition: Sensor.cpp:97
Isis::Sensor::m_ra
SpiceDouble m_ra
Right ascension (sky longitude)
Definition: Sensor.h:249
Isis::Distance::Meters
@ Meters
The distance is being specified in meters.
Definition: Distance.h:43
Isis::Sensor::UniversalLongitude
virtual double UniversalLongitude() const
Returns the positive east, 0-360 domain longitude, in degrees, at the surface intersection point in t...
Definition: Sensor.cpp:233
Isis::Sensor::LookDirection
void LookDirection(double v[3]) const
Returns the look direction in the camera coordinate system.
Definition: Sensor.cpp:523
Isis::Spice::m_uB
SpiceDouble m_uB[3]
This contains the sun position (u) in the bodyfixed reference frame (B).
Definition: Spice.h:369
Isis::Target::restoreShape
void restoreShape()
Restores the shape to the original after setShapeEllipsoid has overridden it.
Definition: Target.cpp:585
Isis::Spice::bodyRotation
virtual SpiceRotation * bodyRotation() const
Accessor method for the body rotation.
Definition: Spice.cpp:1611
Isis::Cube
IO Handler for Isis Cubes.
Definition: Cube.h:167
Isis::IException
Isis exception class.
Definition: IException.h:91
Isis::Sensor::IncidenceAngle
virtual double IncidenceAngle() const
Returns the incidence angle in degrees.
Definition: Sensor.cpp:335
Isis::Spice
Obtain SPICE information for a spacecraft.
Definition: Spice.h:283
Isis::Sensor::GetLatitude
Latitude GetLatitude() const
Returns a planetocentric latitude object at the surface intersection point in body fixed.
Definition: Sensor.cpp:221
Isis::SurfacePoint::GetLongitude
Longitude GetLongitude() const
Return the body-fixed longitude for the surface point.
Definition: SurfacePoint.cpp:1685
Isis::Displacement::kilometers
double kilometers() const
Get the displacement in kilometers.
Definition: Displacement.cpp:94
Isis::Sensor::SolarDistance
virtual double SolarDistance() const
Returns the distance between the sun and surface point in AU.
Definition: Sensor.cpp:677
Isis::SurfacePoint::GetLocalRadius
Distance GetLocalRadius() const
Return the radius of the surface point.
Definition: SurfacePoint.cpp:1732
Isis::IException::Programmer
@ Programmer
This error is for when a programmer made an API call that was illegal.
Definition: IException.h:146
std
Namespace for the standard library.
Isis::Sensor::m_dec
SpiceDouble m_dec
Decliation (sky latitude)
Definition: Sensor.h:250
Isis::Sensor::m_newLookB
bool m_newLookB
flag to indicate we need to recompute ra/dec
Definition: Sensor.h:240
Isis::ShapeModel
Define shapes and provide utilities for Isis targets.
Definition: ShapeModel.h:62
Isis::Sensor::SetLookDirection
bool SetLookDirection(const double v[3])
Sets the look direction of the spacecraft.
Definition: Sensor.cpp:141
Isis::Sensor::SetRightAscensionDeclination
bool SetRightAscensionDeclination(const double ra, const double dec)
Given the ra/dec compute the look direction.
Definition: Sensor.cpp:608
Isis::ShapeModel::phaseAngle
virtual double phaseAngle(const std::vector< double > &sB, const std::vector< double > &uB)
Computes and returns phase angle, in degrees, given the positions of the observer and illuminator.
Definition: ShapeModel.cpp:324
Isis::Angle::degrees
double degrees() const
Get the angle in units of Degrees.
Definition: Angle.h:232
Isis::Sensor::PhaseAngle
virtual double PhaseAngle() const
Returns the phase angle in degrees.
Definition: Sensor.cpp:312
Isis::ShapeModel::hasIntersection
bool hasIntersection()
Returns intersection status.
Definition: ShapeModel.cpp:368
Isis::Sensor::Coordinate
void Coordinate(double p[3]) const
Returns the x,y,z of the surface intersection in BodyFixed km.
Definition: Sensor.cpp:196
Isis::Sensor::EmissionAngle
virtual double EmissionAngle() const
Returns the emission angle in degrees.
Definition: Sensor.cpp:324
Isis::SpiceRotation::ReferenceVector
std::vector< double > ReferenceVector(const std::vector< double > &jVec)
Given a direction vector in J2000, return a reference frame direction.
Definition: SpiceRotation.cpp:1700
Isis::Sensor::m_lookB
SpiceDouble m_lookB[3]
Look direction in body fixed.
Definition: Sensor.h:239
Isis::Sensor::computeRaDec
void computeRaDec()
Computes the ra/dec from the look direction.
Definition: Sensor.cpp:585
Isis::ShapeModel::isVisibleFrom
virtual bool isVisibleFrom(const std::vector< double > observerPos, const std::vector< double > lookDirection)
Default occulsion implementation.
Definition: ShapeModel.cpp:431
Isis::SurfacePoint
This class defines a body-fixed surface point.
Definition: SurfacePoint.h:132
Isis
This is free and unencumbered software released into the public domain.
Definition: Apollo.h:16
Isis::Sensor::SlantDistance
virtual double SlantDistance() const
Return the distance between the spacecraft and surface point in kmv.
Definition: Sensor.cpp:637
Isis::Sensor::LocalRadius
Distance LocalRadius() const
Returns the local radius at the intersection point.
Definition: Sensor.cpp:267
Isis::Sensor::SetGround
bool SetGround(const SurfacePoint &surfacePt, bool backCheck=true)
This overloaded method has the opposite function as SetLookDirection.
Definition: Sensor.cpp:443
Isis::Sensor::UniversalLatitude
virtual double UniversalLatitude() const
Returns the planetocentric latitude, in degrees, at the surface intersection point in the body fixed ...
Definition: Sensor.cpp:210