srecord noeq G22SkeletonWalker(IImageRegion region) is Steppable { event foundLink(Pt a, Pt b); // point to "registered" point close by new Map ptMap; // TEMPORARY DATA bool initialized; // each pair is (registered point, point-to-explore) new LinkedList> queue; public bool step() { // find first pixel if (!initialized) { set initialized; Pt p = region.firstPixel(); if (p == null) false; queue.add(pair(null, p)); } if (empty(queue)) false; Pair pair = popFirst(queue); Pt prev = pair.a, p = pair.b; p = lookupOrKeep(ptMap, p); if (pair.a != null) { if (distantEnough(prev, p)) foundLink(prev, p); else ptMap.put(p, prev); } if (!ptMap.containsKey(p)) { ptMap.put(p, p); for (int dir = 1; dir <= 8; dir++) { Pt p2 = ptPlus(p, onePathDirection(dir)); if (region.contains(p2)) queue.add(pair(or(prev, p), p2)); } } true; } bool distantEnough(Pt a, Pt b) { ret a != null && b != null && (absDiff(a.x, b.x) >= 2 || absDiff(a.y, b.y) >= 2); } }