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
11
namespace
MathLib
12
{
13
double
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
36
double
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
MathTools.h
Point3d.h
MathLib::Point3d
Definition
Point3d.h:15
MathLib::Point3d::asEigenVector3d
Eigen::Vector3d const & asEigenVector3d() const
Definition
Point3d.h:55
MathLib
Definition
CreateComponent.h:23
MathLib::p
static const double p
Definition
GaussLegendreTet.cpp:55
MathLib::calcProjPntToLineAndDists
double calcProjPntToLineAndDists(Point3d const &pp, Point3d const &pa, Point3d const &pb, double &lambda, double &d0)
Definition
MathTools.cpp:13
MathLib::getAngle
double getAngle(Point3d const &p0, Point3d const &p1, Point3d const &p2)
Definition
MathTools.cpp:36
MathLib::v
static const double v
Definition
GaussLegendreTet.cpp:98
MathLib
MathTools.cpp
Generated by
1.14.0