6#ifndef GEMMI_FLOODFILL_HPP_
7#define GEMMI_FLOODFILL_HPP_
15template<
typename T,
int Land>
57 r.lines.push_back(line_from_point(u, v, w, ptr));
59 for (
size_t i = 0;
i <
r.lines.size(); ++
i) {
60 int u_ =
r.lines[
i].u;
61 int v_ =
r.lines[
i].v;
62 int w_ =
r.lines[
i].w;
64 int ulen = std::min(
mask.
nu,
r.lines[
i].ulen + 2);
82 template<
typename Func>
85 for (
int w = 0; w !=
mask.
nw; ++w)
86 for (
int v = 0; v !=
mask.
nv; ++v)
87 for (
int u = 0; u !=
mask.
nu; ++u, ++idx) {
101 void add_lines(
int u,
int v,
int w,
int ulen, Result&
r) {
103 for (
int i = 0;
i < std::min(ulen,
mask.
nu - u); ++
i)
104 if (ptr[
i] ==
Land) {
105 r.lines.push_back(line_from_point(u +
i, v, w, ptr +
i));
108 for (
int i = -u; i < ulen -
mask.
nu; ++i)
109 if (ptr[i] == Land) {
110 r.lines.push_back(line_from_point(u + i, v, w, ptr + i));
115 Line line_from_point(
int u,
int v,
int w,
T* ptr)
const {
117 while (u + len <
mask.
nu && ptr[len] == Land)
122 for (
int i = 0; i > -u; --i)
123 if (ptr[i-1] != Land)
124 return {u + i, v, w, len - i, ptr + i};
125 if (ptr[
mask.
nu-1-u] != Land)
126 return {0, v, w, len + u, ptr - u};
127 for (
int i =
mask.
nu - 1 - u; i > 1; --i)
128 if (ptr[i-1] != Land)
129 return {u + i, v, w, len +
mask.
nu - 2 - i, ptr + i};
130 return {u, v, w,
mask.
nu, ptr};
136 mask.copy_metadata_from(grid);
137 mask.data.resize(grid.data.size());
139 for (
float d : grid.data)
144 const std::vector<Position>&
seeds,
147 grid.check_not_empty();
152 auto point = mask.get_nearest_point(pos);
156 for (std::int8_t&
d : mask.data)
void mask_nodes_above_threshold(Grid< std::int8_t > &mask, const Grid< float > &grid, double threshold, bool negate=false)
Grid< std::int8_t > flood_fill_above(const Grid< float > &grid, const std::vector< Position > &seeds, double threshold, bool negate=false)
std::vector< Line > lines
size_t point_count() const
void for_each_islands(Func func)
Result find_all_connected_points(int u, int v, int w)
void set_line_values(Line &line, T value) const
void set_volume_values(Result &r, T value) const
static constexpr T this_island()
Coordinates in Angstroms - orthogonal (Cartesian) coordinates.