bitrl & cuberl Documentation
Simulation engine for reinforcement learning agents
Loading...
Searching...
No Matches
mesh_utils.h
Go to the documentation of this file.
1#ifndef MESH_UTILS_H
2#define MESH_UTILS_H
3
4#include "kernel/discretization/element_mesh_iterator.h"
5#include "kernel/discretization/mesh_predicates.h"
6#include "kernel/geometry/geometry_utils.h"
7#include "kernel/geometry/shapes/circle.h"
8
9#include <limits>
10#include <tuple>
11#include <vector>
12
13namespace kernel
14{
15namespace discretization
16{
17namespace utils
18{
19
20template <typename ElementTp>
21const kernel::GeomPoint<ElementTp::dimension>
22find_point_on_element_closest_to(const ElementTp &element, const GeomPoint<ElementTp::dimension> &p,
23 uint_t nsamples, real_t tol)
24{
25
26 static_assert(ElementTp::dimension == 2, "Element dimension is not 2");
27 typedef kernel::GeomPoint<ElementTp::dimension> point_t;
28
29 std::vector<point_t> points_on_segment(nsamples + 2);
30
31 auto v0 = element.get_vertex(0);
32 auto v1 = element.get_vertex(1);
33
34 real_t distance = v0.distance(v1);
35
37 real_t h = distance / (real_t)(nsamples + 2);
38
40 points_on_segment[0] = v0;
41
43 points_on_segment[0] = v0;
44
45 if (std::fabs(v1[0] - v0[0]) < tol)
46 {
49
50 for (uint_t sp = 1; sp <= nsamples; ++sp)
51 {
52
53 real_t xi = v0[0];
54 points_on_segment[sp] = point_t({xi, v0[0] + sp * h});
55 }
56 }
57 else if (std::fabs(v1[1] - v0[1]) < tol)
58 {
61
62 for (uint_t sp = 1; sp <= nsamples; ++sp)
63 {
64
65 real_t xi = v0[1];
66 points_on_segment[sp] = point_t({v0[0] + sp * h, xi});
67 }
68 }
69 else
70 {
71
74 real_t alpha = (v1[1] - v0[1]) / (v1[0] - v0[0]);
75 real_t beta = (v0[1] * v1[0] + v0[0] * v1[1]) / (v1[0] - v0[0]);
76
77 for (uint_t sp = 1; sp <= nsamples; ++sp)
78 {
79
80 real_t xi = v0[0] + sp * h;
81 points_on_segment[sp] = point_t({xi, alpha * xi + beta});
82 }
83 }
85 points_on_segment[nsamples + 1] = v1;
86
87 auto min_point = get_point_with_min_distance(p, points_on_segment);
88 return min_point;
89}
90
91template <typename ElementTp>
92real_t distance_from(const ElementTp &element, const GeomPoint<ElementTp::dimension> &p,
93 uint_t nsamples, real_t tol)
94{
95
96 auto point = find_point_on_element_closest_to(element, p, nsamples, tol);
97 /*typedef GeomPoint<ElementTp::dimension> point_t;
98
99 std::vector<point_t> points_on_segment(nsamples + 2);
100
101 auto v0 = element.get_vertex(0);
102 auto v1 = element.get_vertex(1);
103
104 real_t distance = v0.distance(v1);
105
107 real_t h = distance/(real_t) (nsamples + 2);
108
110 points_on_segment[0] = v0;
111
112 if(std::fabs(v1[0] - v0[0]) < tol){
115
116 for(uint_t sp = 1; sp <=nsamples; ++sp){
117
118 real_t xi = v0[0];
119 points_on_segment[sp] = point_t({xi, v0[0] + sp*h});
120 }
121 }
122 else if(std::fabs(v1[1] - v0[1]) < tol){
125
126 for(uint_t sp = 1; sp <=nsamples; ++sp){
127
128 real_t xi = v0[1];
129 points_on_segment[sp] = point_t({v0[0] + sp*h, xi});
130 }
131
132 }
133 else{
134
137 real_t alpha = (v1[1] - v0[1])/(v1[0] - v0[0]);
138 real_t beta = (v0[1]*v1[0] + v0[0]*v1[1])/(v1[0] - v0[0]);
139
140 for(uint_t sp = 1; sp <=nsamples; ++sp){
141
142 real_t xi = v0[0] + sp*h;
143 points_on_segment[sp] = point_t({xi, alpha*xi + beta});
144 }
145 }
147 points_on_segment[nsamples + 1] = v1;
148
149 auto min_point = get_point_with_min_distance(p, points_on_segment);*/
150 return point.distance(p);
151}
152
155template <typename MeshTp>
156const typename MeshTp::element_t *find_closest_element(const MeshTp &mesh,
157 const GeomPoint<MeshTp::dimension> &p,
158 uint_t nsamples, real_t tol)
159{
160
161 numerics::ConstElementMeshIterator<numerics::Active, MeshTp> filter(mesh);
162 typedef typename MeshTp::element_t element_t;
163 element_t *ptr = nullptr;
164 real_t dist = std::numeric_limits<real_t>::max();
165
166 auto begin = filter.begin();
167 auto end = filter.end();
168
169 for (; begin != end; ++begin)
170 {
171
172 auto element = *begin;
173 auto dist_cur = distance_from(*element, p, nsamples, tol);
174
175 if (dist_cur < dist)
176 {
177 dist = dist_cur;
178 ptr = element;
179 }
180 }
181
182 return ptr;
183}
184
185template <typename MeshTp>
186std::tuple<const typename MeshTp::point_t, const typename MeshTp::element_t *>
187find_closest_point_to(const MeshTp &mesh, const GeomPoint<2> &p, uint_t nsamples, real_t tol)
188{
189
190 static_assert(MeshTp::dimension == 2, "Mesh dimension is not 2");
191
192 typedef typename MeshTp::point_t point_t;
193
194 // std::vector<point_t> points_on_segment(nsamples + 2);
195 std::vector<point_t> min_points;
196 min_points.reserve(mesh.n_elements());
197
198 numerics::ConstElementMeshIterator<numerics::Active, MeshTp> filter(mesh);
199
200 auto begin = filter.begin();
201 auto end = filter.end();
202
203 for (; begin != end; ++begin)
204 {
205
206 auto element = *begin;
207
208 /*auto v0 = element->get_vertex(0);
209 auto v1 = element->get_vertex(1);
210
211 real_t distance = v0.distance(v1);
212
214 real_t h = distance/(real_t) (nsamples + 2);
215
217 points_on_segment[0] = v0;
218
219 if(std::fabs(v1[0] - v0[0]) < tol){
222
223 for(uint_t sp = 1; sp <=nsamples; ++sp){
224
225 real_t xi = v0[0];
226 points_on_segment[sp] = point_t({xi, v0[0] + sp*h});
227 }
228 }
229 else if(std::fabs(v1[1] - v0[1]) < tol){
232
233 for(uint_t sp = 1; sp <=nsamples; ++sp){
234
235 real_t xi = v0[1];
236 points_on_segment[sp] = point_t({v0[0] + sp*h, xi});
237 }
238 }
239 else{
240
243 real_t alpha = (v1[1] - v0[1])/(v1[0] - v0[0]);
244 real_t beta = (v0[1]*v1[0] + v0[0]*v1[1])/(v1[0] - v0[0]);
245
246 for(uint_t sp = 1; sp <=nsamples; ++sp){
247
248 real_t xi = v0[0] + sp*h;
249 points_on_segment[sp] = point_t({xi, alpha*xi + beta});
250 }
251 }
253 points_on_segment[nsamples + 1] = v1;
254
256 auto min_point = get_point_with_min_distance(p, points_on_segment);*/
257 auto min_point = find_point_on_element_closest_to(*element, p, nsamples, tol);
258 min_points.push_back(min_point);
259 }
260
261 auto result = get_point_with_min_distance(p, min_points);
262
264 auto element = find_closest_element(mesh, result, nsamples, tol);
265
266 return {result, element};
267}
268
273template <typename MeshTp>
274const std::vector<typename MeshTp::point_t> find_intersections(const MeshTp &mesh,
275 const Circle &circle)
276{
277
278 static_assert(MeshTp::dimension == 2, "Mesh dimension is not 2");
279
280 std::vector<typename MeshTp::point_t> intersections;
281
282 const auto r = circle.radius();
283 const auto center = circle.center();
284
285 numerics::ConstElementMeshIterator<numerics::Active, MeshTp> filter(mesh);
286 auto begin = filter.begin();
287 auto end = filter.end();
288
289 for (; begin != end; ++begin)
290 {
291
292 auto element = *begin;
293 auto v0 = element->get_vertex(0);
294 auto v1 = element->get_vertex(1);
295
296 auto d = v1 - v0;
297 auto f = v0 - center;
298
299 auto a = d.dot(d);
300 auto b = 2.0 * f.dot(d);
301 auto c = f.dot(f) - r * r;
302
303 auto discriminant = b * b - 4 * a * c;
304
305 auto intersects = has_intersection(discriminant, b, a);
306 if (intersects.first)
307 {
308
310 auto intersection = v0 + d * intersects.second;
311 intersections.push_back(intersection);
312 }
313 }
314
315 return intersections;
316}
317
318} // namespace utils
319
320} // namespace discretization
321
322} // namespace kernel
323
324#endif // MESH_UTILS_H
std::tuple< const typename MeshTp::point_t, const typename MeshTp::element_t * > find_closest_point_to(const MeshTp &mesh, const GeomPoint< 2 > &p, uint_t nsamples, real_t tol)
Definition mesh_utils.h:187
real_t distance_from(const ElementTp &element, const GeomPoint< ElementTp::dimension > &p, uint_t nsamples, real_t tol)
Definition mesh_utils.h:92
const kernel::GeomPoint< ElementTp::dimension > find_point_on_element_closest_to(const ElementTp &element, const GeomPoint< ElementTp::dimension > &p, uint_t nsamples, real_t tol)
Definition mesh_utils.h:22
const MeshTp::element_t * find_closest_element(const MeshTp &mesh, const GeomPoint< MeshTp::dimension > &p, uint_t nsamples, real_t tol)
Find the element in the mesh with the smallest distance from the point.
Definition mesh_utils.h:156
const std::vector< typename MeshTp::point_t > find_intersections(const MeshTp &mesh, const Circle &circle)
Returns the intersection points of the Circle with the elements of the LineMesh. The algorithn implem...
Definition mesh_utils.h:274
Definition line_mesh_utils.cpp:13