Warning: session_start(): open(/var/lib/php/sessions/sess_bh3ins5phst0euvc5fq6hs3sao, 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
scope regionBorder_innerPoints.
static Pt[] #directions = {
pt(1, 0), pt(0, 1), pt(-1, 0), pt(0, -1) // r, d, l, u
};
static L regionBorder_innerPoints(BWImage_FastRegions regions, int iRegion) {
new PtBuffer out;
int w = regions.w;
var it = regions.regionIterator(iRegion);
new BitSet seen;
while (it.next()) {
int x = it.x(), y = it.y();
// is it a border pixel?
if (regions.inRegion(x, y-1, iRegion)
&& regions.inRegion(x-1, y, iRegion)
&& regions.inRegion(x+1, y, iRegion)
&& regions.inRegion(x, y+1, iRegion))
continue;
int dir = 3; // start with direction up (any direction should do)
loop: while (true) {
int pos = y*w+x;
if (seen.get(pos))
break;
seen.set(pos);
out.add(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(x2, y2, iRegion)) {
x = x2; y = y2; dir = newDir;
continue loop;
}
}
// if we get here, the region is just 1 pixel (so we're done)
break;
}
}
ret out;
}