14 #include <aliceVision/stl/hash.hpp>
18 template<
unsigned int DIM,
class T>
43 inline Point3d(
double _x,
double _y,
double _z)
50 inline Point3d(
const double*
const p)
81 inline Point3d& operator/=(
double v)
89 inline bool operator==(
const Point3d& param)
const {
return (x == param.x) && (y == param.y) && (z == param.z); }
97 inline Point3d operator*(
const double d)
const {
return Point3d(x * d, y * d, z * d); }
99 inline Point3d operator/(
const double d)
const {
return Point3d(x / d, y / d, z / d); }
101 inline Point3d normalize()
const
103 double d = std::sqrt(x * x + y * y + z * z);
104 return Point3d(x / d, y / d, z / d);
107 inline double size()
const
109 double d = x * x + y * y + z * z;
118 inline double size2()
const {
return x * x + y * y + z * z; }
133 inline double dist(
const Point3d& p1,
const Point3d& p2) {
return (p1 - p2).size(); }
135 inline double dot(
const Point3d& p1,
const Point3d& p2) {
return p1.x * p2.x + p1.y * p2.y + p1.z * p2.z; }
137 inline Point3d cross(
const Point3d& a,
const Point3d& b)
140 vc.x = a.y * b.z - a.z * b.y;
141 vc.y = a.z * b.x - a.x * b.z;
142 vc.z = a.x * b.y - a.y * b.x;
147 inline Point3d proj(
const Point3d& e,
const Point3d& a) {
return e * (dot(e, a) / dot(e, e)); }
149 inline double tripleProduct(
const Point3d& a,
const Point3d& b,
const Point3d& c) {
return dot(a, cross(b, c)); }
157 const double a = oa.size();
158 const double b = ob.size();
159 const double c = oc.size();
161 const double nom = tripleProduct(oa, ob, oc);
162 const double den = (a * b * c + dot(oa, ob) * c + dot(oa, oc) * b + dot(ob, oc) * a);
163 return std::abs(std::atan2(nom, den) * 2.0);
166 inline std::ostream& operator<<(std::ostream& stream,
const Point3d& p)
168 stream << p.x <<
"," << p.y <<
"," << p.z;
172 inline Eigen::Matrix<double, 3, 1> toEigen(
const Point3d& v) {
return Eigen::Matrix<double, 3, 1>(v.m); }
176 std::size_t operator()(
const Point3d & p)
const noexcept
178 std::size_t seed = 0;
179 stl::hash_combine(seed, p.x);
180 stl::hash_combine(seed, p.y);
181 stl::hash_combine(seed, p.z);