26namespace detail::line {
28template <floating_point Real, std::size_t NumDimensions,
typename T,
29 template <
typename>
typename InterpolationKernel>
30struct vertex_property_sampler;
34template <
floating_po
int Real, std::
size_t NumDimensions>
59 std::map<std::string, std::unique_ptr<vertex_property_type>>;
65 template <
typename T,
template <
typename>
typename InterpolationKernel>
101 &vertex_property<vec<Real, NumDimensions>>(
"tangents");
111 for (
auto& [name, prop] : other.m_vertex_properties) {
114 if (other.m_parameterization_property) {
117 if (other.m_tangent_property) {
119 &vertex_property<vec<Real, NumDimensions>>(
"tangents");
132 line(std::convertible_to<pos_type>
auto&&... vs)
146 auto vertex_at(std::size_t
const i)
const ->
auto const& {
177 requires(
sizeof...(components) == NumDimensions)
202 template <
typename OtherReal>
214 requires(
sizeof...(components) == NumDimensions)
239 template <
typename OtherReal>
256 template <
template <
typename>
typename InterpolationKernel>
266 template <
template <
typename>
typename InterpolationKernel,
typename T>
269 InterpolationKernel>{*
this, prop};
272 template <
typename T>
274 return sampler<interpolation::linear>(prop);
277 template <
typename T>
279 return sampler<interpolation::cubic>(prop);
282 template <
template <
typename>
typename InterpolationKernel,
typename T>
284 return sampler<InterpolationKernel>(vertex_property<T>(name));
287 template <
typename T>
289 return vertex_property_sampler<interpolation::linear, T>(name);
292 template <
typename T>
294 return vertex_property_sampler<interpolation::cubic, T>(name);
299 for (std::size_t i = 0; i <
vertices().size() - 1; ++i) {
308 template <
typename T>
312 return insert_vertex_property<T>(name);
314 if (
typeid(T) != it->second->type()) {
315 throw std::runtime_error{
316 "type of property \"" + name +
"\"(" +
317 boost::core::demangle(it->second->type().name()) +
318 ") does not match specified type " + type_name<T>() +
"."};
325 template <
typename T>
329 throw std::runtime_error{
"property \"" + name +
"\" not found"};
331 if (
typeid(T) != it->second->type()) {
332 throw std::runtime_error{
333 "type of property \"" + name +
"\"(" +
334 boost::core::demangle(it->second->type().name()) +
335 ") does not match specified type " + type_name<T>() +
"."};
343 return vertex_property<tatooine::real_number>(name);
347 return vertex_property<tatooine::real_number>(name);
351 return vertex_property<vec2>(name);
355 return vertex_property<vec2>(name);
359 return vertex_property<vec3>(name);
363 return vertex_property<vec3>(name);
367 return vertex_property<vec4>(name);
371 return vertex_property<vec4>(name);
375 return vertex_property<mat2>(name);
379 return vertex_property<mat2>(name);
383 return vertex_property<mat3>(name);
387 return vertex_property<mat3>(name);
391 return vertex_property<mat4>(name);
395 return vertex_property<mat4>(name);
398 template <
typename T>
402 name, std::make_unique<typed_vertex_property_type<T>>(value)});
403 auto prop =
dynamic_cast<typed_vertex_property_type<T>*
>(it->second.get());
409 std::string
const& name,
410 tatooine::real_number
const value = tatooine::real_number{}) ->
auto& {
411 return insert_vertex_property<tatooine::real_number>(name, value);
417 return insert_vertex_property<vec2>(name, value);
423 return insert_vertex_property<vec3>(name, value);
429 return insert_vertex_property<vec4>(name, value);
435 return insert_vertex_property<mat2>(name, value);
441 return insert_vertex_property<mat3>(name, value);
447 return insert_vertex_property<mat4>(name, value);
459 &vertex_property<vec<Real, NumDimensions>>(
"tangents");
466 throw std::runtime_error{
"no tangent property present"};
474 auto const half = stencil_size / 2;
478 auto const rv = lv.
index() + stencil_size - 1 >=
vertices().size()
480 : lv + stencil_size - 1;
481 auto const rpotential = stencil_size - (rv.index() - lv.index() + 1);
482 lv = rpotential > lv.index() ?
vertex_handle{0} : lv - rpotential;
484 std::vector<real_type> ts(stencil_size);
486 for (
auto vi = lv; vi <= rv; ++vi, ++i) {
487 ts[i] = t[vi] - t[v];
492 for (
auto vi = lv; vi <= rv; ++vi, ++i) {
511 throw std::runtime_error{
512 "Cannot create parameterization property on const line."};
520 for (std::size_t i = 1; i <
vertices().size(); ++i) {
533 for (std::size_t i = 1; i <
vertices().size(); ++i) {
546 for (std::size_t i = 1; i <
vertices().size(); ++i) {
577 auto write(filesystem::path
const& path) ->
void {
578 auto const ext = path.extension();
579 if constexpr (NumDimensions == 2 || NumDimensions == 3) {
583 }
else if (ext ==
".vtp") {
588 throw std::runtime_error(
589 "Could not write line. Unknown file extension: \"" + ext.string() +
594 std::string
const& title =
"tatooine line") const ->
void {
599 integral ConnectivityInt = std::int64_t,
601 auto write_vtp(filesystem::path
const& path)
const ->
void {
607 static auto read(filesystem::path
const& path) {
608 auto const file_ext = path.extension();
609 if constexpr (NumDimensions == 2 || NumDimensions == 3) {
610 if (file_ext ==
".vtp") {
614 throw std::runtime_error{
"Could not read " + path.string()};
618 auto const file_ext = path.extension();
619 if constexpr (NumDimensions == 2 || NumDimensions == 3) {
620 if (file_ext ==
".vtp") {
630 std::vector<std::array<Real, 3>> points;
631 std::vector<int> lines;
633 void on_points(std::vector<std::array<Real, 3>>
const& points_)
override {
636 void on_lines(std::vector<int>
const& lines_)
override { lines = lines_; }
643 std::vector<line<Real, 3>> lines;
644 auto const& vs = listener.points;
646 while (i < listener.lines.size()) {
647 auto const size =
static_cast<std::size_t
>(listener.lines[i++]);
648 auto& l = lines.emplace_back();
649 for (; i <
size; ++i) {
650 l.push_back({vs[i][0], vs[i][1], vs[i][2]});
661 throw std::runtime_error{
"[line::read_vtp] can only read from poly_data"};
663 read(reader.poly_data()->pieces.back());
671 throw std::runtime_error{
"[line::read_vtp] can only read from poly_data"};
673 auto lines = std::vector<this_type>{};
674 lines.reserve(reader.poly_data()->pieces.size());
676 for (
auto& piece : reader.poly_data()->pieces) {
677 lines.emplace_back().read(piece);
684 template <std::
size_t N>
689 if (data_array.num_components() != N) {
692 auto data_type_getter = [&]<
typename value_t>(value_t ) {
693 using prop_t = std::conditional_t<N == 1, value_t, vec<value_t, N>>;
694 auto& prop = insert_vertex_property<prop_t>(name);
695 auto prop_data_setter = [&prop, i = std::size_t{},
696 this](std::vector<value_t>
const& data)
mutable {
699 if constexpr (N == 1) {
702 for (std::size_t j = 0; j < N; ++j) {
708 data_array.visit_data(prop_data_setter);
718 [&]<std::size_t... Is>(std::index_sequence<Is...>) {
719 (std::invoke(&this_type::read_vtp_prop<Is + 1>,
this, name, data_array),
722 (std::make_index_sequence<10>{});
728 points.visit_data([&](
auto&& point_data) {
730 for (std::size_t i = 0; i < point_data.size(); i += 3) {
733 push_back(point_data[i], point_data[i + 1]);
735 push_back(point_data[i], point_data[i + 1], point_data[i + 2]);
746 for (
auto const& [name, data_array] : p.point_data) {
767 template <
typename Pred>
768 std::vector<line<Real, NumDimensions>>
filter(Pred&& pred)
const;
770 template <
template <
typename>
typename InterpolationKernel,
typename T,
773 this_type& resampled_line, std::string
const& name,
777 auto const prop_sampler = sampler<InterpolationKernel>(prop);
778 auto v = resampled_line.
vertices().front();
779 for (
auto const t : resample_space) {
780 resampled_prop[v++] = prop_sampler(t);
784 template <
template <
typename>
typename InterpolationKernel,
typename... Ts,
787 this_type& resampled_line, std::string
const& name,
791 if (prop.
type() ==
typeid(Ts)) {
792 resample_vertex_property<InterpolationKernel>(
793 resampled_line, name,
794 *dynamic_cast<typed_vertex_property_type<Ts> const*>(&prop),
800 template <
template <
typename>
typename InterpolationKernel,
805 auto const positions = sampler<InterpolationKernel>();
807 for (
auto const t : resample_space) {
808 auto const v = resampled_line.
push_back(positions(t));
816 resampled_line, name, *prop, resample_space);
818 return resampled_line;
824template <
typename... Tensors,
typename... Reals, std::size_t NumDimensions>
835template <
typename Real, std::
size_t N>
856template <std::
size_t NumDimensions>
865template <
floating_po
int Real, std::
size_t NumDimensions>
866template <
typename Pred>
868 -> std::vector<line<Real, NumDimensions>> {
869 auto filtered_lines = std::vector<line<Real, NumDimensions>>{};
870 auto need_new_strip =
true;
872 auto i = std::size_t{};
873 auto closed = is_closed();
876 if (need_new_strip) {
877 filtered_lines.emplace_back();
878 need_new_strip =
false;
880 filtered_lines.back().push_back(x);
883 need_new_strip =
true;
884 if (!filtered_lines.empty() &&
885 filtered_lines.back().vertices().size() <= 1)
886 filtered_lines.pop_back();
891 if (!filtered_lines.empty() && filtered_lines.back().vertices().size() <= 1) {
892 filtered_lines.pop_back();
894 if (filtered_lines.size() == 1) {
895 filtered_lines.front().set_closed(closed);
897 return filtered_lines;
900template <
floating_po
int Real = real_number>
902 auto ls = std::vector<Line3<Real>>{};
905 throw std::runtime_error{
"[read_lines] can only read from poly_data"};
907 for (
auto& piece : reader.poly_data()->pieces) {
Definition: vtk_legacy.h:184
auto add_listener(legacy_file_listener &listener) -> void
Definition: concepts.h:33
Definition: concepts.h:30
Definition: concepts.h:21
Definition: concepts.h:84
Definition: concepts.h:27
auto finite_differences_coefficients(std::size_t const derivative_order, floating_point auto const ... xs)
See What is this? for an explanation.
Definition: finite_differences_coefficients.h:13
auto visit(data_type dt, auto &&f)
Definition: data_type.h:25
Definition: algorithm.h:6
typename common_type_impl< Ts... >::type common_type
Definition: common_type.h:23
auto end(Range &&range)
Definition: iterator_facade.h:322
auto vertices(pointset< Real, NumDimensions > const &ps)
Definition: vertex_container.h:278
auto read_lines(filesystem::path const &filepath)
Definition: line.h:901
constexpr auto invoke(invocable auto &&...funcs)
Definition: functional.h:8
constexpr auto norm(base_tensor< Tensor, T, N > const &t, unsigned p=2) -> T
Definition: norm.h:23
constexpr auto max(A &&a, B &&b)
Definition: math.h:20
auto size(vec< ValueType, N > const &v)
Definition: vec.h:148
static auto constexpr is_line
Definition: line.h:839
constexpr auto min(A &&a, B &&b)
Definition: math.h:15
static constexpr forward_tag forward
Definition: tags.h:9
constexpr auto euclidean_distance(base_tensor< Tensor0, T0, N > const &lhs, base_tensor< Tensor1, T1, N > const &rhs)
Definition: distance.h:19
Definition: base_tensor.h:23
Definition: property.h:244
virtual auto type() const -> const std::type_info &=0
for identifying type.
Definition: vertex_container.h:17
Definition: vertex_property_sampler.h:11
Definition: vtk_writer.h:18
auto write(filesystem::path const &path, std::string const &title) const
Definition: vtk_writer.h:27
Definition: vtp_writer.h:18
auto write(filesystem::path const &path) const
Definition: vtp_writer.h:27
auto index() const
Definition: handle.h:64
constexpr handle()
Definition: handle.h:24
All types that are no lines.
Definition: line.h:832
auto clear()
Definition: line.h:142
auto front_vertex() -> auto &
Definition: line.h:171
auto operator[](vertex_handle const i) const -> auto const &
Definition: line.h:163
auto pop_back()
Definition: line.h:211
auto write(filesystem::path const &path) -> void
Definition: line.h:577
auto mat2_vertex_property(std::string const &name) const -> auto const &
Definition: line.h:374
pos_container_type m_vertices
Definition: line.h:79
auto sampler() const
Definition: line.h:257
auto read_single(filesystem::path const &path)
Definition: line.h:617
auto vertices() const
Definition: line.h:250
auto set_closed(bool const is_closed=true)
Definition: line.h:306
auto copy_without_properties()
Definition: line.h:138
auto push_back(arithmetic auto const ... components)
Definition: line.h:176
auto mat3_vertex_property(std::string const &name) -> auto &
Definition: line.h:386
auto compute_parameterization(Real const t0=0) -> void
Definition: line.h:558
auto write_vtk(filesystem::path const &path, std::string const &title="tatooine line") const -> void
Definition: line.h:593
auto compute_normalized_parameterization(Real const t0=0) -> void
Definition: line.h:562
auto vertex_at(std::size_t const i) const -> auto const &
Definition: line.h:146
auto insert_scalar_vertex_property(std::string const &name, tatooine::real_number const value=tatooine::real_number{}) -> auto &
Definition: line.h:408
auto read(vtk::xml::piece const &p)
TODO actually read connectivy data array from the lines tag.
Definition: line.h:742
auto has_vertex_property(const std::string &name) const -> bool
Definition: line.h:452
static auto read_vtk(std::string const &filepath)
Definition: line.h:626
auto compute_centripetal_parameterization(Real const t0=0) -> void
Definition: line.h:543
auto num_vertices() const
Definition: line.h:251
auto read_vtp_positions(vtk::xml::data_array const &points)
Definition: line.h:725
Real real_type
Definition: line.h:38
auto cubic_sampler() const
Definition: line.h:264
auto back_vertex() -> auto &
Definition: line.h:174
line(line const &other)
Definition: line.h:91
auto tangents() -> auto &
Definition: line.h:456
line(pos_container_type &&data, bool is_closed=false)
Definition: line.h:129
auto vertex_property(std::string const &name) const -> const auto &
Definition: line.h:326
auto linear_vertex_property_sampler(std::string const &name) const
Definition: line.h:288
vec_type pos_type
Definition: line.h:40
auto mat4_vertex_property(std::string const &name) const -> auto const &
Definition: line.h:390
auto mat2_vertex_property(std::string const &name) -> auto &
Definition: line.h:378
auto tangents() const -> auto const &
Definition: line.h:464
std::vector< line< Real, NumDimensions > > filter(Pred &&pred) const
auto push_back(pos_type const &p)
Definition: line.h:186
auto has_parameterization() const
Definition: line.h:498
auto mat4_vertex_property(std::string const &name) -> auto &
Definition: line.h:394
auto at(vertex_handle const i) const -> auto const &
Definition: line.h:158
auto operator=(line const &other) -> line &
Definition: line.h:107
static auto read_vtp(std::string const &filepath)
Definition: line.h:666
auto pop_front()
Definition: line.h:248
auto compute_uniform_parameterization(Real const t0=0) -> void
Definition: line.h:517
auto num_line_segments() const
Definition: line.h:252
auto read_vtp_single_piece(std::string const &filepath)
Definition: line.h:656
auto compute_normalized_chordal_parameterization(Real const t0=0) -> void
Definition: line.h:538
auto vec3_vertex_property(std::string const &name) -> auto &
Definition: line.h:362
auto vertex_at(std::size_t const i) -> auto &
Definition: line.h:149
auto push_front(arithmetic auto const ... components)
Definition: line.h:213
auto push_front(vec< OtherReal, NumDimensions > const &p)
Definition: line.h:240
auto compute_chordal_parameterization(Real const t0=0) -> void
Definition: line.h:530
parameterization_property_type * m_parameterization_property
Definition: line.h:84
static constexpr auto num_dimensions() -> std::size_t
Definition: line.h:72
auto resample_vertex_property(this_type &resampled_line, std::string const &name, vertex_property_type const &prop, linspace< ResampleSpaceReal > const &resample_space)
Definition: line.h:786
vertex_property_container_type m_vertex_properties
Definition: line.h:83
auto read_vtp_prop(std::string const &name, vtk::xml::data_array const &data_array)
Calls read_vtp_prop<N> with N = 1..10.
Definition: line.h:714
auto scalar_vertex_property(std::string const &name) -> auto &
Definition: line.h:346
line(filesystem::path const &path)
Definition: line.h:136
auto resample(linspace< ResampleSpaceReal > const &resample_space)
Definition: line.h:802
line(line &&other) noexcept=default
auto front_vertex() const -> auto const &
Definition: line.h:170
auto vec3_vertex_property(std::string const &name) const -> auto const &
Definition: line.h:358
auto vec2_vertex_property(std::string const &name) const -> auto const &
Definition: line.h:350
auto resample_vertex_property(this_type &resampled_line, std::string const &name, typed_vertex_property_type< T > const &prop, linspace< ResampleSpaceReal > const &resample_space)
Definition: line.h:772
static auto read(filesystem::path const &path)
Definition: line.h:607
auto is_closed() const
Definition: line.h:305
auto mat3_vertex_property(std::string const &name) const -> auto const &
Definition: line.h:382
auto at(vertex_handle const i) -> auto &
Definition: line.h:161
auto push_front(pos_type &&p)
Definition: line.h:231
auto vec4_vertex_property(std::string const &name) -> auto &
Definition: line.h:370
auto empty() const
Definition: line.h:140
auto sampler(typed_vertex_property_type< T > const &prop) const
Definition: line.h:267
auto linear_sampler(typed_vertex_property_type< T > const &prop) const
Definition: line.h:273
auto insert_vertex_property(std::string const &name, T const &value=T{}) -> auto &
Definition: line.h:399
auto push_back(pos_type &&p)
Definition: line.h:194
auto push_back(vec< OtherReal, NumDimensions > const &p)
Definition: line.h:203
std::map< std::string, std::unique_ptr< vertex_property_type > > vertex_property_container_type
Definition: line.h:59
auto linear_sampler() const
Definition: line.h:262
auto push_front(pos_type const &p)
Definition: line.h:223
auto vec2_vertex_property(std::string const &name) -> auto &
Definition: line.h:354
auto operator=(line &&other) noexcept -> line &=default
auto vertex_property_sampler(std::string const &name) const
Definition: line.h:283
auto cubic_sampler(typed_vertex_property_type< T > const &prop) const
Definition: line.h:278
auto vec4_vertex_property(std::string const &name) const -> auto const &
Definition: line.h:366
auto insert_vec2_vertex_property(std::string const &name, tatooine::vec2 const value=tatooine::vec2{}) -> auto &
Definition: line.h:414
line(std::convertible_to< pos_type > auto &&... vs)
Definition: line.h:132
auto read_vtp_prop(std::string const &name, vtk::xml::data_array const &data_array)
Definition: line.h:685
auto insert_mat2_vertex_property(std::string const &name, tatooine::mat2 const value=tatooine::mat2{}) -> auto &
Definition: line.h:432
tangent_property_type * m_tangent_property
Definition: line.h:85
auto vertex_properties() const -> auto const &
Definition: line.h:450
auto parameterization() -> auto &
Definition: line.h:502
std::deque< pos_type > pos_container_type
Definition: line.h:41
auto insert_mat4_vertex_property(std::string const &name, tatooine::mat4 const value=tatooine::mat4{}) -> auto &
Definition: line.h:444
auto vertex_at(vertex_handle const i) const -> auto const &
Definition: line.h:151
auto arc_length() const
Definition: line.h:297
auto compute_tangents(std::size_t const stencil_size=3)
Definition: line.h:471
auto operator[](vertex_handle const i) -> auto &
Definition: line.h:166
auto parameterization() const -> auto const &
Definition: line.h:509
auto insert_mat3_vertex_property(std::string const &name, tatooine::mat3 const value=tatooine::mat3{}) -> auto &
Definition: line.h:438
vec< Real, NumDimensions > vec_type
Definition: line.h:39
bool m_is_closed
Definition: line.h:80
auto compute_normalized_centripetal_parameterization(Real const t0=0) -> void
Definition: line.h:552
auto vertex_property(std::string const &name) -> auto &
Definition: line.h:309
auto normalize_parameterization() -> void
Definition: line.h:567
auto back_vertex() const -> auto const &
Definition: line.h:173
auto scalar_vertex_property(std::string const &name) const -> auto const &
Definition: line.h:342
auto cubic_vertex_property_sampler(std::string const &name) const
Definition: line.h:293
auto insert_vec4_vertex_property(std::string const &name, tatooine::vec4 const value=tatooine::vec4{}) -> auto &
Definition: line.h:426
line(pos_container_type const &data, bool is_closed=false)
Definition: line.h:126
auto insert_vec3_vertex_property(std::string const &name, tatooine::vec3 const value=tatooine::vec3{}) -> auto &
Definition: line.h:420
auto vertex_at(vertex_handle const i) -> auto &
Definition: line.h:154
auto compute_normalized_uniform_parameterization(Real const t0=0) -> void
Definition: line.h:525
auto write_vtp(filesystem::path const &path) const -> void
Definition: line.h:601
Definition: linspace.h:26
Definition: property.h:293
static auto constexpr zeros()
Definition: vec.h:26
Definition: vtk_legacy.h:92
Definition: data_array.h:19