| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | // This file is part of Bembel, the higher order C++ boundary element library. | ||
| 2 | // | ||
| 3 | // Copyright (C) 2024 see <http://www.bembel.eu> | ||
| 4 | // | ||
| 5 | // It was written as part of a cooperation of J. Doelz, H. Harbrecht, S. Kurz, | ||
| 6 | // M. Multerer, S. Schoeps, and F. Wolf at Technische Universitaet Darmstadt, | ||
| 7 | // Universitaet Basel, and Universita della Svizzera italiana, Lugano. This | ||
| 8 | // source code is subject to the GNU General Public License version 3 and | ||
| 9 | // provided WITHOUT ANY WARRANTY, see <http://www.bembel.eu> for further | ||
| 10 | // information. | ||
| 11 | |||
| 12 | #ifndef BEMBEL_SRC_UTIL_GEOMETRYHELPER_HPP_ | ||
| 13 | #define BEMBEL_SRC_UTIL_GEOMETRYHELPER_HPP_ | ||
| 14 | |||
| 15 | namespace Bembel { | ||
| 16 | namespace util { | ||
| 17 | |||
| 18 | /** | ||
| 19 | * \brief computes a ball enclosing of two given enclosing balls. | ||
| 20 | * | ||
| 21 | * The computed enclosing ball contains for sure the two given balls with | ||
| 22 | * mit_point1 and radius1 and 2, respectively. | ||
| 23 | * | ||
| 24 | * \param *midpoint: Pointer to Eigen::Vector3d which is the new mid point of | ||
| 25 | * the enclosing ball | ||
| 26 | * \param *radius: Pointer where the radius of new enclosing ball is saved. | ||
| 27 | * \param midpoint1: Eigen::Vector3d midpoint of the first ball | ||
| 28 | * \param radius1: double radius of the first ball | ||
| 29 | * \param midpoint2: Eigen::Vector3d midpoint of the second ball | ||
| 30 | * \param radius2: double radius of the second ball | ||
| 31 | */ | ||
| 32 | 73419 | void computeEnclosingBall(Eigen::Vector3d *midpoint, double *radius, | |
| 33 | const Eigen::Vector3d &midpoint1, double radius1, | ||
| 34 | const Eigen::Vector3d &midpoint2, double radius2) { | ||
| 35 | // compute distance vector of the two spheres | ||
| 36 |
1/2✓ Branch 1 taken 73419 times.
✗ Branch 2 not taken.
|
73419 | auto z = midpoint1 - midpoint2; |
| 37 |
2/4✓ Branch 1 taken 73419 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 73419 times.
✗ Branch 5 not taken.
|
73419 | auto norm = (midpoint1 - midpoint2).norm(); |
| 38 | // B(d2,radius2) subset B(d1,radius1) | ||
| 39 |
2/2✓ Branch 0 taken 24025 times.
✓ Branch 1 taken 49394 times.
|
73419 | if (norm + radius2 <= radius1) { |
| 40 |
1/2✓ Branch 1 taken 24025 times.
✗ Branch 2 not taken.
|
24025 | *midpoint = midpoint1; |
| 41 | 24025 | *radius = radius1; | |
| 42 | // B(d1,radius1) subset B(d2,radius2) | ||
| 43 |
2/2✓ Branch 0 taken 48 times.
✓ Branch 1 taken 49346 times.
|
49394 | } else if (norm + radius1 <= radius2) { |
| 44 |
1/2✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
|
48 | *midpoint = midpoint2; |
| 45 | 48 | *radius = radius2; | |
| 46 | // the union is not a ball | ||
| 47 | } else { | ||
| 48 |
5/10✓ Branch 1 taken 49346 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 49346 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 49346 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 49346 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 49346 times.
✗ Branch 14 not taken.
|
49346 | *midpoint = 0.5 * (midpoint1 + midpoint2 + (radius1 - radius2) / norm * z); |
| 49 | 49346 | *radius = 0.5 * (radius1 + radius2 + norm); | |
| 50 | } | ||
| 51 | 146838 | return; | |
| 52 | } | ||
| 53 | } // namespace util | ||
| 54 | } // namespace Bembel | ||
| 55 | #endif // BEMBEL_SRC_UTIL_GEOMETRYHELPER_HPP_ | ||
| 56 |