star-cpr

Clip 2D meshes with 2D polygons
git clone git://git.meso-star.fr/star-cpr.git
Log | Files | Refs | README | LICENSE

commit 188a299ab4625cf5306af94f2c2d156623f0acd7
parent 2bd7f24ce053392bb47e0822f59d4aadb0530ca4
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Tue, 21 Feb 2023 17:09:11 +0100

Add an API function to register a polygon for intersection check

Diffstat:
Msrc/scpr.h | 13+++++++++----
Msrc/scpr_intersector.c | 28+++++++++++++++++++++++++---
Msrc/test_scpr_intersector.c | 8+++++++-
3 files changed, 41 insertions(+), 8 deletions(-)

diff --git a/src/scpr.h b/src/scpr.h @@ -89,11 +89,11 @@ struct scpr_intersector_check_callbacks { void(*simple_intersection) (struct scpr_callback_segment* segment1, struct scpr_callback_segment* segment2, - void* data); + void* ctx); void(*colinear_segments) (struct scpr_callback_segment* segment1, struct scpr_callback_segment* segment2, - void* data); + void* ctx); }; #define SCPR_INTERSECTOR_CHECK_CALLBACKS_NULL__ { NULL, NULL } @@ -307,7 +307,12 @@ SCPR_API res_T scpr_intersector_ref_put (struct scpr_intersector* intersector); -/* Register a polygon's component for further analysis */ +/* Register a polygon's a polygon or a component for further analysis */ +SCPR_API res_T +scpr_intersector_register_polygon + (struct scpr_intersector* intersector, + struct scpr_polygon* polygon); + SCPR_API res_T scpr_intersector_register_component (struct scpr_intersector* intersector, @@ -318,7 +323,7 @@ SCPR_API res_T scpr_intersector_check (struct scpr_intersector* intersector, struct scpr_intersector_check_callbacks* callbacks, - void* data); + void* data); /* Client data set as the last param of the callbacks */ END_DECLS diff --git a/src/scpr_intersector.c b/src/scpr_intersector.c @@ -664,6 +664,29 @@ scpr_intersector_ref_put } res_T +scpr_intersector_register_polygon + (struct scpr_intersector* intersector, + struct scpr_polygon* polygon) +{ + res_T res = RES_OK; + size_t i; + + if(!intersector || !polygon) { + res = RES_BAD_ARG; + goto error; + } + + for(i = 0; i < polygon->paths.size(); i++) { + ERR(scpr_intersector_register_component(intersector, polygon, i)); + } + +exit: + return res; +error: + goto exit; +} + +res_T scpr_intersector_register_component (struct scpr_intersector* intersector, struct scpr_polygon* polygon, @@ -675,8 +698,7 @@ scpr_intersector_register_component struct intersector_component comp; char *found, one = 1; - if(!intersector || !polygon || icomponent >= polygon->paths.size()) - { + if(!intersector || !polygon || icomponent >= polygon->paths.size()) { res = RES_BAD_ARG; goto error; } @@ -688,7 +710,7 @@ scpr_intersector_register_component &comp); if(found) { logger_print(intersector->device->logger, LOG_ERROR, - "Component already registered.\n"); + "Component %zu already registered.\n", icomponent); res = RES_BAD_ARG; goto error; } diff --git a/src/test_scpr_intersector.c b/src/test_scpr_intersector.c @@ -161,7 +161,13 @@ main(int argc, char** argv) OK(scpr_intersector_register_component(inter, p01, 1)); OK(scpr_intersector_register_component(inter, p23, 0)); OK(scpr_intersector_register_component(inter, p23, 1)); - OK(scpr_intersector_register_component(inter, p4, 0)); + BAD(scpr_intersector_register_component(inter, p23, 1)); /* Registered twice */ + + BAD(scpr_intersector_register_polygon(NULL, NULL)); + BAD(scpr_intersector_register_polygon(NULL, p01)); + BAD(scpr_intersector_register_polygon(inter, NULL)); + OK(scpr_intersector_register_polygon(inter, p4)); + BAD(scpr_intersector_register_polygon(inter, p4)); /* Registered twice */ BAD(scpr_intersector_check(NULL, NULL, NULL)); BAD(scpr_intersector_check(NULL, &cb, NULL));