star-cad

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

commit 86c188aa026fbccd9e8cd399e722299b653d91bb
parent 6d07252863a7e356446fcc39f498470752d0995b
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Fri, 20 Dec 2024 11:11:43 +0100

Add a new API call to get the closest point of geometries

Diffstat:
Msrc/scad.h | 7+++++++
Msrc/scad_geometry.c | 53+++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 60 insertions(+), 0 deletions(-)

diff --git a/src/scad.h b/src/scad.h @@ -253,6 +253,13 @@ scad_geometry_get_centerofmass (struct scad_geometry* geom, double* center); +SCAD_API res_T +scad_geometry_get_closest_point + (struct scad_geometry* geom, + const double* from, + double* closest, + double* closest_distance); + /* Add a rectangle to the scene, defined by a point `xyz' and * `dxdy' the extents along the x-, y-axes. */ SCAD_API res_T diff --git a/src/scad_geometry.c b/src/scad_geometry.c @@ -727,6 +727,59 @@ error: } res_T +scad_geometry_get_closest_point + (struct scad_geometry* geom, + const double* from, + double* closest, + double* closest_distance) +{ + res_T res = RES_OK; + size_t i = 0; + double* coord = NULL; + double* pcoord = NULL; + double tmp[3], min[3], min_d = DBL_MAX; + + if(!geom || !from || !closest) { + res = RES_BAD_ARG; + goto error; + } + + ERR(check_device(FUNC_NAME)); + + for(i = 0; i < geom->gmsh_dimTags_n; i += 2) { + double d; + int ierr = 0; + int dim = geom->gmsh_dimTags[i]; + int tag = geom->gmsh_dimTags[i + 1]; + size_t pcoord_n; + size_t coord_n; + + gmshModelGetClosestPoint(dim, tag, from, 3, &coord, &coord_n, &pcoord, + &pcoord_n, &ierr); + ERR(gmsh_err_to_res_T(ierr)); + ASSERT(pcoord_n == (size_t)dim); + ASSERT(coord_n == 3); + d = d3_len(d3_sub(tmp, from, coord)); + if(d < min_d) { + min_d = d; + d3_set(min, tmp); + } + gmshFree(coord); + gmshFree(pcoord); + coord = pcoord = NULL; + } + d3_set(closest, min); + *closest_distance = min_d; + +exit: + gmshFree(coord); + gmshFree(pcoord); + return res; +error: + goto exit; +} + +res_T scad_geometry_get_centerofmass (struct scad_geometry* geom, double* center)