Warning: session_start(): open(/var/lib/php/sessions/sess_tothg51tnq4tvdtbtiallmrbt3, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
// both the outer outline and the outline of a hole are called a "trace"
// should return outer outline first and then outline of holes
srecord noeq RegionBorder_innerPoints(BWImage_FastRegions regions, int iRegion) is Steppable {
event newTrace;
event traceDone;
event foundPoint(Pt p);
int w, x, y, dir;
BWImage_FastRegions.RegionIterator it;
BitSet seen;
bool tracing;
static Pt[] #directions = {
pt(1, 0), pt(0, 1), pt(-1, 0), pt(0, -1) // r, d, l, u
};
void init {
w = regions.w;
seen = new BitSet;
it = regions.regionIterator(iRegion);
}
public bool step() {
if (seen == null) init();
if (tracing) {
int pos = y*w+x;
if (seen.get(pos)) {
traceDone();
tracing = false;
true;
}
seen.set(pos);
foundPoint(x, y);
for (int turn = 3; turn <= 6; turn++) { // try left, straight, right, back
int newDir = (dir+turn) & 3;
Pt d = directions[newDir];
int x2 = x+d.x, y2 = y+d.y;
if (regions.inRegion(iRegion, x2, y2)) {
x = x2; y = y2; dir = newDir;
true;
}
}
true; // i think this ends the trace in next iteration
} else {
// search for border pixel
if (!it.next()) false; // done
x = it.x(); y = it.y();
// not a border pixel? continue search for border pixel
if (regions.inRegion(iRegion, x, y-1)
&& regions.inRegion(iRegion, x-1, y)
&& regions.inRegion(iRegion, x+1, y)
&& regions.inRegion(iRegion, x, y+1))
true;
//print("border pixel: " + x + "/" + y);
dir = 3; // start with direction up (any direction should do)
set tracing;
newTrace();
true;
}
}
void foundPoint(int x, int y) { foundPoint(pt(x, y)); }
}