commit d48339d151098d99249fd9499784c71a4f94c1af
parent 1980a93cb288fdb0dbcc63ad915dfb7550e8a04a
Author: Benjamin Piaud <benjamin.piaud@meso-star.com>
Date: Thu, 24 Nov 2022 13:33:28 +0100
Add centerofmass function
Diffstat:
2 files changed, 52 insertions(+), 5 deletions(-)
diff --git a/src/scad.h b/src/scad.h
@@ -140,6 +140,12 @@ scad_geometry_get_mass
(struct scad_geometry* geom,
double* mass);
+SCAD_API res_T
+scad_geometry_get_centerofmass
+ (struct scad_geometry* geom,
+ double** center,
+ size_t* center_n);
+
/* 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
@@ -384,6 +384,47 @@ error:
}
res_T
+scad_geometry_get_centerofmass
+ (struct scad_geometry* geom,
+ double** center,
+ size_t* center_n)
+{
+ res_T res = RES_OK;
+ size_t i = 0;
+ int* data = NULL;
+ size_t sz = 0;
+
+ if(!geom || !center || !center_n) goto error;
+
+ ERR(check_device(FUNC_NAME));
+
+ ASSERT(geom->gmsh_dimTags_n % 2 == 0);
+ *center_n = geom->gmsh_dimTags_n / 2;
+
+ *center = (double*)malloc(*center_n * 3 * sizeof(double));
+
+ ERR(gather_tags(&geom, 1, SIZE_MAX, &data, &sz));
+
+ for (i=0; i<*center_n; ++i) {
+ double x, y, z;
+ int ierr = 0;
+ gmshModelOccGetCenterOfMass(data[2*i], data[2*i + 1], &x, &y, &z, &ierr);
+ ERR(gmsh_err_to_res_T(ierr));
+ (*center)[3*i] = x;
+ (*center)[3*i + 1] = y;
+ (*center)[3*i + 2] = z;
+ }
+
+exit:
+ free(data);
+ return res;
+error:
+ res = RES_BAD_ARG;
+ if (*center) free(*center);
+ goto exit;
+}
+
+res_T
scad_add_rectangle
(const char* name,
const double xyz[3],
@@ -1474,8 +1515,8 @@ scad_geometry_normal
res_T res = RES_OK;
int ierr = 0;
size_t i;
- int* data;
- size_t sz;
+ int* data = NULL;
+ size_t sz = 0;
struct scad_geometry* surface = NULL;
struct scad_geometry* out = NULL;
@@ -1487,7 +1528,7 @@ scad_geometry_normal
ERR(check_device(FUNC_NAME));
if (geom->gmsh_dimTags[0] == 2) {
- ERR(scad_geometry_copy(geom, NULL, &surface));
+ surface = geom;
} else if (geom->gmsh_dimTags[0] == 3) {
ERR(scad_geometry_boundary(NULL, &geom, 1, &surface));
} else {
@@ -1552,8 +1593,8 @@ scad_geometry_dilate
{
res_T res = RES_OK;
int ierr = 0;
- int* data;
- size_t sz;
+ int* data = NULL;
+ size_t sz = 0;
if(!geom || !scale|| !center) {
res = RES_BAD_ARG;