1#ifndef TATOOINE_FIELDS_RIDGELINES_H
2#define TATOOINE_FIELDS_RIDGELINES_H
13template <
typename Grid, arithmetic T,
bool HasNonConstReference,
14 typename DomainX,
typename DomainY>
15requires(Grid::num_dimensions() == 2)
17 Grid, T, HasNonConstReference>
const& data,
20 using real_type =
typename Grid::real_type;
23 "[ridgelines]_g", exec);
26 auto const& g_ = g(is...);
27 return vec{-g_(1), g_(0)};
29 "[ridgelines]_c", exec);
31 diff<2>(data),
"[ridgelines]_H", exec);
34 [&](
integral auto const... is) {
return hessian(is...) * g(is...); },
35 "[ridgelines]_Hg", exec);
37 [&](
integral auto const... is) {
return hessian(is...) * c(is...); },
38 "[ridgelines]_Hc", exec);
41 auto i = std::size_t{};
42 auto max_abs = -std::numeric_limits<real_type>::max();
43 for (std::size_t j = 0; j < 2; ++j) {
44 if (
auto const a = gcem::abs(g(is...)(j)); a > max_abs) {
49 return Hc(is...)(i) / g(is...)(i);
51 "[ridgelines]_lambda_g", exec);
54 auto i = std::size_t{};
55 auto max_abs = -std::numeric_limits<real_type>::max();
56 for (std::size_t j = 0; j < 2; ++j) {
57 if (
auto const a = gcem::abs(c(is...)(j)); a > max_abs) {
62 return Hc(is...)(i) / c(is...)(i);
64 "[ridgelines]_lambda_c", exec);
65 auto const compute_d = [&](
integral auto const... is) {
66 auto const& g_ = g(is...);
67 auto const& Hg_ = Hg(is...);
68 return g_(0) * Hg_(1) - g_(1) * Hg_(0);
71 compute_d,
"[ridgelines]_det(g|Hg)", exec);
75 auto lc = lambda_c.linear_sampler();
76 for (
auto const e : raw.simplices()) {
77 auto [v0, v1] = raw[e];
78 if (lc(raw[v0]) <= 0 && lc(raw[v1]) <= 0) {
88template <
typename Grid, arithmetic T,
bool HasNonConstReference,
89 typename DomainX,
typename DomainY>
90requires(Grid::num_dimensions() == 2)
92 Grid, T, HasNonConstReference>
const& data,
94 return ridgelines(data, data.grid.copy_without_properties(), exec);
100template <
typename Grid, arithmetic T,
bool HasNonConstReference,
101 typename DomainX,
typename DomainY>
102requires(Grid::num_dimensions() == 2)
104 Grid, T, HasNonConstReference>
const& data,
110template <
typename Gr
id, arithmetic T,
bool HasNonConstReference>
111requires(Grid::num_dimensions() == 2)
113 Grid, T, HasNonConstReference>
const& data) {
114 return ridgelines(data, data.grid.copy_without_properties(),
Definition: rectilinear_grid.h:38
auto sample_to_vertex_property(F &&f, std::string const &name) -> auto &
Definition: rectilinear_grid.h:1080
Definition: concepts.h:21
static constexpr sequential_t sequential
Definition: tags.h:63
Definition: algorithm.h:6
auto ridgelines(detail::rectilinear_grid::typed_vertex_property_interface< Grid, T, HasNonConstReference > const &data, rectilinear_grid< DomainX, DomainY > &working_grid, execution_policy_tag auto const exec)
Definition: ridgelines.h:16
auto isolines(invocable< std::size_t, std::size_t, Vec2< typename rectilinear_grid< XDomain, YDomain >::real_type > > auto &&get_scalars, rectilinear_grid< XDomain, YDomain > const &g, arithmetic auto const isolevel)
Indexing and lookup map from http://paulbourke.net/geometry/polygonise/.
Definition: isolines.h:24
Definition: vertex_property.h:96