GCC Code Coverage Report


Directory: ./
File: lib/exploragram/hexdom/geometry.h
Date: 2026-09-07 02:28:19
Exec Total Coverage
Lines: 0 9 0.0%
Functions: 0 1 0.0%
Branches: 0 12 0.0%

Line Branch Exec Source
1 /*
2 * Copyright (c) 2000-2022 Inria
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * * Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 * * Neither the name of the ALICE Project-Team nor the names of its
14 * contributors may be used to endorse or promote products derived from this
15 * software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
21 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 * POSSIBILITY OF SUCH DAMAGE.
28 *
29 * Contact: Bruno Levy
30 *
31 * https://www.inria.fr/fr/bruno-levy
32 *
33 * Inria,
34 * Domaine de Voluceau,
35 * 78150 Le Chesnay - Rocquencourt
36 * FRANCE
37 *
38 */
39
40 #ifndef H_HEXDOM_ALGO_GEOMETRY_H
41 #define H_HEXDOM_ALGO_GEOMETRY_H
42
43 #include <exploragram/basic/common.h>
44 #include <exploragram/hexdom/basic.h>
45 #include <geogram/basic/geometry.h>
46
47 namespace GEO {
48
49 struct EXPLORAGRAM_API CoTan3D{
50 double w[6];
51 double tetvol;
52
53 CoTan3D(vec3 P[4], double* anisotropy_as_xx_yy_zz_xy_yz_xz = nullptr);
54
55 index_t org(index_t e);
56 index_t dest(index_t e);
57 double coeff(index_t e);
58
59 void check_for_grad(vec3 P[4], vec3 grad);
60 };
61
62 /*******************************************************************************/
63
64 class EXPLORAGRAM_API TrglGradient {
65 public:
66 TrglGradient(const vec3& p0, const vec3& p1, const vec3& p2);
67
68 /** Creates an uninitialized TrglGradient */
69 TrglGradient();
70
71 void initialize(const vec3& p0, const vec3& p1, const vec3& p2);
72
73 /**
74 * Returns the ith vertex of the triangle.
75 * @param i is the index of the vertex,
76 * which can be one of 0,1,2.
77 */
78 const vec3& vertex(index_t i) const;
79
80 /**
81 * Returns the orthonormal basis in which gradient computation are
82 * performed.
83 */
84 void basis(vec3& origin, vec3& X, vec3& Y, vec3& Z) const;
85
86 /**
87 * Returns the coefficients determining the gradient in this triangle.
88 *
89 * grad_X = sum_i { TX(i) * vertex(i)-> embedding(prop) }
90 * Note: TX(2) == 0
91 */
92 double TX(index_t i) const;
93
94 /**
95 * Returns the coefficients determining the gradient in this triangle.
96 *
97 * grad_Y = sum_i { TY(i) * vertex(i)-> embedding(prop) }
98 */
99 double TY(index_t i) const;
100 bool is_flat() const { return is_flat_; }
101
102 vec3 gradient_3d(double value0, double value1, double value2) const;
103
104 private:
105 double TX_[3];
106 double TY_[3];
107 vec3 vertex_[3];
108 bool is_flat_;
109 };
110
111 /*******************************************************************************/
112
113 struct Basis3d {
114 Basis3d(vec3 z) { // TODO DOCUMENT THIS!
115 v[2] = normalize(z);
116 if (std::fabs(v[2].z) < .8)
117 v[0] = cross(v[2], vec3(0, 0, 1));
118 else v[0] = cross(v[2], vec3(1, 0, 0));
119 v[0] = normalize(v[0]);
120 v[1] = cross(v[2], v[0]);
121 geo_assert(std::abs(v[1].length2() - 1) < .001);
122 }
123 vec2 project_xy(vec3 in){
124 return vec2(dot(in, v[0]), dot(in, v[1]));
125 }
126 vec3 un_project_xy(vec2 in){
127 return in[0] * v[0] + in[1] * v[1];
128 }
129 vec3 v[3];
130 };
131
132 /*******************************************************************************/
133
134 /* _____ _____ ____ _____ _ _ _
135 * | __ \ / ____| /\ |___ \| __ \ | | | | | |
136 * | |__) | | / \ __) | | | | ______ ______ _ __ ___ | |_ ___ ___ _ __ | |_ ___ _ __ ___ __| |
137 * | ___/| | / /\ \ |__ <| | | | |______|______| | '_ \ / _ \| __| / __/ _ \ '_ \| __/ _ \ '__/ _ \/ _` |
138 * | | | |____ / ____ \ ___) | |__| | | | | | (_) | |_ | (_| __/ | | | || __/ | | __/ (_| |
139 * |_| \_____/_/ \_\ |____/|_____/ |_| |_|\___/ \__| \___\___|_| |_|\__\___|_| \___|\__,_|
140 *
141 */
142
143 struct EXPLORAGRAM_API UncenteredPCA3D {
144 public:
145 void begin_points();
146 void end_points();
147 void point(const vec3& p, double weight = 1.0);
148 vec3 axis[3];
149 double eigen_value[3];
150 private:
151 double M_[6];
152 int nb_points_;
153 double sum_weights_;
154 };
155
156
157 /*******************************************************************************/
158
159
160 /* Triangle/triangle intersection test routine,
161 * by Tomas Moller, 1997.
162 * See article "A Fast Triangle-Triangle Intersection Test",
163 * Journal of Graphics Tools, 2(2), 1997
164 *
165 * Updated June 1999: removed the divisions -- a little faster now!
166 * Updated October 1999: added {} to CROSS and SUB macros
167 *
168 * int NoDivTriTriIsect(double V0[3],double V1[3],double V2[3],
169 * double U0[3],double U1[3],double U2[3])
170 *
171 * parameters: vertices of triangle 1: V0,V1,V2
172 * vertices of triangle 2: U0,U1,U2
173 * result : returns 1 if the triangles intersect, otherwise 0
174 *
175 */
176 int EXPLORAGRAM_API NoDivTriTriIsect(
177 double V0[3], double V1[3], double V2[3],
178 double U0[3], double U1[3], double U2[3]
179 );
180
181 /********************************************************/
182 /* AABB-triangle overlap test code */
183 /* by Tomas Akenine-Möller */
184 /* Function: int triBoxOverlap(float boxcenter[3], */
185 /* float boxhalfsize[3],float triverts[3][3]); */
186 /* History: */
187 /* 2001-03-05: released the code in its first version */
188 /* 2001-06-18: changed the order of the tests, faster */
189 /* */
190 /* Acknowledgement: Many thanks to Pierre Terdiman for */
191 /* suggestions and discussions on how to optimize code. */
192 /* Thanks to David Hunt for finding a ">="-bug! */
193 /********************************************************/
194 int EXPLORAGRAM_API triBoxOverlap(
195 float boxcenter[3], float boxhalfsize[3], float triverts[3][3]
196 );
197
198 /*******************************************************************************/
199
200 }
201
202 #endif
203