//# MVPosition.h: A 3D vector in space //# Copyright (C) 1996,1997,1998,1999,2000,2001 //# Associated Universities, Inc. Washington DC, USA. //# //# This library is free software; you can redistribute it and/or modify it //# under the terms of the GNU Library General Public License as published by //# the Free Software Foundation; either version 2 of the License, or (at your //# option) any later version. //# //# This library is distributed in the hope that it will be useful, but WITHOUT //# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or //# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public //# License for more details. //# //# You should have received a copy of the GNU Library General Public License //# along with this library; if not, write to the Free Software Foundation, //# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA. //# //# Correspondence concerning AIPS++ should be addressed as follows: //# Internet email: aips2-request@nrao.edu. //# Postal address: AIPS++ Project Office //# National Radio Astronomy Observatory //# 520 Edgemont Road //# Charlottesville, VA 22903-2475 USA //# //# $Id$ #ifndef CASA_MVPOSITION_H #define CASA_MVPOSITION_H //# Includes #include #include #include #include #include #include namespace casacore { //# NAMESPACE CASACORE - BEGIN //# Forward Declarations class RotMatrix; //# Constants (SUN compiler does not accept non-simple default arguments) // A 3D vector in space // // // // //
  • MeasValue //
  • Vector //
  • Quantum // // // // From Measure, Value and Position // // // // A MVPosition is a 3-vector of positions in a rectangular frame with // internal units of m.
    // It can be constructed with: //
      //
    • MVPosition() creates point at origin (0,0,0) //
    • MVPosition(MVPosition) creates a copy //
    • MVPosition(Double, Double, Double) creates (x,y,z) with // specified values //
    • MVPosition(Quantity length,Double, Double) creates a MVPosition assuming // that the two values are (in radians) angle along 'equator' // and towards 'pole'. A length of zero will be made 1um. //
    • MVPosition(Quantity length, Quantity, Quantity) creates a MVPosition // assuming angles as in previous, or positions //
    • MVPosition(Quantity, Quantum >) creates a // MVPosition from angle vector, using first two angles, and // assuming second as zero if not present, and pole if length 0. //
    • MVPosition(Quantum > creates from // angles or positions, depending on the units in the // quantum vector. In the angle case, // the data derived can be scaled with the readjust() function. If // the unit of the quantum vector is length, position is // assumed. //
    • MVPosition(Vector creates from angles (less than // or equal to two elements) or x,y,z (3 elements). //
    • MVPosition(Vector creates from length+angles, // angles, or x,y,z, depending on units. //
    // A void adjust(Double) function normalises the vector to a length of 1; // a get() returns as a // Double 3-vector the length and angles of the position vector; // a getAngle() returns a Quantum 2-vector, (uInt) returns the indicated // element, and getValue returns the vector.
    // Positions can be added and subtracted.
    // The multiplication of two positions produces the in-product.
    //
    // // // See Mposition class. // // // // To do coordinate transformations // // // //
  • See if not better to have a direction + length // class MVPosition : public MeasValue { public: //# Constants // Internal limts codes for negative height // static const Double loLimit; static const Double hiLimit; // //# Friends //# Constructors // Default constructor generates a (0,0,0) position MVPosition(); // Copy constructor MVPosition(const MVPosition &other); // Creates a specified vector MVPosition(Double in0, Double in1, Double in2); // Creates a vector with specified length towards pole // explicit MVPosition(Double in0); MVPosition(const Quantity &l); // // Creates the position from specified (azimuth,elevation) angles and length MVPosition(const Quantity &l, Double angle0, Double angle1); // Creates the position from specified angles and length. or positions // //
  • AipsError if quantities not in angle format // // MVPosition(const Quantity &l, const Quantity &angle0, const Quantity &angle1); // If not enough angles: pole assumed (if none), or elevation =0 (if 1) MVPosition(const Quantum > &angle); MVPosition(const Quantity &l, const Quantum > &angle); // // Create from specified length and/or angles and/or position // explicit MVPosition(const Vector &other); MVPosition(const Vector &other); // // Copy assignment MVPosition &operator=(const MVPosition &other); // Destructor virtual ~MVPosition(); //# Operators // Multiplication defined as in-product // Double operator*(const MVPosition &other) const; // // Equality comparisons // Bool operator== (const MVPosition &other) const; Bool operator!= (const MVPosition &other) const; Bool near(const MVPosition &other, Double tol=1e-13) const; Bool near(const MVPosition &other, Quantity tol) const; Bool nearAbs(const MVPosition &other, Double tol=1e-13) const; // // Addition and subtraction // MVPosition operator-() const; MVPosition &operator+=(const MVPosition &right); MVPosition operator+(const MVPosition &right) const; MVPosition &operator-=(const MVPosition &right); MVPosition operator-(const MVPosition &right) const; // // Multiplication with rotation matrix (see also global functions) // MVPosition &operator*=(const RotMatrix &right); // // Multiplication with constant // MVPosition &operator*=(Double right); // // Obtain an element // Double &operator()(uInt which); const Double &operator()(uInt which) const; // //# General Member Functions // Tell me your type // static void assure(const MeasValue &in); // // Normalise direction aspects by adjusting the length to 1 // // For position no adjustment; for direction adjustment virtual void adjust(); // Adjustment with returned factor virtual void adjust(Double &res); // Re-adjust using factor given virtual void readjust(Double res); // // Get radius of position virtual Double radius(); // Generate a 3-vector of coordinates (length(m), angles(rad)) Vector get() const; // Generate a 3-vector of x,y,z in m const Vector &getValue() const; // Generate angle 2-vector (in rad) Quantum > getAngle() const; // and with specified units Quantum > getAngle(const Unit &unit) const; // Get the longitudinal angle (in radians) Double getLong() const; // and with specified units Quantity getLong(const Unit &unit) const; // Get the latitude angle (rad) Double getLat() const; // and with specified units Quantity getLat(const Unit &unit) const; // Generate the length Quantity getLength() const; // and generate it with the specified units Quantity getLength(const Unit &unit) const; // Get the position angle between the directions. I.e. the angle between // the direction from one to the pole, and from one to the other. // Double positionAngle(const MVPosition &other) const; Quantity positionAngle(const MVPosition &other, const Unit &unit) const; // // Get the angular separation between two directions. // Double separation(const MVPosition &other) const; Quantity separation(const MVPosition &other, const Unit &unit) const; // // Produce the cross product MVPosition crossProduct(const MVPosition &other) const; // Print data virtual void print(ostream &os) const; // Clone virtual MeasValue *clone() const; // Get the value in internal units virtual Vector getVector() const; // Set the value from internal units (set 0 for empty vector) virtual void putVector(const Vector &in); // Get the internal value as a Vector. Usable in // records. The getXRecordValue() gets additional information for records. // Note that the Vectors could be empty. // virtual Vector > getRecordValue() const; virtual Vector > getXRecordValue() const; virtual Vector > getTMRecordValue() const { return getXRecordValue(); } ; // // Set the internal value if correct values and dimensions virtual Bool putValue(const Vector > &in); protected: //# Member functions // Get the latitude assuming length is given Double getLat(Double ln) const; //# Data // Position vector (in m) Vector xyz; }; //# Global functions // Rotate a position vector with rotation matrix and other multiplications // MVPosition operator*(const RotMatrix &left, const MVPosition &right); MVPosition operator*(const MVPosition &left, const RotMatrix &right); MVPosition operator*(Double left, const MVPosition &right); MVPosition operator*(const MVPosition &left, Double right); Double operator*(const Vector &left, const MVPosition &right); Double operator*(const MVPosition &left, const Vector &right); // } //# NAMESPACE CASACORE - END #endif