GTSAM  4.0.2
C++ library for smoothing and mapping (SAM)
Point2.h
Go to the documentation of this file.
1 /* ----------------------------------------------------------------------------
2 
3  * GTSAM Copyright 2010, Georgia Tech Research Corporation,
4  * Atlanta, Georgia 30332-0415
5  * All Rights Reserved
6  * Authors: Frank Dellaert, et al. (see THANKS for the full author list)
7 
8  * See LICENSE for the license information
9 
10  * -------------------------------------------------------------------------- */
11 
18 #pragma once
19 
20 #include <gtsam/base/VectorSpace.h>
21 #include <gtsam/base/std_optional_serialization.h>
22 #ifdef GTSAM_ENABLE_BOOST_SERIALIZATION
23 #include <boost/serialization/nvp.hpp>
24 #endif
25 
26 #include <optional>
27 
28 namespace gtsam {
29 
32 typedef Vector2 Point2;
33 
34 // Convenience typedef
35 using Point2Pair = std::pair<Point2, Point2>;
36 GTSAM_EXPORT std::ostream &operator<<(std::ostream &os, const gtsam::Point2Pair &p);
37 
38 using Point2Pairs = std::vector<Point2Pair>;
39 
41 GTSAM_EXPORT double norm2(const Point2& p, OptionalJacobian<1, 2> H = {});
42 
44 GTSAM_EXPORT double distance2(const Point2& p1, const Point2& q,
45  OptionalJacobian<1, 2> H1 = {},
46  OptionalJacobian<1, 2> H2 = {});
47 
48 // For MATLAB wrapper
49 typedef std::vector<Point2, Eigen::aligned_allocator<Point2> > Point2Vector;
50 
52 inline Point2 operator*(double s, const Point2& p) {
53  return Point2(s * p.x(), s * p.y());
54 }
55 
56 /*
57  * @brief Circle-circle intersection, given normalized radii.
58  * Calculate f and h, respectively the parallel and perpendicular distance of
59  * the intersections of two circles along and from the line connecting the centers.
60  * Both are dimensionless fractions of the distance d between the circle centers.
61  * If the circles do not intersect or they are identical, returns {}.
62  * If one solution (touching circles, as determined by tol), h will be exactly zero.
63  * h is a good measure for how accurate the intersection will be, as when circles touch
64  * or nearly touch, the intersection is ill-defined with noisy radius measurements.
65  * @param R_d : R/d, ratio of radius of first circle to distance between centers
66  * @param r_d : r/d, ratio of radius of second circle to distance between centers
67  * @param tol: absolute tolerance below which we consider touching circles
68  * @return optional Point2 with f and h, {} if no solution.
69  */
70 GTSAM_EXPORT std::optional<Point2> circleCircleIntersection(double R_d, double r_d, double tol = 1e-9);
71 
72 /*
73  * @brief Circle-circle intersection, from the normalized radii solution.
74  * @param c1 center of first circle
75  * @param c2 center of second circle
76  * @return list of solutions (0,1, or 2). Identical circles will return empty list, as well.
77  */
78 GTSAM_EXPORT std::list<Point2> circleCircleIntersection(Point2 c1, Point2 c2, std::optional<Point2> fh);
79 
81 GTSAM_EXPORT Point2Pair means(const std::vector<Point2Pair> &abPointPairs);
82 
92 GTSAM_EXPORT std::list<Point2> circleCircleIntersection(Point2 c1, double r1,
93  Point2 c2, double r2, double tol = 1e-9);
94 
95 template <typename A1, typename A2>
96 struct Range;
97 
98 template <>
99 struct Range<Point2, Point2> {
100  typedef double result_type;
101  double operator()(const Point2& p, const Point2& q,
102  OptionalJacobian<1, 2> H1 = {},
103  OptionalJacobian<1, 2> H2 = {}) {
104  return distance2(p, q, H1, H2);
105  }
106 };
107 
108 } // \ namespace gtsam
109 
Vector2 Point2
Definition: Point2.h:32
Point2 operator*(double s, const Point2 &p)
multiply with scalar
Definition: Point2.h:52
GTSAM_EXPORT Point2Pair means(const std::vector< Point2Pair > &abPointPairs)
Calculate the two means of a set of Point2 pairs.
Definition: BearingRange.h:41
GTSAM_EXPORT double distance2(const Point2 &p1, const Point2 &q, OptionalJacobian< 1, 2 > H1={}, OptionalJacobian< 1, 2 > H2={})
distance between two points
Definition: chartTesting.h:28
Definition: OptionalJacobian.h:38
GTSAM_EXPORT double norm2(const Point2 &p, OptionalJacobian< 1, 2 > H={})
Distance of the point from the origin, with Jacobian.