Some additional derivatives (for cvross) and operators
							parent
							
								
									4c22355f56
								
							
						
					
					
						commit
						06520a3b1d
					
				|  | @ -58,6 +58,22 @@ Point3 Point3::operator/(double s) const { | ||||||
|   return Point3(x_ / s, y_ / s, z_ / s); |   return Point3(x_ / s, y_ / s, z_ / s); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /* ************************************************************************* */ | ||||||
|  | double Point3::distance(const Point3 &p2, OptionalJacobian<1, 3> H1, | ||||||
|  |                         OptionalJacobian<1, 3> H2) const { | ||||||
|  |   double d = (p2 - *this).norm(); | ||||||
|  |   if (H1) { | ||||||
|  |     *H1 << x_ - p2.x(), y_ - p2.y(), z_ - p2.z(); | ||||||
|  |     *H1 = *H1 *(1. / d); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   if (H2) { | ||||||
|  |     *H2 << -x_ + p2.x(), -y_ + p2.y(), -z_ + p2.z(); | ||||||
|  |     *H2 = *H2 *(1. / d); | ||||||
|  |   } | ||||||
|  |   return d; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /* ************************************************************************* */ | /* ************************************************************************* */ | ||||||
| Point3 Point3::add(const Point3 &q, OptionalJacobian<3,3> H1, | Point3 Point3::add(const Point3 &q, OptionalJacobian<3,3> H1, | ||||||
|     OptionalJacobian<3,3> H2) const { |     OptionalJacobian<3,3> H2) const { | ||||||
|  | @ -75,13 +91,27 @@ Point3 Point3::sub(const Point3 &q, OptionalJacobian<3,3> H1, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* ************************************************************************* */ | /* ************************************************************************* */ | ||||||
| Point3 Point3::cross(const Point3 &q) const { | Point3 Point3::cross(const Point3 &q, OptionalJacobian<3, 3> H_p, OptionalJacobian<3, 3> H_q) const { | ||||||
|  |   if (H_p) { | ||||||
|  |     *H_p << skewSymmetric(-q.vector()); | ||||||
|  |   } | ||||||
|  |   if (H_q) { | ||||||
|  |     *H_q << skewSymmetric(vector()); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   return Point3(y_ * q.z_ - z_ * q.y_, z_ * q.x_ - x_ * q.z_, |   return Point3(y_ * q.z_ - z_ * q.y_, z_ * q.x_ - x_ * q.z_, | ||||||
|       x_ * q.y_ - y_ * q.x_); |       x_ * q.y_ - y_ * q.x_); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* ************************************************************************* */ | /* ************************************************************************* */ | ||||||
| double Point3::dot(const Point3 &q) const { | double Point3::dot(const Point3 &q, OptionalJacobian<1, 3> H_p, OptionalJacobian<1, 3> H_q) const { | ||||||
|  |   if (H_p) { | ||||||
|  |     *H_p << q.vector().transpose(); | ||||||
|  |   } | ||||||
|  |   if (H_q) { | ||||||
|  |     *H_q << vector().transpose(); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   return (x_ * q.x_ + y_ * q.y_ + z_ * q.z_); |   return (x_ * q.x_ + y_ * q.y_ + z_ * q.z_); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -116,6 +146,12 @@ ostream &operator<<(ostream &os, const Point3& p) { | ||||||
|   return os; |   return os; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /* ************************************************************************* */ | ||||||
|  | ostream &operator<<(ostream &os, const gtsam::Point3Pair &p) { | ||||||
|  |   os << p.first << " <-> " << p.second; | ||||||
|  |   return os; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /* ************************************************************************* */ | /* ************************************************************************* */ | ||||||
| 
 | 
 | ||||||
| } // namespace gtsam
 | } // namespace gtsam
 | ||||||
|  |  | ||||||
|  | @ -37,8 +37,8 @@ namespace gtsam { | ||||||
| 
 | 
 | ||||||
|   private: |   private: | ||||||
| 
 | 
 | ||||||
|     double x_, y_, z_;   |     double x_, y_, z_; | ||||||
|      | 
 | ||||||
|   public: |   public: | ||||||
|     enum { dimension = 3 }; |     enum { dimension = 3 }; | ||||||
| 
 | 
 | ||||||
|  | @ -56,7 +56,7 @@ namespace gtsam { | ||||||
|     /// @{
 |     /// @{
 | ||||||
| 
 | 
 | ||||||
|     /// Construct from 3-element vector
 |     /// Construct from 3-element vector
 | ||||||
|     Point3(const Vector3& v) { |     explicit Point3(const Vector3& v) { | ||||||
|       x_ = v(0); |       x_ = v(0); | ||||||
|       y_ = v(1); |       y_ = v(1); | ||||||
|       z_ = v(2); |       z_ = v(2); | ||||||
|  | @ -82,6 +82,11 @@ namespace gtsam { | ||||||
|     /// inverse
 |     /// inverse
 | ||||||
|     Point3 operator - () const { return Point3(-x_,-y_,-z_);} |     Point3 operator - () const { return Point3(-x_,-y_,-z_);} | ||||||
| 
 | 
 | ||||||
|  |     /// add vector on right
 | ||||||
|  |     inline Point3 operator +(const Vector3& v) const { | ||||||
|  |       return Point3(x_ + v[0], y_ + v[1], z_ + v[2]); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     /// add
 |     /// add
 | ||||||
|     Point3 operator + (const Point3& q) const; |     Point3 operator + (const Point3& q) const; | ||||||
| 
 | 
 | ||||||
|  | @ -99,20 +104,8 @@ namespace gtsam { | ||||||
|     Point3 operator / (double s) const; |     Point3 operator / (double s) const; | ||||||
| 
 | 
 | ||||||
|     /** distance between two points */ |     /** distance between two points */ | ||||||
|     inline double distance(const Point3& p2, |     double distance(const Point3& p2, OptionalJacobian<1, 3> H1 = boost::none, | ||||||
|         OptionalJacobian<1,3> H1 = boost::none, OptionalJacobian<1,3> H2 = boost::none) const { |                     OptionalJacobian<1, 3> H2 = boost::none) const; | ||||||
|       double d = (p2 - *this).norm(); |  | ||||||
|       if (H1) { |  | ||||||
|         *H1 << x_-p2.x(), y_-p2.y(), z_-p2.z(); |  | ||||||
|         *H1 = *H1 *(1./d); |  | ||||||
|       } |  | ||||||
| 
 |  | ||||||
|       if (H2) { |  | ||||||
|         *H2 << -x_+p2.x(), -y_+p2.y(), -z_+p2.z(); |  | ||||||
|         *H2 << *H2 *(1./d); |  | ||||||
|       } |  | ||||||
|       return d; |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|     /** @deprecated The following function has been deprecated, use distance above */ |     /** @deprecated The following function has been deprecated, use distance above */ | ||||||
|     inline double dist(const Point3& p2) const { |     inline double dist(const Point3& p2) const { | ||||||
|  | @ -126,17 +119,19 @@ namespace gtsam { | ||||||
|     Point3 normalize(OptionalJacobian<3, 3> H = boost::none) const; |     Point3 normalize(OptionalJacobian<3, 3> H = boost::none) const; | ||||||
| 
 | 
 | ||||||
|     /** cross product @return this x q */ |     /** cross product @return this x q */ | ||||||
|     Point3 cross(const Point3 &q) const; |     Point3 cross(const Point3 &q, OptionalJacobian<3, 3> H_p = boost::none, //
 | ||||||
|  |                                   OptionalJacobian<3, 3> H_q = boost::none) const; | ||||||
| 
 | 
 | ||||||
|     /** dot product @return this * q*/ |     /** dot product @return this * q*/ | ||||||
|     double dot(const Point3 &q) const; |     double dot(const Point3 &q, OptionalJacobian<1, 3> H_p = boost::none, //
 | ||||||
|  |                                 OptionalJacobian<1, 3> H_q = boost::none) const; | ||||||
| 
 | 
 | ||||||
|     /// @}
 |     /// @}
 | ||||||
|     /// @name Standard Interface
 |     /// @name Standard Interface
 | ||||||
|     /// @{
 |     /// @{
 | ||||||
| 
 | 
 | ||||||
|     /// equality
 |     /// equality
 | ||||||
|     bool   operator ==(const Point3& q) const; |     bool operator ==(const Point3& q) const; | ||||||
| 
 | 
 | ||||||
|     /** return vectorized form (column-wise)*/ |     /** return vectorized form (column-wise)*/ | ||||||
|     Vector3 vector() const { return Vector3(x_,y_,z_); } |     Vector3 vector() const { return Vector3(x_,y_,z_); } | ||||||
|  | @ -192,6 +187,10 @@ namespace gtsam { | ||||||
|     /// @}
 |     /// @}
 | ||||||
|   }; |   }; | ||||||
| 
 | 
 | ||||||
|  | // Convenience typedef
 | ||||||
|  | typedef std::pair<Point3, Point3> Point3Pair; | ||||||
|  | std::ostream &operator<<(std::ostream &os, const gtsam::Point3Pair &p); | ||||||
|  | 
 | ||||||
| /// Syntactic sugar for multiplying coordinates by a scalar s*p
 | /// Syntactic sugar for multiplying coordinates by a scalar s*p
 | ||||||
| inline Point3 operator*(double s, const Point3& p) { return p*s;} | inline Point3 operator*(double s, const Point3& p) { return p*s;} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue