90 template <
typename G>
void connect(
auto s,
auto t, G &
graph,
auto const &grid)
const
92 using edge_property =
typename G::edge_property;
94 if constexpr (std::same_as<typename G::directed_category, anisotropy>)
98 void connect_top_left_corner(
auto s,
auto &
graph,
auto const &grid,
auto const &bound_policy)
const
100 bound_policy(s,
graph, grid);
101 connect(s, s + 1,
graph, grid);
102 connect(s, s + grid.width(),
graph, grid);
105 void connect_top_right_corner(
auto s,
auto &
graph,
auto const &grid,
auto const &bound_policy)
const
107 bound_policy(s,
graph, grid);
108 connect(s, s - 1,
graph, grid);
109 connect(s, s + grid.width(),
graph, grid);
112 void connect_top_border_no_corners(
auto s,
auto &
graph,
auto const &grid,
auto const &bound_policy)
const
114 bound_policy(s,
graph, grid);
115 connect(s, s - 1,
graph, grid);
116 connect(s, s + 1,
graph, grid);
117 connect(s, s + grid.width(),
graph, grid);
120 void connect_bottom_left_corner(
auto s,
auto &
graph,
auto const &grid,
auto const &bound_policy)
const
122 bound_policy(s,
graph, grid);
123 connect(s, s + 1,
graph, grid);
124 connect(s, s - grid.width(),
graph, grid);
127 void connect_bottom_right_corner(
auto s,
auto &
graph,
auto const &grid,
auto const &bound_policy)
const
129 bound_policy(s,
graph, grid);
130 connect(s, s - 1,
graph, grid);
131 connect(s, s - grid.width(),
graph, grid);
134 void connect_bottom_border_no_corner(
auto s,
auto &
graph,
auto const &grid,
auto const &bound_policy)
const
136 bound_policy(s,
graph, grid);
137 connect(s, s - 1,
graph, grid);
138 connect(s, s + 1,
graph, grid);
139 connect(s, s - grid.width(),
graph, grid);
142 void connect_left_border_no_corner(
auto s,
auto &
graph,
auto const &grid,
auto const &bound_policy)
const
144 bound_policy(s,
graph, grid);
145 connect(s, s + 1,
graph, grid);
146 connect(s, s - grid.width(),
graph, grid);
147 connect(s, s + grid.width(),
graph, grid);
150 void connect_right_border_no_corner(
auto s,
auto &
graph,
auto const &grid,
auto const &bound_policy)
const
152 bound_policy(s,
graph, grid);
153 connect(s, s - 1,
graph, grid);
154 connect(s, s - grid.width(),
graph, grid);
155 connect(s, s + grid.width(),
graph, grid);
158 void connect_interior_vertices(
auto s,
auto &
graph,
auto const &grid)
const
160 connect(s, s + 1,
graph, grid);
161 connect(s, s - 1,
graph, grid);
162 connect(s, s + grid.width(),
graph, grid);
163 connect(s, s - grid.width(),
graph, grid);
167 template <
class G, two_dimensional S, bounding<G, S> B>
168 void connect(G &
graph, S
const &grid, B bound_policy)
const
170 using directed_category =
typename G::directed_category;
171 using vertex_property =
typename G::vertex_property;
172 using edge_property =
typename G::edge_property;
174 int width = grid.width();
175 int height = grid.height();
176 int num_land_vertices = width * height;
178 assert(num_land_vertices > 0 and
"trying to initialize a graph from an empty grid.");
180 for (
auto s = 0; s < num_land_vertices; ++s)
189 connect_top_left_corner(s,
graph, grid, bound_policy);
191 else if (col == width - 1)
193 connect_top_right_corner(s,
graph, grid, bound_policy);
197 connect_top_border_no_corners(s,
graph, grid, bound_policy);
200 else if (row == height - 1)
204 connect_bottom_left_corner(s,
graph, grid, bound_policy);
206 else if (col == width - 1)
208 connect_bottom_right_corner(s,
graph, grid, bound_policy);
212 connect_bottom_border_no_corner(s,
graph, grid, bound_policy);
217 connect_left_border_no_corner(s,
graph, grid, bound_policy);
219 else if (col == width - 1)
221 connect_right_border_no_corner(s,
graph, grid, bound_policy);
225 connect_interior_vertices(s,
graph, grid);
237 template <
class G>
void connect(
auto s,
auto t, G &
graph,
auto const &grid)
const
239 using directed_category =
typename G::directed_category;
240 using vertex_property =
typename G::vertex_property;
241 using edge_property =
typename G::edge_property;
244 int width = grid.width();
245 int height = grid.height();
246 int num_land_vertices = width * height;
248 assert( s < num_land_vertices);
250 assert( t < num_land_vertices);
253 if constexpr (std::same_as<directed_category, anisotropy>)
257 void connect_top_left_corner(
auto s,
auto &
graph,
auto const &grid,
auto const &bound_policy)
const
259 bound_policy(s,
graph, grid);
260 connect(s, s + 1,
graph, grid);
261 connect(s, s + grid.width(),
graph, grid);
262 connect(s, s + grid.width() + 1,
graph, grid);
265 void connect_top_right_corner(
auto s,
auto &
graph,
auto const &grid,
auto const &bound_policy)
const
267 bound_policy(s,
graph, grid);
268 connect(s, s - 1,
graph, grid);
269 connect(s, s + grid.width(),
graph, grid);
270 connect(s, s + grid.width() - 1,
graph, grid);
273 void connect_top_border_no_corners(
auto s,
auto &
graph,
auto const &grid,
auto const &bound_policy)
const
275 bound_policy(s,
graph, grid);
276 connect(s, s - 1,
graph, grid);
277 connect(s, s + 1,
graph, grid);
278 connect(s, s + grid.width(),
graph, grid);
279 connect(s, s + grid.width() - 1,
graph, grid);
280 connect(s, s + grid.width() + 1,
graph, grid);
283 void connect_bottom_left_corner(
auto s,
auto &
graph,
auto const &grid,
auto const &bound_policy)
const
285 bound_policy(s,
graph, grid);
286 connect(s, s + 1,
graph, grid);
287 connect(s, s - grid.width(),
graph, grid);
288 connect(s, s - grid.width() + 1,
graph, grid);
291 void connect_bottom_right_corner(
auto s,
auto &
graph,
auto const &grid,
auto const &bound_policy)
const
293 bound_policy(s,
graph, grid);
294 connect(s, s - 1,
graph, grid);
295 connect(s, s - grid.width(),
graph, grid);
296 connect(s, s - grid.width() - 1,
graph, grid);
299 void connect_bottom_border_no_corner(
auto s,
auto &
graph,
auto const &grid,
auto const &bound_policy)
const
301 bound_policy(s,
graph, grid);
302 connect(s, s - 1,
graph, grid);
303 connect(s, s + 1,
graph, grid);
304 connect(s, s - grid.width(),
graph, grid);
305 connect(s, s - grid.width() - 1,
graph, grid);
306 connect(s, s - grid.width() + 1,
graph, grid);
309 void connect_left_border_no_corner(
auto s,
auto &
graph,
auto const &grid,
auto const &bound_policy)
const
311 bound_policy(s,
graph, grid);
312 connect(s, s + 1,
graph, grid);
313 connect(s, s - grid.width(),
graph, grid);
314 connect(s, s + grid.width(),
graph, grid);
315 connect(s, s - grid.width() + 1,
graph, grid);
316 connect(s, s + grid.width() + 1,
graph, grid);
319 void connect_right_border_no_corner(
auto s,
auto &
graph,
auto const &grid,
auto const &bound_policy)
const
321 bound_policy(s,
graph, grid);
322 connect(s, s - 1,
graph, grid);
323 connect(s, s - grid.width(),
graph, grid);
324 connect(s, s + grid.width(),
graph, grid);
325 connect(s, s - grid.width() - 1,
graph, grid);
326 connect(s, s + grid.width() - 1,
graph, grid);
329 void connect_interior_vertices(
auto s,
auto &
graph,
auto const &grid)
const
331 connect(s, s + 1,
graph, grid);
332 connect(s, s - 1,
graph, grid);
333 connect(s, s + grid.width(),
graph, grid);
334 connect(s, s + grid.width() + 1,
graph, grid);
335 connect(s, s + grid.width() - 1,
graph, grid);
336 connect(s, s - grid.width(),
graph, grid);
337 connect(s, s - grid.width() + 1,
graph, grid);
338 connect(s, s - grid.width() - 1,
graph, grid);
342 template <
class G, two_dimensional S, bounding<G, S> B>
343 void connect(G &
graph, S
const &grid, B bound_policy)
const
345 using directed_category =
typename G::directed_category;
346 using vertex_property =
typename G::vertex_property;
347 using edge_property =
typename G::edge_property;
349 int width = grid.width();
350 int height = grid.height();
351 int num_land_vertices = width * height;
353 assert(num_land_vertices > 0 and
"trying to initialize a graph from an empty grid.");
355 for (
auto s = 0; s < num_land_vertices; ++s)
364 connect_top_left_corner(s,
graph, grid, bound_policy);
366 else if (col == width - 1)
368 connect_top_right_corner(s,
graph, grid, bound_policy);
372 connect_top_border_no_corners(s,
graph, grid, bound_policy);
375 else if (row == height - 1)
379 connect_bottom_left_corner(s,
graph, grid, bound_policy);
381 else if (col == width - 1)
383 connect_bottom_right_corner(s,
graph, grid, bound_policy);
387 connect_bottom_border_no_corner(s,
graph, grid, bound_policy);
392 connect_left_border_no_corner(s,
graph, grid, bound_policy);
394 else if (col == width - 1)
396 connect_right_border_no_corner(s,
graph, grid, bound_policy);
400 connect_interior_vertices(s,
graph, grid);