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