OGS
MathTools.cpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
4#include "MathTools.h"
5
6#include <Eigen/Core>
7#include <cmath>
8
9#include "Point3d.h"
10
11namespace MathLib
12{
13double calcProjPntToLineAndDists(Point3d const& pp, Point3d const& pa,
14 Point3d const& pb, double& lambda, double& d0)
15{
16 auto const& a = pa.asEigenVector3d();
17 auto const& b = pb.asEigenVector3d();
18 auto const& p = pp.asEigenVector3d();
19
20 // g(lambda) = a + lambda v, v = b-a
21 Eigen::Vector3d const v = b - a;
22
23 // orthogonal projection: (p - g(lambda))^T * v = 0
24 // <=> (a-p - lambda (b-a))^T * (b-a) = 0
25 // <=> (a-p)^T * (b-a) = lambda (b-a)^T ) (b-a)
26 lambda = (((p - a).transpose() * v) / v.squaredNorm())(0, 0);
27
28 // compute projected point
29 Eigen::Vector3d const proj_pnt = a + lambda * v;
30
31 d0 = (proj_pnt - a).norm();
32
33 return (p - proj_pnt).norm();
34}
35
36double getAngle(Point3d const& p0, Point3d const& p1, Point3d const& p2)
37{
38 auto const& b = p1.asEigenVector3d();
39 Eigen::Vector3d const v0 = p0.asEigenVector3d() - b;
40 Eigen::Vector3d const v1 = p2.asEigenVector3d() - b;
41
42 // apply Cauchy Schwarz inequality
43 return std::acos(v0.dot(v1) / (v0.norm() * v1.norm()));
44}
45
46} // namespace MathLib
Eigen::Vector3d const & asEigenVector3d() const
Definition Point3d.h:55
static const double p
double calcProjPntToLineAndDists(Point3d const &pp, Point3d const &pa, Point3d const &pb, double &lambda, double &d0)
Definition MathTools.cpp:13
double getAngle(Point3d const &p0, Point3d const &p1, Point3d const &p2)
Definition MathTools.cpp:36
static const double v