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); | ||||
| } | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
| 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, | ||||
|     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_, | ||||
|       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_); | ||||
| } | ||||
| 
 | ||||
|  | @ -116,6 +146,12 @@ ostream &operator<<(ostream &os, const Point3& p) { | |||
|   return os; | ||||
| } | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
| ostream &operator<<(ostream &os, const gtsam::Point3Pair &p) { | ||||
|   os << p.first << " <-> " << p.second; | ||||
|   return os; | ||||
| } | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
| 
 | ||||
| } // namespace gtsam
 | ||||
|  |  | |||
|  | @ -37,8 +37,8 @@ namespace gtsam { | |||
| 
 | ||||
|   private: | ||||
| 
 | ||||
|     double x_, y_, z_;   | ||||
|      | ||||
|     double x_, y_, z_; | ||||
| 
 | ||||
|   public: | ||||
|     enum { dimension = 3 }; | ||||
| 
 | ||||
|  | @ -56,7 +56,7 @@ namespace gtsam { | |||
|     /// @{
 | ||||
| 
 | ||||
|     /// Construct from 3-element vector
 | ||||
|     Point3(const Vector3& v) { | ||||
|     explicit Point3(const Vector3& v) { | ||||
|       x_ = v(0); | ||||
|       y_ = v(1); | ||||
|       z_ = v(2); | ||||
|  | @ -82,6 +82,11 @@ namespace gtsam { | |||
|     /// inverse
 | ||||
|     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
 | ||||
|     Point3 operator + (const Point3& q) const; | ||||
| 
 | ||||
|  | @ -99,20 +104,8 @@ namespace gtsam { | |||
|     Point3 operator / (double s) const; | ||||
| 
 | ||||
|     /** distance between two points */ | ||||
|     inline double distance(const Point3& p2, | ||||
|         OptionalJacobian<1,3> H1 = boost::none, 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; | ||||
|     } | ||||
|     double distance(const Point3& p2, OptionalJacobian<1, 3> H1 = boost::none, | ||||
|                     OptionalJacobian<1, 3> H2 = boost::none) const; | ||||
| 
 | ||||
|     /** @deprecated The following function has been deprecated, use distance above */ | ||||
|     inline double dist(const Point3& p2) const { | ||||
|  | @ -126,17 +119,19 @@ namespace gtsam { | |||
|     Point3 normalize(OptionalJacobian<3, 3> H = boost::none) const; | ||||
| 
 | ||||
|     /** 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*/ | ||||
|     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
 | ||||
|     /// @{
 | ||||
| 
 | ||||
|     /// equality
 | ||||
|     bool   operator ==(const Point3& q) const; | ||||
|     bool operator ==(const Point3& q) const; | ||||
| 
 | ||||
|     /** return vectorized form (column-wise)*/ | ||||
|     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
 | ||||
| inline Point3 operator*(double s, const Point3& p) { return p*s;} | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue