mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-09 03:17:08 +02:00
adds flood fill algorithm
This commit is contained in:
parent
403c9d9ce5
commit
ed8a14ee09
1 changed files with 96 additions and 0 deletions
96
shared/src/FloodFill.h
Normal file
96
shared/src/FloodFill.h
Normal file
|
@ -0,0 +1,96 @@
|
||||||
|
//
|
||||||
|
// FloodFill.h
|
||||||
|
// hifi
|
||||||
|
//
|
||||||
|
// Created by Tobias Schwinger 3/26/13.
|
||||||
|
// Copyright (c) 2013 High Fidelity, Inc. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef __hifi__FloodFill__
|
||||||
|
#define __hifi__FloodFill__
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Line scanning, iterative flood fill algorithm.
|
||||||
|
*/
|
||||||
|
template< class Strategy, typename Cursor >
|
||||||
|
void floodFill(Cursor const& position,
|
||||||
|
Strategy const& strategy = Strategy());
|
||||||
|
|
||||||
|
|
||||||
|
template< class Strategy, typename Cursor >
|
||||||
|
struct floodFill_impl : Strategy
|
||||||
|
{
|
||||||
|
floodFill_impl(Strategy const& s) : Strategy(s) { }
|
||||||
|
|
||||||
|
using Strategy::select;
|
||||||
|
using Strategy::process;
|
||||||
|
|
||||||
|
using Strategy::left;
|
||||||
|
using Strategy::right;
|
||||||
|
using Strategy::up;
|
||||||
|
using Strategy::down;
|
||||||
|
|
||||||
|
using Strategy::defer;
|
||||||
|
using Strategy::deferred;
|
||||||
|
|
||||||
|
void go(Cursor position)
|
||||||
|
{
|
||||||
|
Cursor higher, lower, h,l, i;
|
||||||
|
bool higher_found, lower_found, hf, lf;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (! select(position))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
process(position);
|
||||||
|
|
||||||
|
Cursor higher = position, lower = position;
|
||||||
|
bool higher_found = false;
|
||||||
|
bool lower_found = false;
|
||||||
|
up(higher); yTest(higher, higher_found);
|
||||||
|
down(lower); yTest(lower, lower_found);
|
||||||
|
|
||||||
|
i = position, h = higher, l = lower;
|
||||||
|
hf = higher_found, lf = lower_found;
|
||||||
|
do { right(i), right(h), right(l); yTest(h,hf); yTest(l,lf); }
|
||||||
|
while (selectAndProcess(i));
|
||||||
|
|
||||||
|
i = position, h = higher, l = lower;
|
||||||
|
hf = higher_found, lf = lower_found;
|
||||||
|
do { left(i); left(h); left(l); yTest(h,hf); yTest(l,lf); }
|
||||||
|
while (selectAndProcess(i));
|
||||||
|
}
|
||||||
|
while (deferred(position));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool selectAndProcess(Cursor const& i)
|
||||||
|
{
|
||||||
|
if (select(i))
|
||||||
|
{
|
||||||
|
process(i);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void yTest(Cursor const& i, bool& state)
|
||||||
|
{
|
||||||
|
if (! select(i))
|
||||||
|
state = false;
|
||||||
|
else if (! state)
|
||||||
|
{
|
||||||
|
state = true;
|
||||||
|
defer(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template< class Strategy, typename Cursor >
|
||||||
|
void floodFill(Cursor const& p, Strategy const& s)
|
||||||
|
{
|
||||||
|
floodFill_impl<Strategy,Cursor>(s).go(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue