137 {
138
139 std::vector<int32_t> label_map(m_width * m_height, 0);
140
141 for (const Node_ptr &n : get_nodes()) {
142 if (n->area() == 0) continue;
143
144 for (auto &[_, p] : n->get_pixels()) {
145 label_map[p.y * m_width + p.x] = n->id();
146 }
147 }
148
149 constexpr int8_t dirs[8][2]{{1, 0}, {-1, 0}, {0, 1}, {0, -1},
150 {1, 1}, {-1, -1}, {-1, 1}, {1, -1}};
151
152
153 for (const Node_ptr &n : get_nodes()) {
154 if (n->area() == 0) continue;
155 int32_t val = n->id();
156
157 for (auto &[_, p] : n->get_pixels()) {
158 int x = p.x;
159 int y = p.y;
160
161
162 for (int k = 0; k < 8; ++k) {
163 int nx = x + dirs[k][0];
164 int ny = y + dirs[k][1];
165
166
167 if (nx < 0 || nx >= m_width || ny < 0 || ny >= m_height) continue;
168
169 int32_t n_val = label_map[ny * m_width + nx];
170
171
172 if (n_val != 0 && n_val != val && val < n_val) {
173 bool is_too_thin = false;
174
175
176 for (int mk = 0; mk < 8; ++mk) {
177 int mx = nx + dirs[mk][0];
178 int my = ny + dirs[mk][1];
179
180 if (mx < 0 || mx >= m_width || my < 0 || my >= m_height) continue;
181
182 int32_t m_val = label_map[my * m_width + mx];
183
184 if (m_val != 0 && m_val != val && m_val != n_val) {
185 is_too_thin = true;
186 break;
187 }
188 }
189
190 if (is_too_thin) {
191
192 Node_ptr neighbor_node =
193 m_nodes->at(m_node_ids[n_val]);
194
195 if (neighbor_node) {
196 neighbor_node->add_edge_pixel(
XY{x, y});
197 }
198 } else {
199
200 n->add_edge_pixel(
XY{nx, ny});
201 }
202 }
203 }
204 }
205 }
206}