star-enclosures-3d

Extract enclosures from 3D geometry
git clone git://git.meso-star.fr/star-enclosures-3d.git
Log | Files | Refs | README | LICENSE

commit 2699ef9fe4cf1d8c5c420536cde9df7413d04678
parent 93338c9955a8e737a641d40a533e0e34b3f42976
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Tue,  3 Mar 2020 12:04:08 +0100

Add a feature on frontier API

Diffstat:
Msrc/senc3d.h | 6+++---
Msrc/senc3d_descriptor.c | 8+++++---
Msrc/senc3d_scene_analyze.c | 11++++++-----
Msrc/senc3d_scene_c.h | 8+++++++-
Msrc/test_senc3d_scene.c | 28++++++++++++++++++----------
5 files changed, 39 insertions(+), 22 deletions(-)

diff --git a/src/senc3d.h b/src/senc3d.h @@ -284,13 +284,13 @@ senc3d_scene_get_frontier_segments_count (const struct senc3d_scene* scene, unsigned* count); -/* Returns the iseg_th frontier segment; the returned indices are global vertex - * indices whose coordinates can be retrieved using senc3d_scene_get_vertex. */ +/* Returns the iseg_th frontier segment (triangle and vertices global IDs). */ SENC3D_API res_T senc3d_scene_get_frontier_segment (const struct senc3d_scene* scene, const unsigned iseg, - unsigned vrtx_id[SENC3D_GEOMETRY_DIMENSION-1]); + unsigned vrtx_id[SENC3D_GEOMETRY_DIMENSION-1], + unsigned* trg_id); SENC3D_API res_T senc3d_scene_ref_get diff --git a/src/senc3d_descriptor.c b/src/senc3d_descriptor.c @@ -140,10 +140,11 @@ res_T senc3d_scene_get_frontier_segment (const struct senc3d_scene* scn, const unsigned iseg, /* There is no defined type for segment IDs */ - vrtx_id_t vrtx_id[2]) + vrtx_id_t vrtx_id[2], + unsigned* trg_id) { - const struct trg_edge* edge; - if(!vrtx_id || !scn + const struct frontier_edge* edge; + if(!vrtx_id || !scn || !trg_id || iseg >= darray_frontier_edge_size_get(&scn->analyze.frontiers)) return RES_BAD_ARG; edge = darray_frontier_edge_cdata_get(&scn->analyze.frontiers) + iseg; @@ -151,5 +152,6 @@ senc3d_scene_get_frontier_segment ASSERT(edge->vrtx1 <= VRTX_MAX__); vrtx_id[0] = edge->vrtx0; vrtx_id[1] = edge->vrtx1; + *trg_id = edge->trg; return RES_OK; } diff --git a/src/senc3d_scene_analyze.c b/src/senc3d_scene_analyze.c @@ -643,7 +643,7 @@ group_connex_components #pragma omp single { res_T tmp_res = RES_OK; - size_t ec = ATOMIC_GET(next_enclosure_id); + size_t ec = (size_t)ATOMIC_GET(next_enclosure_id); ASSERT(ec <= ENCLOSURE_MAX__); scn->analyze.enclosures_count = (enclosure_id_t)ec; tmp_res = darray_enclosure_resize(&scn->analyze.enclosures, @@ -933,13 +933,14 @@ collect_and_link_neighbours && p_crt_side->medium != p_ccw_side->medium) #pragma omp critical { - struct trg_edge disc; + struct frontier_edge frontier_edge; log_warn(scn->dev, "%s: found frontier involving triangle "PRTF_TRG".\n", FUNC_NAME, crt_id); - disc.vrtx0 = v0; - disc.vrtx1 = v1; - darray_frontier_edge_push_back(frontiers, &disc); + frontier_edge.trg = crt_id; + frontier_edge.vrtx0 = v0; + frontier_edge.vrtx1 = v1; + darray_frontier_edge_push_back(frontiers, &frontier_edge); } } } diff --git a/src/senc3d_scene_c.h b/src/senc3d_scene_c.h @@ -121,8 +121,14 @@ struct trgside { * front(trg_0), back(trg_0), front(trg_1), back(trg_1), ... */ }; +/* Frontier edge type */ +struct frontier_edge { + trg_id_t trg; + vrtx_id_t vrtx0, vrtx1; +}; + #define DARRAY_NAME frontier_edge -#define DARRAY_DATA struct trg_edge +#define DARRAY_DATA struct frontier_edge #include <rsys/dynamic_array.h> union double3 { diff --git a/src/test_senc3d_scene.c b/src/test_senc3d_scene.c @@ -28,7 +28,7 @@ main(int argc, char** argv) struct senc3d_enclosure* enc = NULL; struct senc3d_enclosure_header header; struct context ctx = CONTEXT_NULL__; - unsigned medfront[2], medback[2], ind[3], ids[2]; + unsigned medfront[2], medback[2], ind[3], ids[2], trg; double vrtx[3]; unsigned count, i, maxm; int convention; @@ -194,13 +194,21 @@ main(int argc, char** argv) OK(senc3d_scene_get_frontier_segments_count(scn, &count)); CHK(count == 0); - BA(senc3d_scene_get_frontier_segment(NULL, 0, ids)); - BA(senc3d_scene_get_frontier_segment(scn, UINT_MAX, ids)); - BA(senc3d_scene_get_frontier_segment(scn, 0, NULL)); - BA(senc3d_scene_get_frontier_segment(NULL, UINT_MAX, ids)); - BA(senc3d_scene_get_frontier_segment(NULL, 0, NULL)); - BA(senc3d_scene_get_frontier_segment(scn, UINT_MAX, NULL)); - BA(senc3d_scene_get_frontier_segment(NULL, UINT_MAX, NULL)); + BA(senc3d_scene_get_frontier_segment(NULL, 0, ids, &trg)); + BA(senc3d_scene_get_frontier_segment(scn, UINT_MAX, ids, &trg)); + BA(senc3d_scene_get_frontier_segment(scn, 0, NULL, &trg)); + BA(senc3d_scene_get_frontier_segment(scn, 0, ids, NULL)); + BA(senc3d_scene_get_frontier_segment(NULL, UINT_MAX, ids, &trg)); + BA(senc3d_scene_get_frontier_segment(NULL, 0, NULL, &trg)); + BA(senc3d_scene_get_frontier_segment(NULL, 0, ids, NULL)); + BA(senc3d_scene_get_frontier_segment(scn, UINT_MAX, NULL, &trg)); + BA(senc3d_scene_get_frontier_segment(scn, UINT_MAX, ids, NULL)); + BA(senc3d_scene_get_frontier_segment(scn, 0, NULL, NULL)); + BA(senc3d_scene_get_frontier_segment(NULL, UINT_MAX, NULL, &trg)); + BA(senc3d_scene_get_frontier_segment(NULL, UINT_MAX, ids, NULL)); + BA(senc3d_scene_get_frontier_segment(NULL, 0, NULL, NULL)); + BA(senc3d_scene_get_frontier_segment(scn, UINT_MAX, NULL, NULL)); + BA(senc3d_scene_get_frontier_segment(NULL, UINT_MAX, NULL, NULL)); BA(senc3d_scene_ref_get(NULL)); OK(senc3d_scene_ref_get(scn)); @@ -229,8 +237,8 @@ main(int argc, char** argv) OK(senc3d_scene_get_frontier_segments_count(scn, &count)); CHK(count == 3); - OK(senc3d_scene_get_frontier_segment(scn, 0, ids)); - BA(senc3d_scene_get_frontier_segment(scn, 3, ids)); + OK(senc3d_scene_get_frontier_segment(scn, 0, ids, &trg)); + BA(senc3d_scene_get_frontier_segment(scn, 3, ids, &trg)); OK(senc3d_scene_ref_put(scn));