commit 58e54e362bc4ad48db117bebce1d928d0ed442e3
parent 45cdaf33ba6a8d2a41eeafc79b9e9a91e6916364
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Wed, 9 Jul 2025 10:51:55 +0200
Fix get_closest_point
Due to gmsh get_closest_point own function, a 3D star_cad geometry has
to be split into its boundaries to find the closest point.
Also the returned closest point was incorrect.
Diffstat:
1 file changed, 20 insertions(+), 6 deletions(-)
diff --git a/src/scad_geometry.c b/src/scad_geometry.c
@@ -733,6 +733,11 @@ scad_geometry_get_closest_point
double* coord = NULL;
double* pcoord = NULL;
double tmp[3], min[3], min_d = DBL_MAX;
+ struct scad_device* dev = get_device();
+ struct darray_int tags;
+ const int* data = NULL;
+ size_t sz = 0;
+ int initialized = 0;
if(!geom || !from || !closest) {
res = RES_BAD_ARG;
@@ -741,11 +746,19 @@ scad_geometry_get_closest_point
ERR(check_device(FUNC_NAME));
- for(i = 0; i < geom->gmsh_dimTags_n; i += 2) {
+ darray_int_init(dev->allocator, &tags);
+ initialized = 1;
+
+ ERR(get_2d_tags(geom, &tags));
+ data = darray_int_cdata_get(&tags);
+ sz = darray_int_size_get(&tags);
+ ASSERT(sz);
+
+ for(i = 0; i < sz; i++) {
double d;
int ierr = 0;
- int dim = geom->gmsh_dimTags[i];
- int tag = geom->gmsh_dimTags[i + 1];
+ int dim = 2;
+ int tag = data[i];
size_t pcoord_n;
size_t coord_n;
@@ -757,7 +770,7 @@ scad_geometry_get_closest_point
d = d3_len(d3_sub(tmp, from, coord));
if(d < min_d) {
min_d = d;
- d3_set(min, tmp);
+ d3_set(min, coord);
}
gmshFree(coord);
gmshFree(pcoord);
@@ -767,8 +780,9 @@ scad_geometry_get_closest_point
*closest_distance = min_d;
exit:
- gmshFree(coord);
- gmshFree(pcoord);
+ if(initialized) darray_int_release(&tags);
+ gmshFree(coord);
+ gmshFree(pcoord);
return res;
error:
goto exit;