@@ -320,6 +320,82 @@ std::pair<std::vector<size_t>, bool> DrainageBasin::find_subroots()
320320 return {subroot, has_lake};
321321}
322322
323+ void DrainageBasin::flow_breach ()
324+ {
325+ auto &pts = this ->mesh .get_points ();
326+
327+ for (const auto &[outlet, traversal] : this ->traversals )
328+ {
329+ if (traversal.empty ()) continue ;
330+
331+ // traversal is upstream -> downstream
332+ size_t p = traversal.front ();
333+ float zc = pts[p].z ; // current
334+
335+ // follow receivers downstream to outlet
336+ while (true )
337+ {
338+ const size_t &r = this ->receivers [p];
339+
340+ if (r == p) break ; // reached outlet
341+
342+ if (pts[p].z < zc)
343+ zc = pts[p].z ;
344+ else
345+ pts[p].z = zc;
346+
347+ p = r;
348+ }
349+ }
350+ }
351+
352+ std::vector<std::vector<glm::vec3>> DrainageBasin::flow_breach_paths ()
353+ {
354+ auto &pts = this ->mesh .get_points ();
355+
356+ std::vector<std::vector<glm::vec3>> paths;
357+ paths.reserve (this ->traversals .size ());
358+
359+ for (const auto &[outlet, traversal] : this ->traversals )
360+ {
361+ if (traversal.empty ())
362+ {
363+ paths.emplace_back ();
364+ continue ;
365+ }
366+
367+ std::vector<glm::vec3> path;
368+ path.reserve (traversal.size ());
369+
370+ // traversal is upstream -> downstream
371+ size_t p = traversal.front ();
372+ float zc = pts[p].z ; // current
373+
374+ path.push_back (pts[p]);
375+
376+ // follow receivers downstream to outlet
377+ while (true )
378+ {
379+ const size_t &r = this ->receivers [p];
380+
381+ if (r == p) break ; // reached outlet
382+
383+ if (pts[p].z < zc)
384+ zc = pts[p].z ;
385+ else
386+ pts[p].z = zc;
387+
388+ path.push_back (pts[p]);
389+
390+ p = r;
391+ }
392+
393+ paths.push_back (std::move (path));
394+ }
395+
396+ return paths;
397+ }
398+
323399const std::vector<size_t > &DrainageBasin::for_each_upstream (size_t outlet) const
324400{
325401 return traversals.at (outlet);
@@ -341,7 +417,7 @@ std::vector<std::vector<size_t>> DrainageBasin::get_main_channels() const
341417 std::vector<size_t > channel;
342418 channel.reserve (traversal.size ());
343419
344- // traversal is upstream -> downstream
420+ // traversal is downstream -> upstream
345421 size_t p = traversal.front ();
346422 channel.push_back (p);
347423
0 commit comments