star-cpr

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

commit cca195062af7ee688e59beac4cff8bd72ae2b262
parent 8b2755579987c610bc794eeff6eb74ba03048deb
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Tue, 21 Feb 2023 10:22:53 +0100

Improve detection algorithm

Don't register new segment pairs when scanning the Y axis, as at the end oly pairs registered on both axis are considered

Diffstat:
Msrc/scpr_intersector.c | 33+++++++++++++++++++--------------
1 file changed, 19 insertions(+), 14 deletions(-)

diff --git a/src/scpr_intersector.c b/src/scpr_intersector.c @@ -220,6 +220,7 @@ static res_T register_segment_interaction (const size_t seg_idx1, const size_t seg_idx2, + const int allow_pair_creation, const enum segment_interaction inter, struct scpr_intersector* intersector) { @@ -235,15 +236,17 @@ register_segment_interaction init_segment_pair(&pair, seg_idx1, seg_idx2); pinteract = htable_interacting_segments_find(&intersector->interacting_segments, &pair); - if(!pinteract) { /* First occurence of this pair: create empty record */ - pinteract = &interact; - interact = NO_INTERACTION; + if(pinteract || allow_pair_creation) { + if(!pinteract) { /* First occurence of this pair: create empty record */ + pinteract = &interact; + interact = NO_INTERACTION; + } + /* Register this interaction */ + ASSERT((*pinteract | inter) < UCHAR_MAX); + *pinteract = (unsigned char)(*pinteract | inter); + ERR(htable_interacting_segments_set(&intersector->interacting_segments, + &pair, pinteract)); } - /* Register this interaction */ - ASSERT((*pinteract | inter) < UCHAR_MAX); - *pinteract = (unsigned char)(*pinteract | inter); - ERR(htable_interacting_segments_set(&intersector->interacting_segments, - &pair, pinteract)); } exit: @@ -258,6 +261,7 @@ static res_T register_segment_interactions (const size_t seg_idx, struct htable_segment_idx* open_segments, + const int allow_pair_creation, const enum segment_interaction inter, struct scpr_intersector* intersector) { @@ -271,7 +275,8 @@ register_segment_interactions /* Loop on segments using this point */ while(!htable_segment_idx_iterator_eq(&it, &end)) { size_t seg2_idx = *htable_segment_idx_iterator_key_get(&it); - ERR(register_segment_interaction(seg_idx, seg2_idx, inter, intersector)); + ERR(register_segment_interaction(seg_idx, seg2_idx, allow_pair_creation, + inter, intersector)); htable_segment_idx_iterator_next(&it); } @@ -345,11 +350,11 @@ register_interaction size_t j; for(j = 0; j < scount; j++) { if(j > s && begins[j] && ends[j]) { - ERR(register_segment_interaction(seg_index[s], seg_index[j], + ERR(register_segment_interaction(seg_index[s], seg_index[j], !dim_idx, dimension->overlap, intersector)); } else if(begins[j] ^ ends[j]) { - ERR(register_segment_interaction(seg_index[s], seg_index[j], + ERR(register_segment_interaction(seg_index[s], seg_index[j], !dim_idx, dimension->contact, intersector)); } } @@ -359,7 +364,7 @@ register_interaction /* 2) Segments only ending at this point overlap open segments */ for(s = 0; s < scount; s++) { if(!begins[s] && ends[s]) { - ERR(register_segment_interactions(seg_index[s], &open_segments, + ERR(register_segment_interactions(seg_index[s], &open_segments, !dim_idx, dimension->overlap, intersector)); } } @@ -375,7 +380,7 @@ register_interaction /* 4) Segments beginning and ending at this point overlap open segments */ for(s = 0; s < scount; s++) { if(begins[s] && ends[s]) { - ERR(register_segment_interactions(seg_index[s], &open_segments, + ERR(register_segment_interactions(seg_index[s], &open_segments, !dim_idx, dimension->overlap, intersector)); } } @@ -391,7 +396,7 @@ register_interaction /* 6) Segments only beginning at this point overlap open segments */ for(s = 0; s < scount; s++) { if(begins[s] && !ends[s]) { - ERR(register_segment_interactions(seg_index[s], &open_segments, + ERR(register_segment_interactions(seg_index[s], &open_segments, !dim_idx, dimension->overlap, intersector)); } }