star-cad

Geometric operators for computer-aided design
git clone git://git.meso-star.fr/star-cad.git
Log | Files | Refs | README | LICENSE

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:
Msrc/scad_geometry.c | 26++++++++++++++++++++------
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;