HighMap library (C++)
Loading...
Searching...
No Matches
drainage_basin.hpp
Go to the documentation of this file.
1/* Copyright (c) 2026 Otto Link. Distributed under the terms of the GNU General
2 Public License. The full license is in the file LICENSE, distributed with
3 this software. */
4#pragma once
5#include <memory>
6#include <unordered_map>
7#include <vector>
8
9#include <glm/glm.hpp>
10
11#include "highmap/array.hpp"
12
13namespace hmap
14{
15
17{
18public:
19 // --- Construction
20
21 DrainageBasin(std::vector<glm::vec3> xyz_);
22
23 const std::vector<glm::vec3> &get_xyz() const;
24 std::vector<glm::vec3> &get_xyz();
25 size_t size() const;
26 void to_csv(const std::string &filename) const;
27
28 // --- Geometry / Mesh
29
30 std::vector<float> compute_vertex_areas() const;
31 void remap(float zmin = 0.f, float zmax = 1.f);
32 void smooth_mesh(float lambda, int iterations = 1);
33 void smooth_mesh_taubin(float lambda, float mu, int iterations = 1);
34
35 // --- Flow graph construction
36
37 void compute_receivers();
38 void update_stream_tree();
39 void update_traversals();
40
41 std::vector<size_t> get_outlets() const;
42 void set_outlets(const std::vector<size_t> &outlet_indices);
43 const std::vector<size_t> &get_receivers() const;
44
45 // --- Basin topology utilities
46
47 std::vector<size_t> compute_strahler_order() const;
48 std::pair<std::vector<size_t>, bool> find_subroots();
49 void remove_lakes(const std::vector<size_t> &subroot);
50
51 // --- Hydrology computations
52
53 std::vector<float> compute_response_times(
54 const std::vector<float> &area_acc,
55 const std::vector<float> &erodibility,
56 float m_exp) const;
57
58 float update_elevations(const std::vector<float> &response_times,
59 float uplift_rate,
60 const std::vector<float> &max_slope);
61
62 void accumulate_area_by_outlet(const std::vector<float> &area,
63 std::vector<float> &acc) const;
64
65 // --- Traversal helpers
66
67 const std::vector<size_t> &for_each_upstream(size_t outlet) const;
68
69 auto for_each_downstream(size_t outlet) const
70 {
71 const auto &t = traversals.at(outlet);
72 return std::make_pair(t.rbegin(), t.rend());
73 }
74
75private:
76 // --- Geometry
77
78 std::vector<glm::vec3> xyz;
79 std::vector<size_t> convex_hull;
80 std::vector<glm::ivec3> triangles;
81 std::vector<std::vector<size_t>> nbrs_indices;
82 std::vector<std::vector<float>> nbrs_distances;
83 float reference_length;
84
85 // --- Flow graph
86
87 std::vector<size_t> receivers;
88 std::vector<size_t> roots;
89 std::vector<std::vector<size_t>> children;
90 std::vector<bool> outlets_mask;
91
92 // --- Traversal cache
93
94 std::unordered_map<size_t, std::vector<size_t>> traversals;
95
96 // --- Constants
97
98 const size_t invalid_index = size_t(-1);
99};
100
101// --- FUNCTIONS
102
103std::vector<size_t> find_border_minima(const std::vector<glm::vec3> &xyz,
104 float eps = 1e-6f);
105
106std::vector<glm::vec3> heightmap_retopology(const Array &z,
107 float max_error,
108 int max_triangles = 0,
109 int max_points = 0);
110
111std::vector<std::vector<size_t>> invert_receiver_map(
112 const std::vector<size_t> &receivers);
113
114std::vector<size_t> sample_border_points(const std::vector<glm::vec3> &xyz,
115 size_t nb);
116
117} // namespace hmap
Declaration of the Array class for 2D floating-point arrays with various mathematical operations and ...
Definition drainage_basin.hpp:17
void to_csv(const std::string &filename) const
Definition drainage_basin.cpp:533
std::pair< std::vector< size_t >, bool > find_subroots()
Definition drainage_basin.cpp:257
const std::vector< size_t > & get_receivers() const
Definition drainage_basin.cpp:320
auto for_each_downstream(size_t outlet) const
Definition drainage_basin.hpp:69
void compute_receivers()
Definition drainage_basin.cpp:127
std::vector< size_t > get_outlets() const
Definition drainage_basin.cpp:310
float update_elevations(const std::vector< float > &response_times, float uplift_rate, const std::vector< float > &max_slope)
Definition drainage_basin.cpp:564
const std::vector< glm::vec3 > & get_xyz() const
Definition drainage_basin.cpp:325
void accumulate_area_by_outlet(const std::vector< float > &area, std::vector< float > &acc) const
Definition drainage_basin.cpp:109
void remap(float zmin=0.f, float zmax=1.f)
Definition drainage_basin.cpp:335
const std::vector< size_t > & for_each_upstream(size_t outlet) const
Definition drainage_basin.cpp:305
void remove_lakes(const std::vector< size_t > &subroot)
Definition drainage_basin.cpp:364
void smooth_mesh(float lambda, int iterations=1)
Definition drainage_basin.cpp:479
std::vector< float > compute_vertex_areas() const
Definition drainage_basin.cpp:230
std::vector< float > compute_response_times(const std::vector< float > &area_acc, const std::vector< float > &erodibility, float m_exp) const
Definition drainage_basin.cpp:192
void update_traversals()
Definition drainage_basin.cpp:645
void set_outlets(const std::vector< size_t > &outlet_indices)
Definition drainage_basin.cpp:466
void update_stream_tree()
Definition drainage_basin.cpp:622
std::vector< size_t > compute_strahler_order() const
Definition drainage_basin.cpp:163
size_t size() const
Definition drainage_basin.cpp:474
void smooth_mesh_taubin(float lambda, float mu, int iterations=1)
Definition drainage_basin.cpp:523
Definition algebra.hpp:23
std::vector< glm::vec3 > heightmap_retopology(const Array &z, float max_error, int max_triangles=0, int max_points=0)
Definition drainage_basin.cpp:794
std::vector< size_t > find_border_minima(const std::vector< glm::vec3 > &xyz, float eps=1e-6f)
Definition drainage_basin.cpp:675
std::vector< std::vector< size_t > > invert_receiver_map(const std::vector< size_t > &receivers)
Definition drainage_basin.cpp:822
std::vector< size_t > sample_border_points(const std::vector< glm::vec3 > &xyz, size_t nb)
Definition drainage_basin.cpp:734