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:
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)