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