1#ifndef TATOOINE_ISOSURFACE_H
2#define TATOOINE_ISOSURFACE_H
24 typename XDomain,
typename YDomain,
typename ZDomain, arithmetic Isolevel,
26 std::size_t, std::size_t, std::size_t,
27 vec<typename rectilinear_grid<XDomain, YDomain, ZDomain>::real_type,
32 Isolevel
const isolevel) {
38#if defined(NDEBUG) && defined(TATOOINE_OPENMP_AVAILABLE)
41 auto process_cube = [&](
auto ix,
auto iy,
auto iz) {
42 auto vertlist = make_array<pos_type, 12>();
43 using vertlist_type =
decltype(vertlist);
44 using vertlist_size_type =
typename vertlist_type::size_type;
51 decltype(
auto) s0 = get_scalars(ix, iy, iz + 1, p[0]);
52 decltype(
auto) s1 = get_scalars(ix + 1, iy, iz + 1, p[1]);
53 decltype(
auto) s2 = get_scalars(ix + 1, iy, iz, p[2]);
54 decltype(
auto) s3 = get_scalars(ix, iy, iz, p[3]);
55 decltype(
auto) s4 = get_scalars(ix, iy + 1, iz + 1, p[4]);
56 decltype(
auto) s5 = get_scalars(ix + 1, iy + 1, iz + 1, p[5]);
57 decltype(
auto) s6 = get_scalars(ix + 1, iy + 1, iz, p[6]);
58 decltype(
auto) s7 = get_scalars(ix, iy + 1, iz, p[7]);
60 unsigned int cube_index = 0;
93 real_type const s = (isolevel - s0) / (s1 - s0);
94 vertlist[0] = p[0] * (1 - s) + p[1] * s;
97 real_type const s = (isolevel - s1) / (s2 - s1);
98 vertlist[1] = p[1] * (1 - s) + p[2] * s;
101 real_type const s = (isolevel - s2) / (s3 - s2);
102 vertlist[2] = p[2] * (1 - s) + p[3] * s;
105 real_type const s = (isolevel - s3) / (s0 - s3);
106 vertlist[3] = p[3] * (1 - s) + p[0] * s;
109 real_type const s = (isolevel - s4) / (s5 - s4);
110 vertlist[4] = p[4] * (1 - s) + p[5] * s;
113 real_type const s = (isolevel - s5) / (s6 - s5);
114 vertlist[5] = p[5] * (1 - s) + p[6] * s;
117 real_type const s = (isolevel - s6) / (s7 - s6);
118 vertlist[6] = p[6] * (1 - s) + p[7] * s;
121 real_type const s = (isolevel - s7) / (s4 - s7);
122 vertlist[7] = p[7] * (1 - s) + p[4] * s;
125 real_type const s = (isolevel - s0) / (s4 - s0);
126 vertlist[8] = p[0] * (1 - s) + p[4] * s;
129 real_type const s = (isolevel - s1) / (s5 - s1);
130 vertlist[9] = p[1] * (1 - s) + p[5] * s;
133 real_type const s = (isolevel - s2) / (s6 - s2);
134 vertlist[10] = p[2] * (1 - s) + p[6] * s;
137 real_type const s = (isolevel - s3) / (s7 - s3);
138 vertlist[11] = p[3] * (1 - s) + p[7] * s;
141#if defined(NDEBUG) && defined(TATOOINE_OPENMP_AVAILABLE)
143 std::lock_guard lock{mutex};
146 for (std::size_t i = 0;
149 iso_volume.
insert_vertex(vertlist[
static_cast<vertlist_size_type
>(
151 iso_volume.
insert_vertex(vertlist[
static_cast<vertlist_size_type
>(
153 iso_volume.
insert_vertex(vertlist[
static_cast<vertlist_size_type
>(
156#if defined(NDEBUG) && defined(TATOOINE_OPENMP_AVAILABLE)
160#if defined(NDEBUG) && defined(TATOOINE_OPENMP_AVAILABLE)
170template <arithmetic Real,
typename Indexing, arithmetic BBReal,
174 Isolevel
const isolevel) {
177 [&](
auto ix,
auto iy,
auto iz,
auto const & ) ->
auto const& {
178 return data(ix, iy, iz);
186template <arithmetic Real,
typename Indexing,
typename MemLoc, std::size_t XRes,
187 std::size_t YRes, std::size_t ZRes, arithmetic BBReal,
193 [&](
auto ix,
auto iy,
auto iz,
auto const & ) ->
auto const& {
194 return data(ix, iy, iz);
202template <
typename Field, arithmetic FieldReal,
typename XDomain,
203 typename YDomain,
typename ZDomain, arithmetic Isolevel,
204 arithmetic TReal =
int>
207 Isolevel
const isolevel, TReal
const t = 0) {
210 integral auto const ,
auto const& pos) {
return sf(pos, t); },
214template <
typename Gr
id, arithmetic T,
bool HasNonConstReference>
216 Grid, T, HasNonConstReference>
const& data,
220 auto const& ) {
return data(ix, iy, iz); },
221 data.grid(), isolevel);
Definition: dynamic_multidim_array.h:18
auto size() const -> auto const &
Definition: dynamic_multidim_size.h:107
auto num_dimensions() const
Definition: dynamic_multidim_size.h:105
Definition: rectilinear_grid.h:38
constexpr auto size(std::index_sequence< Seq... >) const
Definition: rectilinear_grid.h:347
auto vertex_at(std::index_sequence< DIs... >, std::array< Int, num_dimensions()> const &is) const -> vec< real_type, num_dimensions()>
Definition: rectilinear_grid.h:640
common_type< typename Dimensions::value_type... > real_type
Definition: rectilinear_grid.h:46
Definition: static_multidim_array.h:19
static auto constexpr size()
Definition: static_multidim_array.h:30
Definition: concepts.h:33
Definition: concepts.h:21
static constexpr sequential_t sequential
Definition: tags.h:63
static constexpr parallel_t parallel
Definition: tags.h:60
constexpr std::array< std::array< int, 16 >, 256 > tri_table
Definition: marchingcubeslookuptable.h:35
static constexpr std::array< int, 256 > edge_table
Definition: marchingcubeslookuptable.h:9
Definition: algorithm.h:6
auto isosurface(GetScalars &&get_scalars, rectilinear_grid< XDomain, YDomain, ZDomain > const &g, Isolevel const isolevel)
Indexing and lookup map from http://paulbourke.net/geometry/polygonise/.
Definition: isosurface.h:30
constexpr auto for_loop(Iteration &&iteration, execution_policy::sequential_t, Ranges(&&... ranges)[2]) -> void
Use this function for creating a sequential nested loop.
Definition: for_loop.h:336
Definition: axis_aligned_bounding_box.h:103
auto constexpr max() const -> auto const &
Definition: axis_aligned_bounding_box.h:156
auto constexpr min() const -> auto const &
Definition: axis_aligned_bounding_box.h:151
Definition: vertex_property.h:96
Definition: linspace.h:26
auto insert_vertex(arithmetic auto const ... comps)
Definition: unstructured_simplicial_grid.h:333
auto insert_simplex(Handles const ... handles)
Definition: unstructured_simplicial_grid.h:427
Definition: unstructured_triangular_grid.h:10