Merge overlapping segments after drawing
authorLukáš Jiřiště <gymnazium.jiriste@gmail.com>
Thu, 26 Dec 2024 21:26:02 +0000 (22:26 +0100)
committerLukáš Jiřiště <gymnazium.jiriste@gmail.com>
Thu, 26 Dec 2024 21:26:02 +0000 (22:26 +0100)
src/schema_mode.c

index f910b521ac5e86915ffbd0e9ea68fa77732ad02f..f4c9a3ef22093ed4db5a35234a3bc1b2915ee8e1 100644 (file)
@@ -241,6 +241,34 @@ int        cmp_seg(const void *v_seg1, const void *v_seg2)
        return (0);
 }
 
+static void    merge_overlapping_segments(t_node *node)
+{
+       size_t                  i;
+       size_t                  j;
+       t_node_segment  *seg_i;
+       t_node_segment  *seg_j;
+
+       i = 0;
+       while (i < node->segments.size)
+       {
+               seg_i = ft_vec_access(&node->segments, i);
+               j = i + 1;
+               while (j < node->segments.size)
+               {
+                       seg_j = ft_vec_access(&node->segments, j);
+                       if (pos_is_equal(seg_i->position, seg_j->position))
+                       {
+                               seg_i->connects = merge_connect(seg_i->connects, seg_j->connects);
+                               ft_vec_erase(&node->segments, j, NULL);
+                       }
+                       else
+                               ++j;
+               }
+               ++i;
+       }
+       return ;
+}
+
 void   schema_user_draw_node(WINDOW *schematics_win, t_vec *nodes, t_vec *mosfets, t_position pos)
 {
        t_node                  *chosen_node;
@@ -275,7 +303,11 @@ void       schema_user_draw_node(WINDOW *schematics_win, t_vec *nodes, t_vec *mosfets,
                merge_seg = find_node_seg_at_pos(end_node, seg.position);
                merge_seg->connects = merge_connect(merge_seg->connects, seg.connects);
                if (end_node->id != chosen_node->id)
+               {
+                       index = chosen_node->id;
                        merge_nodes(nodes, mosfets, chosen_node, end_node);
+                       chosen_node = get_node_by_id(nodes, index);
+               }
                schema_draw_segment(schematics_win, merge_seg);
        }
        else
@@ -283,6 +315,8 @@ void        schema_user_draw_node(WINDOW *schematics_win, t_vec *nodes, t_vec *mosfets,
                ft_vec_append(&chosen_node->segments, &seg);
                schema_draw_segment(schematics_win, &seg);
        }
+       merge_overlapping_segments(chosen_node);
+       schema_draw_node(schematics_win, chosen_node);
        wmove(schematics_win, seg.position.y, seg.position.x);
        return ;
 }