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