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"
13
14namespace hmap
15{
16
18{
19public:
20 DrainageBasin(std::vector<glm::vec3> xyz_);
21
22 const std::vector<glm::vec3> &get_xyz() const;
23 size_t size() const;
24 void to_csv(const std::string &filename) const;
25
26 // --- Geometry / Mesh ---
27
28 const TerrainTriMesh &get_mesh() const;
30
31 std::vector<float> compute_vertex_areas() const;
32 void remap(float zmin = 0.f, float zmax = 1.f);
33
34 // --- Flow graph construction ---
35
36 void compute_receivers();
37 void compute_receivers(unsigned int seed, float noise_strength = 0.25f);
38 void update_stream_tree(unsigned int seed, float noise_strength);
39 void update_stream_tree();
40 void update_traversals();
41
42 std::vector<size_t> get_outlets() const;
43 void set_outlets(const std::vector<size_t> &outlet_indices);
44 const std::vector<size_t> &get_receivers() const;
45
46 // --- Basin topology utilities ---
47
48 std::vector<bool> compute_is_ridge_node() const;
49 std::vector<size_t> compute_strahler_order() const;
50 std::pair<std::vector<size_t>, bool> find_subroots();
51 std::vector<std::vector<size_t>> get_main_channels() const;
52 void remove_lakes(const std::vector<size_t> &subroot);
53
54 // --- Hydrology computations ---
55
56 std::vector<float> compute_response_times(
57 const std::vector<float> &area_acc,
58 const std::vector<float> &erodibility,
59 float m_exp) const;
60
61 float update_elevations(const std::vector<float> &response_times,
62 float uplift_rate,
63 const std::vector<float> &max_slope);
64
65 void accumulate_area_by_outlet(const std::vector<float> &area,
66 std::vector<float> &acc) const;
67
68 // --- Traversal helpers ---
69
70 const std::vector<size_t> &for_each_upstream(size_t outlet) const;
71
72 auto for_each_downstream(size_t outlet) const
73 {
74 const auto &t = traversals.at(outlet);
75 return std::make_pair(t.rbegin(), t.rend());
76 }
77
78private:
79 // --- Geometry ---
80
81 TerrainTriMesh mesh;
82
83 // --- Flow graph ---
84
85 std::vector<size_t> receivers;
86 std::vector<size_t> roots; // basin ID
87 std::vector<std::vector<size_t>> children;
88 std::vector<bool> outlets_mask;
89
90 // --- Traversal cache ---
91
92 std::unordered_map<size_t, std::vector<size_t>> traversals;
93
94 // --- Constants ---
95
96 const size_t invalid_index = size_t(-1);
97};
98
99// --- FUNCTIONS
100
101std::vector<size_t> find_border_minima(const std::vector<glm::vec3> &xyz,
102 float eps = 1e-6f);
103
104std::vector<size_t> find_border_sinks(TerrainTriMesh &mesh, 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:18
void to_csv(const std::string &filename) const
Definition drainage_basin.cpp:519
std::pair< std::vector< size_t >, bool > find_subroots()
Definition drainage_basin.cpp:254
std::vector< bool > compute_is_ridge_node() const
Definition drainage_basin.cpp:52
const std::vector< size_t > & get_receivers() const
Definition drainage_basin.cpp:364
auto for_each_downstream(size_t outlet) const
Definition drainage_basin.hpp:72
void compute_receivers()
Definition drainage_basin.cpp:74
std::vector< size_t > get_outlets() const
Definition drainage_basin.cpp:354
float update_elevations(const std::vector< float > &response_times, float uplift_rate, const std::vector< float > &max_slope)
Definition drainage_basin.cpp:552
const std::vector< glm::vec3 > & get_xyz() const
Definition drainage_basin.cpp:369
void accumulate_area_by_outlet(const std::vector< float > &area, std::vector< float > &acc) const
Definition drainage_basin.cpp:34
void remap(float zmin=0.f, float zmax=1.f)
Definition drainage_basin.cpp:374
const std::vector< size_t > & for_each_upstream(size_t outlet) const
Definition drainage_basin.cpp:302
void remove_lakes(const std::vector< size_t > &subroot)
Definition drainage_basin.cpp:403
const TerrainTriMesh & get_mesh() const
Definition drainage_basin.cpp:344
std::vector< float > compute_vertex_areas() const
Definition drainage_basin.cpp:227
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:186
void update_traversals()
Definition drainage_basin.cpp:622
void set_outlets(const std::vector< size_t > &outlet_indices)
Definition drainage_basin.cpp:506
void update_stream_tree()
Definition drainage_basin.cpp:613
std::vector< size_t > compute_strahler_order() const
Definition drainage_basin.cpp:157
std::vector< std::vector< size_t > > get_main_channels() const
Definition drainage_basin.cpp:307
size_t size() const
Definition drainage_basin.cpp:514
Definition terrain_tri_mesh.hpp:19
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:817
std::vector< size_t > find_border_minima(const std::vector< glm::vec3 > &xyz, float eps=1e-6f)
Definition drainage_basin.cpp:652
std::vector< std::vector< size_t > > invert_receiver_map(const std::vector< size_t > &receivers)
Definition drainage_basin.cpp:845
std::vector< size_t > find_border_sinks(TerrainTriMesh &mesh, float eps=1e-6f)
Definition drainage_basin.cpp:711
std::vector< size_t > sample_border_points(const std::vector< glm::vec3 > &xyz, size_t nb)
Definition drainage_basin.cpp:757