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 <cstddef>
6#include <memory>
7#include <string>
8#include <utility>
9#include <vector>
10
11#include <glm/glm.hpp>
12
13#include "highmap/array.hpp"
15
16#include <unordered_map>
17
18namespace hmap
19{
20
22{
23public:
24 DrainageBasin(std::vector<glm::vec3> xyz_);
25
26 const std::vector<glm::vec3> &get_xyz() const;
27 size_t size() const;
28 void to_csv(const std::string &filename) const;
29
30 // --- Geometry / Mesh ---
31
32 const TerrainTriMesh &get_mesh() const;
34
35 std::vector<float> compute_vertex_areas() const;
36 void remap(float zmin = 0.f, float zmax = 1.f);
37
38 // --- Flow graph construction ---
39
40 void compute_receivers();
41 void compute_receivers(unsigned int seed, float noise_strength = 0.25f);
42 void update_stream_tree(unsigned int seed, float noise_strength);
43 void update_stream_tree();
44 void update_traversals();
45
46 std::vector<size_t> &get_outlets() const;
47 void set_outlets(const std::vector<size_t> &outlet_indices);
48 const std::vector<size_t> &get_receivers() const;
49
51
52 // --- Basin topology utilities ---
53
54 std::vector<bool> compute_is_ridge_node() const;
55 std::vector<size_t> compute_strahler_order() const;
56 std::pair<std::vector<size_t>, bool> find_subroots();
57 std::vector<std::vector<size_t>> get_main_channels() const;
58 void remove_lakes(const std::vector<size_t> &subroot);
59
60 // --- Hydrology computations ---
61
62 std::vector<float> compute_response_times(
63 const std::vector<float> &area_acc,
64 const std::vector<float> &erodibility,
65 float m_exp) const;
66
67 float update_elevations(const std::vector<float> &response_times,
68 float uplift_rate,
69 const std::vector<float> &max_slope);
70
71 void accumulate_area_by_outlet(const std::vector<float> &area,
72 std::vector<float> &acc) const;
73
74 // --- Traversal helpers ---
75
76 const std::vector<size_t> &for_each_upstream(size_t outlet) const;
77
78 auto for_each_downstream(size_t outlet) const
79 {
80 const auto &t = traversals.at(outlet);
81 return std::make_pair(t.rbegin(), t.rend());
82 }
83
84private:
85 // --- Geometry ---
86
87 TerrainTriMesh mesh;
88
89 // --- Flow graph ---
90
91 std::vector<size_t> receivers;
92 std::vector<size_t> roots; // basin ID
93 std::vector<std::vector<size_t>> children;
94 std::vector<bool> outlets_mask;
95 mutable std::vector<size_t> cached_outlets;
96 mutable bool outlets_dirty = true;
97 int tick = 0;
98
99 // --- Traversal cache ---
100
101 std::unordered_map<size_t, std::vector<size_t>> traversals;
102
103 // --- Constants ---
104
105 const size_t invalid_index = size_t(-1);
106};
107
108// --- FUNCTIONS
109
110std::vector<size_t> find_border_minima(const std::vector<glm::vec3> &xyz,
111 float eps = 1e-6f);
112
113std::vector<size_t> find_border_sinks(TerrainTriMesh &mesh, float eps = 1e-6f);
114
115std::vector<glm::vec3> heightmap_retopology(const Array &z,
116 float max_error,
117 int max_triangles = 0,
118 int max_points = 0);
119
120std::vector<size_t> sample_border_points(const std::vector<glm::vec3> &xyz,
121 size_t nb);
122
123} // namespace hmap
Declaration of the Array class for 2D floating-point arrays with various mathematical operations and ...
Definition drainage_basin.hpp:22
std::vector< size_t > & get_outlets() const
Definition drainage_basin.cpp:375
void to_csv(const std::string &filename) const
Definition drainage_basin.cpp:561
std::pair< std::vector< size_t >, bool > find_subroots()
Definition drainage_basin.cpp:272
void invert_receiver_map()
Definition drainage_basin.cpp:399
std::vector< bool > compute_is_ridge_node() const
Definition drainage_basin.cpp:59
const std::vector< size_t > & get_receivers() const
Definition drainage_basin.cpp:389
auto for_each_downstream(size_t outlet) const
Definition drainage_basin.hpp:78
void compute_receivers()
Definition drainage_basin.cpp:81
float update_elevations(const std::vector< float > &response_times, float uplift_rate, const std::vector< float > &max_slope)
Definition drainage_basin.cpp:594
const std::vector< glm::vec3 > & get_xyz() const
Definition drainage_basin.cpp:394
void accumulate_area_by_outlet(const std::vector< float > &area, std::vector< float > &acc) const
Definition drainage_basin.cpp:41
void remap(float zmin=0.f, float zmax=1.f)
Definition drainage_basin.cpp:415
const std::vector< size_t > & for_each_upstream(size_t outlet) const
Definition drainage_basin.cpp:323
void remove_lakes(const std::vector< size_t > &subroot)
Definition drainage_basin.cpp:444
const TerrainTriMesh & get_mesh() const
Definition drainage_basin.cpp:365
std::vector< float > compute_vertex_areas() const
Definition drainage_basin.cpp:245
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:204
void update_traversals()
Definition drainage_basin.cpp:666
void set_outlets(const std::vector< size_t > &outlet_indices)
Definition drainage_basin.cpp:546
void update_stream_tree()
Definition drainage_basin.cpp:657
std::vector< size_t > compute_strahler_order() const
Definition drainage_basin.cpp:175
std::vector< std::vector< size_t > > get_main_channels() const
Definition drainage_basin.cpp:328
size_t size() const
Definition drainage_basin.cpp:556
Definition terrain_tri_mesh.hpp:20
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:871
std::vector< size_t > find_border_minima(const std::vector< glm::vec3 > &xyz, float eps=1e-6f)
Definition drainage_basin.cpp:706
std::vector< size_t > find_border_sinks(TerrainTriMesh &mesh, float eps=1e-6f)
Definition drainage_basin.cpp:765
std::vector< size_t > sample_border_points(const std::vector< glm::vec3 > &xyz, size_t nb)
Definition drainage_basin.cpp:811