Not logged in.  Login/Logout/Register | List snippets | | Create snippet | Upload image | Upload data

53
LINES

< > BotCompany Repo | #1033938 // regionBorder_innerPoints - find region outline

JavaX fragment (include)

// should return outer outline first and then outline of holes
// (without a separator)

scope regionBorder_innerPoints.

static Pt[] #directions = {
  pt(1, 0), pt(0, 1), pt(-1, 0), pt(0, -1) // r, d, l, u
};

static L<Pt> 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(iRegion, x, y-1)
      && regions.inRegion(iRegion, x-1, y)
      && regions.inRegion(iRegion, x+1, y)
      && regions.inRegion(iRegion, x, y+1))
      continue;
  
    //print("border pixel: " + x + "/" + y);
    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(iRegion, x2, y2)) {
          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;
}

Author comment

Began life as a copy of #1033758

download  show line numbers  debug dex  old transpilations   

Travelled to 3 computer(s): bhatertpkbcr, mowyntqkapby, mqqgnosmbjvj

No comments. add comment

Snippet ID: #1033938
Snippet name: regionBorder_innerPoints - find region outline
Eternal ID of this version: #1033938/1
Text MD5: 5e5e608e36c5dde17023b6b166913c1b
Author: stefan
Category: javax
Type: JavaX fragment (include)
Public (visible to everyone): Yes
Archived (hidden from active list): No
Created/modified: 2022-01-14 14:41:01
Source code size: 1429 bytes / 53 lines
Pitched / IR pitched: No / No
Views / Downloads: 64 / 84
Referenced in: [show references]