23 uint_t nsamples, real_t tol)
26 static_assert(ElementTp::dimension == 2,
"Element dimension is not 2");
27 typedef kernel::GeomPoint<ElementTp::dimension> point_t;
29 std::vector<point_t> points_on_segment(nsamples + 2);
31 auto v0 = element.get_vertex(0);
32 auto v1 = element.get_vertex(1);
34 real_t distance = v0.distance(v1);
37 real_t h = distance / (real_t)(nsamples + 2);
40 points_on_segment[0] = v0;
43 points_on_segment[0] = v0;
45 if (std::fabs(v1[0] - v0[0]) < tol)
50 for (uint_t sp = 1; sp <= nsamples; ++sp)
54 points_on_segment[sp] = point_t({xi, v0[0] + sp * h});
57 else if (std::fabs(v1[1] - v0[1]) < tol)
62 for (uint_t sp = 1; sp <= nsamples; ++sp)
66 points_on_segment[sp] = point_t({v0[0] + sp * h, xi});
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]);
77 for (uint_t sp = 1; sp <= nsamples; ++sp)
80 real_t xi = v0[0] + sp * h;
81 points_on_segment[sp] = point_t({xi, alpha * xi + beta});
85 points_on_segment[nsamples + 1] = v1;
87 auto min_point = get_point_with_min_distance(p, points_on_segment);
92real_t
distance_from(
const ElementTp &element,
const GeomPoint<ElementTp::dimension> &p,
93 uint_t nsamples, real_t tol)
107 real_t h = distance/(real_t) (nsamples + 2);
110 points_on_segment[0] = v0;
112 if(std::fabs(v1[0] - v0[0]) < tol){
116 for(uint_t sp = 1; sp <=nsamples; ++sp){
119 points_on_segment[sp] = point_t({xi, v0[0] + sp*h});
122 else if(std::fabs(v1[1] - v0[1]) < tol){
126 for(uint_t sp = 1; sp <=nsamples; ++sp){
129 points_on_segment[sp] = point_t({v0[0] + sp*h, xi});
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]);
140 for(uint_t sp = 1; sp <=nsamples; ++sp){
142 real_t xi = v0[0] + sp*h;
143 points_on_segment[sp] = point_t({xi, alpha*xi + beta});
147 points_on_segment[nsamples + 1] = v1;
149 auto min_point = get_point_with_min_distance(p, points_on_segment);*/
150 return point.distance(p);
157 const GeomPoint<MeshTp::dimension> &p,
158 uint_t nsamples, real_t tol)
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();
166 auto begin = filter.begin();
167 auto end = filter.end();
169 for (; begin != end; ++begin)
172 auto element = *begin;
190 static_assert(MeshTp::dimension == 2,
"Mesh dimension is not 2");
192 typedef typename MeshTp::point_t point_t;
195 std::vector<point_t> min_points;
196 min_points.reserve(mesh.n_elements());
198 numerics::ConstElementMeshIterator<numerics::Active, MeshTp> filter(mesh);
200 auto begin = filter.begin();
201 auto end = filter.end();
203 for (; begin != end; ++begin)
206 auto element = *begin;
214 real_t h = distance/(real_t) (nsamples + 2);
217 points_on_segment[0] = v0;
219 if(std::fabs(v1[0] - v0[0]) < tol){
223 for(uint_t sp = 1; sp <=nsamples; ++sp){
226 points_on_segment[sp] = point_t({xi, v0[0] + sp*h});
229 else if(std::fabs(v1[1] - v0[1]) < tol){
233 for(uint_t sp = 1; sp <=nsamples; ++sp){
236 points_on_segment[sp] = point_t({v0[0] + sp*h, xi});
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]);
246 for(uint_t sp = 1; sp <=nsamples; ++sp){
248 real_t xi = v0[0] + sp*h;
249 points_on_segment[sp] = point_t({xi, alpha*xi + beta});
253 points_on_segment[nsamples + 1] = v1;
256 auto min_point = get_point_with_min_distance(p, points_on_segment);*/
258 min_points.push_back(min_point);
261 auto result = get_point_with_min_distance(p, min_points);
266 return {result, element};
275 const Circle &circle)
278 static_assert(MeshTp::dimension == 2,
"Mesh dimension is not 2");
280 std::vector<typename MeshTp::point_t> intersections;
282 const auto r = circle.radius();
283 const auto center = circle.center();
285 numerics::ConstElementMeshIterator<numerics::Active, MeshTp> filter(mesh);
286 auto begin = filter.begin();
287 auto end = filter.end();
289 for (; begin != end; ++begin)
292 auto element = *begin;
293 auto v0 = element->get_vertex(0);
294 auto v1 = element->get_vertex(1);
297 auto f = v0 - center;
300 auto b = 2.0 * f.dot(d);
301 auto c = f.dot(f) - r * r;
303 auto discriminant = b * b - 4 * a * c;
305 auto intersects = has_intersection(discriminant, b, a);
306 if (intersects.first)
310 auto intersection = v0 + d * intersects.second;
311 intersections.push_back(intersection);
315 return intersections;