star-cpr

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

commit 51b4479b86f195f7aa0e1fc97a25e851ad591db6
parent af9932bc8558765f879ee1419a9cd76aaa7abf4e
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Tue, 17 Jan 2023 15:27:47 +0100

Fix offset=0 not leaving polygon unchanged

Diffstat:
Msrc/scpr_polygon.c | 37+++++++++++++++++++++----------------
Msrc/test_scpr_offset.c | 14+++++++-------
2 files changed, 28 insertions(+), 23 deletions(-)

diff --git a/src/scpr_polygon.c b/src/scpr_polygon.c @@ -315,13 +315,14 @@ scpr_offset_polygon size_t c; Clipper2Lib::PathD tmp; Clipper2Lib::PathsD polygon; - Clipper2Lib::JoinType cjt; res_T res = RES_OK; if(!poly_desc) { res = RES_BAD_ARG; goto error; } + + /* Check join type */ switch(join_type) { case SCPR_JOIN_SQUARE: case SCPR_JOIN_ROUND: @@ -331,22 +332,26 @@ scpr_offset_polygon res = RES_BAD_ARG; goto error; } - cjt = scpr_join_type_to_clipper_join_type(join_type); - poly_desc->paths = Clipper2Lib::InflatePaths(poly_desc->paths, offset, cjt, - Clipper2Lib::EndType::Polygon); - - /* Rebuild AABB */ - d2_splat(poly_desc->lower, DBL_MAX); - d2_splat(poly_desc->upper,-DBL_MAX); - FOR_EACH(c, 0, poly_desc->paths.size()) { - size_t i, nverts; - nverts = poly_desc->paths[c].size(); - FOR_EACH(i, 0, nverts) { - double pos[2]; - ERR(scpr_polygon_get_position(poly_desc, c, i, pos)); - d2_min(poly_desc->lower, poly_desc->lower, pos); - d2_max(poly_desc->upper, poly_desc->upper, pos); + /* Some known problems when offset=0, not leaving polygon unchanged */ + if(offset != 0) { + Clipper2Lib::JoinType cjt = scpr_join_type_to_clipper_join_type(join_type); + poly_desc->paths = Clipper2Lib::InflatePaths(poly_desc->paths, offset, cjt, + Clipper2Lib::EndType::Polygon); + + /* Rebuild AABB */ + d2_splat(poly_desc->lower, DBL_MAX); + d2_splat(poly_desc->upper,-DBL_MAX); + FOR_EACH(c, 0, poly_desc->paths.size()) { + size_t i, nverts; + nverts = poly_desc->paths[c].size(); + + FOR_EACH(i, 0, nverts) { + double pos[2]; + ERR(scpr_polygon_get_position(poly_desc, c, i, pos)); + d2_min(poly_desc->lower, poly_desc->lower, pos); + d2_max(poly_desc->upper, poly_desc->upper, pos); + } } } diff --git a/src/test_scpr_offset.c b/src/test_scpr_offset.c @@ -54,7 +54,7 @@ test_single(void) ctx.coords = coords; ctx.nverts = nverts; ctx.ncomps = ncomps; - + CHK(scpr_polygon_setup_indexed_vertices(polygon, ncomps, pget_nverts, pget_pos, &ctx) == RES_OK); CHK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx) @@ -78,7 +78,7 @@ test_single(void) memcpy(*coords, coords0, 2*nverts[0]*sizeof(**coords)); CHK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx) == RES_OK); - + CHK(scpr_offset_polygon(polygon, -1, SCPR_JOIN_MITER) == RES_OK); CHK(scpr_polygon_eq(polygon, expected, &eq) == RES_OK); CHK(eq); @@ -160,7 +160,7 @@ test_double(void) ctx.coords = coords; ctx.nverts = nverts; ctx.ncomps = ncomps; - + CHK(scpr_polygon_setup_indexed_vertices(polygon, ncomps, pget_nverts, pget_pos, &ctx) == RES_OK); CHK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx) @@ -186,7 +186,7 @@ test_double(void) memcpy(*(coords+1), coords1, 2*nverts[1]*sizeof(**coords)); CHK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx) == RES_OK); - + CHK(scpr_offset_polygon(polygon, -1, SCPR_JOIN_MITER) == RES_OK); CHK(scpr_polygon_eq(polygon, expected, &eq) == RES_OK); CHK(eq); @@ -280,7 +280,7 @@ test_internal(void) ctx.coords = coords; ctx.nverts = nverts; ctx.ncomps = ncomps; - + CHK(scpr_polygon_setup_indexed_vertices(polygon, ncomps, pget_nverts, pget_pos, &ctx) == RES_OK); CHK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx) @@ -306,7 +306,7 @@ test_internal(void) memcpy(*(coords+1), coords1, 2*nverts[1]*sizeof(**coords)); CHK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx) == RES_OK); - + CHK(scpr_offset_polygon(polygon, 1, SCPR_JOIN_MITER) == RES_OK); CHK(scpr_polygon_eq(polygon, expected, &eq) == RES_OK); CHK(eq); @@ -329,7 +329,7 @@ test_internal(void) memcpy(*(coords+1), coords1, 2*nverts[1]*sizeof(**coords)); CHK(scpr_polygon_setup_indexed_vertices(polygon, ncomps, pget_nverts, pget_pos, &ctx) == RES_OK); - + ncomps = 0; ctx.ncomps = ncomps; CHK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx)